ロック画面からメディアプレイヤーをコントロールする


Android 4.0でサポートされたRemoteControlClientを利用すると
オリジナルのメディアプレイヤーと連携して端末のロック画面から音楽ファイルの再生/停止、
早送り/巻き戻しなどが行うことができるようになります。

上の図のように、ロック画面上に表示される制御パネルをリモートコントロールと呼びます。
このリモートコントロール上には再生中の音楽ファイルの曲名やアーティスト名などの情報も
表示することができます。

オリジナルのメディアプレイヤーでリモートコントロールを利用するためのステップは以下のようになります。

  • ACTION_MEDIA_BUTTONインテントを処理するBroadcastReceiverを登録する
  • RemoteControlClientを生成してシステムに登録する
  • サポートするメディア制御処理を設定する
  • リモートコントロール上に表示するメディア情報を設定する

それでは続きから詳しく説明していきます。

ACTION_MEDIA_BUTTONインテントを処理するBroadcastReceiverを登録する

リモートコントロール上のメディア制御ボタンが押されると
ACTION_MEDIA_BUTTONイベントが送信されます。

このACTION_MEDIA_BUTTONインテントを処理するBroadcastReceiverを
AudioManagerクラスのregisterMediaButtonEventReceiverメソッド
使ってシステムに登録します。

■MusicService.java

// AudioManagerオブジェクトを取得する
AudioManager myAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

// BroadcastReceiverのコンポーネント名を取得する
ComponentName myEventReceiver =
	new ComponentName(getPackageName(), MyRemoteControlEventReceiver.class.getName());

// BroadcastReceiverをシステムに登録する
myAudioManager.registerMediaButtonEventReceiver(myEventReceiver);

RemoteControlClientを生成してシステムに登録する

次にリモートコントロール上のメディア制御ボタンが押されたときに
送信されるPendingIntentを作成します。

このPendingIntentをRemoteControlClientのインスタンスを生成するときに
コンストラクタで渡して、registerRemoteControlClientメソッド
RemoteControlClientをシステムに登録します。

■MusicService.java

// RemoteControlClientの為にPendingIntentを作成する
Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
mediaButtonIntent.setComponent(myEventReceiver);
PendingIntent mediaPendingIntent =
	PendingIntent.getBroadcast(getApplicationContext(), 0, mediaButtonIntent, 0);

// RemoteControlClientを生成し、PendingIntentを設定する
RemoteControlClient myRemoteControlClient = new RemoteControlClient(mediaPendingIntent);

// RemoteControlClientをシステムに登録する
myAudioManager.registerRemoteControlClient(myRemoteControlClient);

サポートするメディア制御処理を設定する

リモートコントロール上で実行されるメディア制御処理に対して
オリジナルのメディアプレイヤーが対応できるものを設定しておきます。

この設定はsetTransportControlFlagsメソッドで行います。

public void setTransportControlFlags (int transportControlFlags)

具体的には以下のように設定します。

■MusicService.java

myRemoteControlClient.setTransportControlFlags(
                    RemoteControlClient.FLAG_KEY_MEDIA_PLAY |
                    RemoteControlClient.FLAG_KEY_MEDIA_PAUSE |
                    RemoteControlClient.FLAG_KEY_MEDIA_NEXT |
                    RemoteControlClient.FLAG_KEY_MEDIA_STOP);

リモートコントロール上に表示するメディア情報を設定する

リモートコントロール上に再生中の音楽ファイルのメディア情報を設定するには
editMetadataメソッドを使います。

■MusicService.java

myRemoteControlClient.editMetadata(true)
                    .putString(MediaMetadataRetriever.METADATA_KEY_ARTIST, playingItem.getArtist())
                    .putString(MediaMetadataRetriever.METADATA_KEY_ALBUM, playingItem.getAlbum())
                    .putString(MediaMetadataRetriever.METADATA_KEY_TITLE, playingItem.getTitle())
                    .apply();

MediaMetadataRetrieverクラスで定義されているメタ情報を表示設定することができます。
利用可能なメタ情報についてはドキュメントをご確認下さい。

メディアプレイヤーの実装も含めたサンプルがAndroid Developersにて
公開されています。具体的な実装例はこちらをご参照下さい。
http://developer.android.com/resources/samples/RandomMusicPlayer/index.html