3

私は音楽プレーヤーを構築しており、現在ロックスクリーン メディア コントロールと再生情報を実装しようとしています。私の最初の試みは RemoteControlClient でしたが、このメソッドは推奨されておらず、解決できないバグに遭遇しました。そこで、MediaSessionCompat クラスに切り替えようとしましたが、メディア コントロールが表示されない以外はすべて機能します。

    ComponentName eventReceiver = new ComponentName(getPackageName(), RemoteMediaReceiver.class.getName());
    Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
    mediaButtonIntent.setComponent(eventReceiver);
    PendingIntent mediaPendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, mediaButtonIntent, 0);
    mediaSession = new MediaSessionCompat(this, "TAG", eventReceiver, mediaPendingIntent);
    mediaSession.setCallback(new MediaSessionCompat.Callback() {
        @Override
        public boolean onMediaButtonEvent(Intent mediaButtonEvent) {
            Log.d("MediaSession", "onMediaButtonEvent");
            return super.onMediaButtonEvent(mediaButtonEvent);
        }

        @Override
        public void onPlay() {
            Log.d("MediaSession", "onPlay");
            super.onPlay();
        }

        @Override
        public void onPause() {
            Log.d("MediaSession", "onPause");
            super.onPause();
        }

        @Override
        public void onSkipToNext() {
            Log.d("MediaSession", "onSkipToNext");
            super.onSkipToNext();
        }

        @Override
        public void onSkipToPrevious() {
            Log.d("MediaSession", "onSkipToPrevious");
            super.onSkipToPrevious();
        }

        @Override
        public void onSeekTo(long pos) {
            Log.d("MediaSession", String.format("onSeekTo %d", pos));
            super.onSeekTo(pos);
        }

        @Override
        public void onStop() {
            Log.d("MediaSession", "onStop");
            super.onStop();
        }
    });
    mediaSession.setPlaybackState(playbackState(PlaybackStateCompat.STATE_STOPPED, PlaybackStateCompat.PLAYBACK_POSITION_UNKNOWN, 0));
    mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);

これは、メディア セッションをセットアップする方法であり、その状態とメタデータを更新するヘルパー メソッドがあります。

public void start(){
    mControl.setPlaying(true);
    notify(State.PLAY);
    if(!audioFocus) requestFocus();
    //remoteCC.setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYING, mp.getCurrentPosition(), 1.0f);
    mediaSession.setPlaybackState(playbackState(PlaybackStateCompat.STATE_PLAYING, mp.getCurrentPosition(), 1));
    mediaSession.setActive(true);
    mp.start();
}
public void pause(){
    mControl.setPlaying(false);
    notify(State.PAUSE);
    //remoteCC.setPlaybackState(RemoteControlClient.PLAYSTATE_PAUSED);
    mediaSession.setPlaybackState(playbackState(PlaybackStateCompat.STATE_PAUSED, mp.getCurrentPosition(), 0));
    mediaSession.setActive(true);
    mp.pause();
}
public void mediaSessionNewSong(){
    Song song = mControl.getSongSet().safeCurrent();
    Bitmap bitmap = AlbumArtCache.instance().get(song.album_id);
    if(bitmap == null) bitmap = AlbumArtCache.instance().get(-1);
    MediaMetadataCompat.Builder metadata = new MediaMetadataCompat.Builder();
    metadata.putString(MediaMetadataCompat.METADATA_KEY_ALBUM, song.album);
    metadata.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, song.artist);
    metadata.putLong(MediaMetadataCompat.METADATA_KEY_TRACK_NUMBER, song.track);
    metadata.putString(MediaMetadataCompat.METADATA_KEY_TITLE, song.title);
    metadata.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, song.duration);
    metadata.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, bitmap.copy(bitmap.getConfig(), false));
    mediaSession.setMetadata(metadata.build());
    mediaSession.setActive(true);
}

キッカーは、getRemoteControlClient() を使用して RemoteControlClient を手動で取得し、トランスポート コントロール フラグを設定してボタンを表示させることができますが、提供されたコールバック クラスを使用せず、eventReceiver を使用し、私が持っていたバグに遭遇しました。私の元の RemoteClientControl 実装で。何が表示されないのですか? 私が読んだすべてのドキュメントと私が見た他のSOの質問は、これが機能することを示唆しています。

編集: はい、申し訳ありませんが、コードベースが大きいため、すべてのヘルパー メソッドを忘れてしまいました

public PlaybackStateCompat playbackState(int state, long position, float playbackSpeed){
    return new PlaybackStateCompat.Builder()
            .setActions(PlaybackStateCompat.ACTION_PLAY_PAUSE | PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS | PlaybackStateCompat.ACTION_SKIP_TO_NEXT | PlaybackStateCompat.ACTION_SEEK_TO)
            .setState(state, position, playbackSpeed)
            .build();
}

ライブラリを 22.0.0 から 22.2.1 に更新し、ボタンが表示されるようになりました (進行状況 :D) が、リモート クライアント コントロールが MediaSession のコールバックの代わりに eventReceiver を使用しているように見えます。期待される。

4

0 に答える 0