Audio player delays playing next song in lock mode

Viewed 13
  1. **> 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

}
0 Answers
Related