- **> The audio player delays playing the next song in lock mode
When you press the power button, the next song will also be played when the phone is connected to Android Studio and it works without problems
> Is there any solution ??**
I tried to add more codes and it doesn't work?
IBinder myBinder = new MyBinder();
MediaPlayer mediaPlayer ;
public static ArrayList<MusicFiles> musicFiles = new ArrayList<>();
public static int position = -1;
ActionPlaying actionPlaying;
MediaSessionCompat mediaSessionCompat;
public static final String MUSIC_LAST_PLAYED = "LAST_PLAYED";
public static final String ARTIST_NAME = "ARTIST NAME";
public static final String SONG_NAME = "SONG NAME";
public static final String SONG_POSITION = "position";
static int myPosition;
NotificationManager notificationManager;
int NOTIFICATION_ID = 111;
String actionName;
Notification notification;
public static boolean PAUSE_BY_USER = false;
public static boolean STATE_BY_CANCEL = false;
public static boolean STATE_LOSS = false;
public static boolean STATE_LOW_GAIN = false;
AudioManager audioManager;
AudioAttributes playbackAttributes;
AudioFocusRequest focusRequest;
int audioFocusRequest;
@Override
public void onCreate() {
super.onCreate();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
AudioManager.OnAudioFocusChangeListener audioFocusChangeListener = focusChange -> {
switch (focusChange){
case AudioManager.AUDIOFOCUS_GAIN:
// Toast.makeText(MusicService.this, ">>>>1- AUDIO_FOCUS_GAIN", Toast.LENGTH_SHORT).show();
if (STATE_BY_CANCEL & !PAUSE_BY_USER) {
Log.i("TAG", "11- if: 1 " + STATE_LOSS);
mediaPlayer.start();
playPauseBtn.setImageResource(R.drawable.ic_pause);
playPauseBtn_small.setImageResource(R.drawable.ic_pause);
showNotification(R.drawable.ic_pause);
Log.i("TAG", "1- if: 1 ");
}
if (!STATE_BY_CANCEL & !PAUSE_BY_USER) {
start();
showNotification(R.drawable.ic_pause);
Log.i("TAG", "2- if: 2 " + STATE_LOSS);
playPauseBtn.setImageResource(R.drawable.ic_pause);
playPauseBtn_small.setImageResource(R.drawable.ic_pause);
}
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
// Toast.makeText(MusicService.this, ">>>>>2- AUDIO_FOCUS_LOSS_TRANSIENT", Toast.LENGTH_SHORT).show();
if (mediaPlayer.isPlaying()){
mediaPlayer.pause();
playPauseBtn.setImageResource(R.drawable.ic_play);
playPauseBtn_small.setImageResource(R.drawable.ic_play);
showNotification(R.drawable.ic_play);
Log.i("TAG", "4- pause ring");
}
break;
case AudioManager.AUDIOFOCUS_LOSS:
// mediaPlayer.release();
STATE_LOSS = true;
if (mediaPlayer.isPlaying()){
pause();
hideNotification();
// Toast.makeText(MusicService.this, ">>>>>3- AUDIO_FOCUS_LOSS", Toast.LENGTH_SHORT).show();
Log.i("TAG", "6- Loss");
}
break;
}
};
// get the audio system service for
// the audioManger instance
audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
// initiate the audio playback attributes
playbackAttributes = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_GAME)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build();
// set the playback attributes for the focus requester
focusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
.setAudioAttributes(playbackAttributes)
.setAcceptsDelayedFocusGain(true)
.setOnAudioFocusChangeListener(audioFocusChangeListener)
.build();
// request the audio focus and
// store it in the int variable
audioFocusRequest = audioManager.requestAudioFocus(focusRequest);
}else {
foucase_Change_Under_Api();
}
} // End On Create
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.e("Bind","Method");
return myBinder;
}
public class MyBinder extends Binder {
MusicService getService() {
return MusicService.this;
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("message", ">? " + flags);
myPosition = intent.getIntExtra("servicePosition", -1);
actionName = intent.getStringExtra("actionName");
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// mediaSessionCompat = new MediaSessionCompat(getApplicationContext(), "My Audio");
ComponentName mediaButtonReceiver = new ComponentName(getApplicationContext(), MediaButtonReceiver.class);
mediaSessionCompat = new MediaSessionCompat(getApplicationContext(), "My Audio", mediaButtonReceiver, null);
mediaSessionCompat.setFlags(MediaSessionCompat.FLAG_HANDLES_QUEUE_COMMANDS);
Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
mediaButtonIntent.setClass(this, MediaButtonReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, mediaButtonIntent, flags);
mediaSessionCompat.setMediaButtonReceiver(pendingIntent);
Log.i("message", "if_" + flags +" >> " + mediaButtonIntent);
}else {
Log.i("message", "else_");
}
} catch (Exception e) {
e.printStackTrace();
mediaSessionCompat = new MediaSessionCompat(getApplicationContext(), "My Audio");
Log.i("message", "Exception_");
}
if (myPosition != -1){
playMedia(myPosition);
}
if (actionName != null){
switch (actionName){
case "playPause":
if (actionPlaying != null) {
Log.e("Inside", "Action");
actionPlaying.playPauseBtnClick();
}
break;
case "next":
// Toast.makeText(this, "Next", Toast.LENGTH_SHORT).show();
if (actionPlaying != null){
Log.e("Inside","Action");
actionPlaying.nextBtnClick();
}
break;
case "previous":
// Toast.makeText(this, "Previous", Toast.LENGTH_SHORT).show();
if (actionPlaying != null){
Log.e("Inside","Action");
actionPlaying.prevBtnClick();
}
break;
case "cancel":
// Toast.makeText(this, "cancel", Toast.LENGTH_SHORT).show();
if (actionPlaying != null){
Log.e("Inside","Action");
actionPlaying.cancelBtnClick();
hideNotification();
}
break;
}
}
// return super.onStartCommand(intent, flags, startId);
return START_NOT_STICKY;
}
private void playMedia(int startPosition) {
position = startPosition;
play media after check mediastrong textplayer
if (mediaPlayer != null){
Log.i("Test", "void PlayMedia : media != null " + position);
mediaPlayer.stop();
release();
if (musicFiles != null){
creatMediaPlayer(position);
mediaPlayer.start();
OnCompleted();
}
}else {
creatMediaPlayer(position);
mediaPlayer.start();
OnCompleted();
Log.i("Test", "void PlayMedia : media == null " + position);
}
}
void start(){
mediaPlayer.start();
}
void pause(){
mediaPlayer.pause();
}
boolean isPlaying(){
return mediaPlayer.isPlaying();
}
void stop(){
mediaPlayer.stop();
}
void release(){
mediaPlayer.reset();
mediaPlayer.release();
mediaPlayer = null;
}
int getDuration(){
return mediaPlayer.getDuration();
}
void seekTo(int position){
mediaPlayer.seekTo(position);
}
int getCurrentPosition(){
return mediaPlayer.getCurrentPosition();
}
void creatMediaPlayer(int positionInner){
musicFiles = MainActivity.musicFiles;
position = positionInner;
// uri = Uri.parse("android.resource://" + getPackageName() + "/" + musicFiles.get(position).getPath());
SharedPreferences.Editor editor = getSharedPreferences(MUSIC_LAST_PLAYED, MODE_PRIVATE).edit();
// editor.putInt(MUSIC_FILE, musicFiles.get(position).getPath());
editor.putString(ARTIST_NAME, musicFiles.get(position).getArtist());
editor.putString(SONG_NAME, musicFiles.get(position).getTitle());
editor.putInt(SONG_POSITION, position);
editor.apply();
mediaPlayer = MediaPlayer.create(this, musicFiles.get(position).getPath());
}
void OnCompleted(){
mediaPlayer.setOnCompletionListener(this);
}
@Override
public void onCompletion(MediaPlayer mp) {
Log.i("Test: ", "onCompletion: >>>> " + position);
if (actionPlaying != null) {
actionPlaying.nextBtnClick();
Log.i("Test: ", "onCompletion: actionPlaying OK " + position);
if (mediaPlayer != null){
// creatMediaPlayer(position);
mediaPlayer.start();
// OnCompleted();
Log.i("Test: ", "onCompletion: Media ok " + position);
if (isPlaying()){
Log.i("Test: ", "onCompletion: Is Playing " + position);
// Toast.makeText(this, "isCOm", Toast.LENGTH_SHORT).show();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
showNotification(R.drawable.ic_pause);
}
playPauseBtn.setImageResource(R.drawable.ic_pause);
playPauseBtn_small.setImageResource(R.drawable.ic_pause);
}else {
// Toast.makeText(this, "is22Com", Toast.LENGTH_SHORT).show();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
showNotification(R.drawable.ic_play);
}
playPauseBtn.setImageResource(R.drawable.ic_play);
playPauseBtn_small.setImageResource(R.drawable.ic_play);
}
SONG_POSITION_FLAG=position;
}
}
}
void setCallBack(ActionPlaying actionPlaying){
this.actionPlaying = actionPlaying;
}
void showNotification(int playPauseBtn ){
// Intent intent = new Intent(this,PlayerActivity.class);
notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Intent prevIntent = new Intent(this, NotificationReceiver.class)
.setAction(ACTION_PREVIOUS);
PendingIntent prevPending = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
prevPending = getBroadcast(this,0,prevIntent
, FLAG_IMMUTABLE);
}
Intent pauseIntent = new Intent(this,NotificationReceiver.class)
.setAction(ACTION_PLAY);
PendingIntent pausePending = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
pausePending = getBroadcast(this,0,pauseIntent
, FLAG_IMMUTABLE );
}
Intent nextIntent = new Intent(this,NotificationReceiver.class)
.setAction(ACTION_NEXT);
PendingIntent nextPending = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
nextPending = getBroadcast(this,0,nextIntent
, FLAG_IMMUTABLE);
}
Intent cancelIntent = new Intent(this,NotificationReceiver.class)
.setAction(ACTION_CANCEL);
PendingIntent cancelPending = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
cancelPending = getBroadcast(this,0,cancelIntent
, FLAG_IMMUTABLE);
}
// img notification
Bitmap icon = BitmapFactory.decodeResource(getResources(), R.drawable.hero2);
notification = new NotificationCompat.Builder(this,CHANNEL_ID_1)
.setSmallIcon(playPauseBtn)
.setLargeIcon(icon)
.setContentTitle(musicFiles.get(position).getTitle())
.setContentText(musicFiles.get(position).getArtist())
.addAction(R.drawable.ic_skip_previous,"Previous",prevPending)
.addAction(playPauseBtn,"Pause",pausePending)
.addAction(R.drawable.ic_skip_next,"Next",nextPending)
.addAction(R.drawable.ic_close_notif,"cancel",cancelPending)
.setStyle(new androidx.media.app.NotificationCompat.MediaStyle()
.setMediaSession(mediaSessionCompat.getSessionToken()))
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setOnlyAlertOnce(true)
.setAutoCancel(true)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.build();
startForeground(NOTIFICATION_ID,notification);
}
@Override
public void onTaskRemoved(Intent rootIntent) {
Log.i("sss", "removed ");
/// stopForeground(true);
// Toast.makeText(this, "onTaskRemoved", Toast.LENGTH_SHORT).show();
super.onTaskRemoved(rootIntent);
}
public void hideNotification() {
notificationManager.cancel(NOTIFICATION_ID);
stopForeground(true);
}
@Override
public void onDestroy() {
Log.i("sss","onDestroy");
// Toast.makeText(this, "onDestroy", Toast.LENGTH_SHORT).show();
super.onDestroy();
}
@Override
public void onAudioFocusChange(int focusChange) {
// Toast.makeText(this, "onAudioFocusChange _ Small Player", Toast.LENGTH_SHORT).show();
switch (focusChange){
case AudioManager.AUDIOFOCUS_GAIN:
STATE_LOW_GAIN = false;
// Toast.makeText(MusicService.this, "1- AUDIO_FOCUS_GAIN", Toast.LENGTH_SHORT).show();
if (STATE_BY_CANCEL & !PAUSE_BY_USER) {
Log.i("TAG", "11- if: 1 ");
mediaPlayer.start();
playPauseBtn.setImageResource(R.drawable.ic_pause);
playPauseBtn_small.setImageResource(R.drawable.ic_pause);
Log.i("TAG", "1- if: 1 ");
}
if (!STATE_BY_CANCEL & !PAUSE_BY_USER) {
start();
Log.i("TAG", "2- if: 2 ");
playPauseBtn.setImageResource(R.drawable.ic_pause);
playPauseBtn_small.setImageResource(R.drawable.ic_pause);
}
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
// Toast.makeText(MusicService.this, "2- AUDIO_FOCUS_LOSS_TRANSIENT", Toast.LENGTH_SHORT).show();
if (mediaPlayer.isPlaying()){
mediaPlayer.pause();
playPauseBtn.setImageResource(R.drawable.ic_play);
playPauseBtn_small.setImageResource(R.drawable.ic_play);
Log.i("TAG", "4- pause ring");
}
break;
case AudioManager.AUDIOFOCUS_LOSS:
// mediaPlayer.release();
STATE_LOSS = true;
if (mediaPlayer.isPlaying()){
pause();
// Toast.makeText(MusicService.this, "3- AUDIO_FOCUS_LOSS", Toast.LENGTH_SHORT).show();
STATE_LOW_GAIN = true;
}
break;
}
}
public void foucase_Change_Under_Api() {
// get the audio system service for
// the audioManger instance
// initiate the audio playback attributes
audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
// set the playback attributes for the focus requester
}