也许 Headers 不够明确,让我解释一下 .

我正在开发一个已经存在的代码,Java for Android app . 实际的应用程序有一个媒体播放器播放音频流,在布局中只有一个播放/暂停按钮 . 播放已初始化并用于活动 . 当手机被锁定时,流继续播放,但没有通知显示下一个上一个等按钮 .

当我从活动中调用此服务时,使用this tutorial我设法在锁定屏幕和通知区域上显示通知:

Intent intent = new Intent(getApplicationContext(), MediaPlayerService.class);
intent.setAction(MediaPlayerService.ACTION_PAUSE);
startService(intent);

但它显然不能很好地工作,因为现有的会话没有链接到通知上新创建的控制器 .

所以我想知道它是否更好:

  • 使用我创建的新服务并尝试将其链接到现有会话

  • 从活动中提取上一个媒体播放器并处理所有正在使用的媒体内容

  • 保持活动中的所有媒体处理

我对Android中的媒体处理不是很熟悉 .

以下是实际代码的一些预览:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_exercices);

    setFinishOnTouchOutside(false);
    mContext = this;


    // Init of MediaSession
    //mSession = new MediaSessionCompat(this, "MusicService");
    //mSession.setCallback(new MediaSessionCallback());
    //mSession.setFlags(MediaSession.FLAG_HANDLES_MEDIA_BUTTONS | MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS);
    //setSessionToken(mSession.getSessionToken());


    mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
    mRemoteControlResponder = new ComponentName(getPackageName(),
            RemoteControlReceiver.class.getName());

    mStateBuilder = new PlaybackStateCompat.Builder()
                    .setActions(
                            PlaybackStateCompat.ACTION_PLAY |
                                    PlaybackStateCompat.ACTION_PLAY_PAUSE);

    initializeViews();
    initializeActions();
}


 public void initializeActions() {


        recyclerExercisesView.setLayoutManager(new LinearLayoutManager(mContext));
        pAdapterExercise = new ExercisesPlayerAdapter(mContext, allExercisesList, isGuest, new ExercisesPlayerAdapter.RecyclerItemClickListener() {
            @Override
            public void onClickListener(Exercise exercice, int position) {
                //Toast.makeText(DetailsSceanceActivity.this, exercice.getPath(), Toast.LENGTH_SHORT).show();
                iv_play.setEnabled(true);
                seekBar_progress.setEnabled(true);

                if (!chronoLaunch && firstLaunch) {
                    startChrono();
                    startSensors();
                }
                firstLaunch = false;
                changeSelectedExercice(position);
                prepareExercise(exercice);
            }
        });
        recyclerExercisesView.setAdapter(pAdapterExercise);


        mMediaController = new MediaController(this);


        Intent intent = new Intent(getApplicationContext(), MediaPlayerService.class);
        intent.setAction(MediaPlayerService.ACTION_PAUSE);
        startService(intent);

        // inint mediaplayer
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                // play song
                togglePlay(mp);
                //mMediaController.setMediaPlayer(this);
            }
        });

 }

我还看到了几个使用MediaSessionCompat的样本 . 更好地使用MediaSession或MediaSessionCompat?

谢谢