新しいメディアコントロール API
日本語が不自由なタイトルのように思えて仕方がありませんが、Lollipop になって以降、メディア(オーディオやビデオなど)コントロールに関して API が刷新されました。
主な新しい API は以下のとおりです。
これにともなって、いくつかの API が @Deprecated
となっています。
@Deprecated
となった API は、新しいバージョンでは自動的に新しい API を使うような動作になるため、置き換えるコストは低いようですが、一部機能的に廃止されたもの(ロックスクリーン上での再生コントロール等)もありますので、順次移行していく必要があります。
新 API が提供するもの
新しい API は、Android Auto や Android Wear、Android TV との連携を目的として設計されています。新しい API を組み込むことによって、多種多様なデバイスで統一された UX を提供できるようになっています。
それぞれ、新しい API のクラスごとにどんなことができるのか見ていきます。
MediaBrowser
MediaBrowser は Android Auto に対してアプリが持っているメディアコンテンツへのアクセスを提供します(これは MediaBrowserService と連携して行われます)。パッケージや署名が正しければ(あるいは、コンテンツを持っているアプリがそれらを見て許可するならば)、普通のアプリケーションも MediaBrowser を使用してそのコンテンツにアクセスすることが出来ます。
SDK には、Android Auto のシミュレータが付属しており、MediaBrowserService を実装しているアプリが一覧表示されます。そこから各アプリが持っているメディアコンテンツをブラウジングし、実際の再生コントロールもできるようになっています。また、GitHub には MediaBrowserService の実装サンプルも公開されています。
MediaController
MediaController は専用のプレイバックコントロールアプリや Android Wear、Android TV からメディアコンテンツをコントロールするためのメソッドを提供します。MediaController.TransportControls はその直感的なメソッドを持っており、再生、停止などのコントロールを行うことが出来ます。また、再生コントロールに必要な情報(停止中か、再生中か等)も MediaController を介して取得することになります。
実際にプレイバックコントロールを MediaController を介して行うには、トークンが必要になります。これは、以下で説明する MediaSession が持っています。MediaBrowser 経由でもトークンが取得でき、Android Auto はそこから取得したトークンを元に MediaController を生成して動かしているようです。
MediaSession
MediaController による操作をハンドリングするのが MediaSession の役目です。MediaController は、MediaSession がもつ正当なトークンをもとにして操作を行います。ですから、トークンを持たないアプリからの操作はできないようになっています。
Notification.MediaStyle
Notification.MediaStyle は、通知上でメディアコントロールを行うための特別なスタイルです。Lollipop 以後、ロックスクリーンに通知が表示されるようになっていますので、通知の仕組みの上でメディアコントロールができるようになります。
Notification.MediaStyle は、メディアコントロールに必要なレイアウトを内包しています。つまり、自分自身で特別な UI を組み込まなくても、通知上にコントロールの UI が作り出されます。通知からのメディアコントロールは MediaController によって行われます。これまで PendingIntent 等でコントロールしていた部分はすべて、MediaController と MediaSession の仕組みに統一できるようになります。
まとめ
MediaSession、MediaController、MediaBrowser、そして Notification.MediaStyle はすべて、統一された仕組みで動きます。独自に色々な仕組みを組み込む必要がなく、フレームワークの上で必要なコードを書くだけで様々なデバイスの上でメディアコントロールが実現できます。