1

也许标题不够明确,让我解释一下。

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

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

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?

谢谢

4

0 回答 0