アプリへの統合を容易に行えるようにするため、一般に使用されているさまざまなメディアタイプの再生をサポートしています。エクスペリエンスが得られるようユーザーおよびシステムとやりとりを行うメディア再生アプリの作成方法を説明します。音声データは標準出力デバイスでのみ再生できます。通話中に音声ファイルを再生して会話の音声にすることはできません。フレームワークでの音声と動画の再生には、次のクラスを使用します。AudioManagerこのクラスは、デバイスの音声ソースと音声出力の管理に使用します。使用するアプリの開発を始める前に、関連機能を使えるようにするための宣言がマニフェストに含まれていることを確認してください。アクセスを要求する必要があります。メソッドを使用したりする場合は、この権限を要求する必要があります。フレームワークの重要なコンポーネントです。このクラスのオブジェクトを使用すると、音声と動画の両方のフェッチ、デコード、再生を最小限の設定で行えます。次のような複数のメディアソースをサポートしています。サポートするメディア形式の一覧については、サポートされるメディア形式のページをご覧ください。ディレクトリに保存されている)を再生する方法の例を示します。youここで、「生」リソースとは、システムにより特定の方法でパースされないファイルのことです。リソースの内容は生の音声であってはなりません。ファイルである必要があります。リゾルバから取得したもの)から再生する方法は次のとおりです。ストリーミングで再生する方法は次のとおりです。ダウンロード可能でなければなりません。使い方は、原則的には簡単です。アプリと適切に統合するには、さらにいくつかの注意事項があります。呼び出しは、メディアデータのフェッチとデコードを伴う可能性があるため、実行に時間がかかる場合があります。スレッドから呼び出さないようにしなければなりません。ANR(アプリケーション応答なし)エラーを招く可能性があるためです。秒以上かかると顕著な一時停止が発生すること、ユーザーに遅いアプリという印象を与えることを忘れないでください。準備を行い、完了したらメインスレッドに通知するようにします。このスレッド処理のロジックは、自分で記述することもできます。メソッドが用意されており、これを使用するほうが便利です。このメソッドは、バックグラウンドでメディアの準備を開始すると、すぐに戻ってきます。メソッドが呼び出されます。ついてもう一つ忘れてはならないのが、状態ベースであるという点です。操作によっては、プレーヤーが特定の状態のときにのみ有効になります。内部状態を意識する必要があります。状態に適さない操作を行うと、システムから例外がスローされるなど、望ましくない動作が発生する可能性があります。状態がどのメソッドによりどう変わるかがわかるようになっています。「アイドル」状態です。呼び出して初期化する必要がありますが、それにより「初期化済み」状態になります。メソッドを使用して準備する必要があります。呼び出してメディアを再生できます。各状態間を行き来できます。呼び出すことはできません。状態に合わないメソッドの呼び出しは、よく見られるバグです。オブジェクトを操作するコードを記述する際は、常に状態遷移図を念頭に置いてください。リソースを消費しうるものです。インスタンスが必要以上に長く存在することのないよう、常に特別な措置を講じなければなりません。リソースが適切に解放されるようにする必要があります。解放する必要があります。アクティビティとユーザーとの間にやりとりがない間、これを保持しておく意味はあまりないからです(バックグラウンドでメディアを再生している場合を除きます。これについては次のセクションで説明します)。新たに作成してもう一度準備を行う必要があります。解放と無効化は次のように行います。アクティビティ停止時に解放し忘れ、アクティビティ再開時に新しく作成した場合に起こりうる問題を考えてみましょう。ご存知のように、ユーザーが画面の向きを変更する(またはそのようにデバイス設定を変更する)と、その処理のためにシステムによってアクティビティが再起動されます(デフォルトの場合)。リソースが一度に消費されることになります。解放されず、新たに作成されるためです。ランタイムの再起動の詳細については、構成の変更を処理するをご覧ください。メディア」の再生を続けたい場合はどうすればよいか、という疑問が生じるかもしれません。インスタンスを制御する必要があります。サーバーのセットアップには注意が必要です。サービスで実行されるプレーヤーと、システムの他の部分とのやりとりの方法に、いくつかの前提があるためです。エクスペリエンスが低下する可能性があります。アプリの作成をご覧ください。管理する際の特別な手順について説明します。内の作業はデフォルトですべて単一のスレッドで行われるということです。実際に、アクティビティとサービスを同じアプリから実行すると、デフォルトでは両方とも同じスレッド(「メインスレッド」)を使用します。そのため、サービスでは受信インテントを迅速に処理し、応答に時間がかかる計算は行わないようにする必要があります。負荷の高い作業や進行を妨げる呼び出しになると予測されるタスクは、非同期で実行する必要があります。フレームワークがサポートするさまざまな非同期処理用の仕組みを使用します。実装することによって、再生開始の準備が完了したら通知を受けるようにします。コード例を以下に示します。同期操作の場合は、通常、エラーは例外またはエラーコードで通知されますが、非同期リソースを使用する場合は常に、アプリにエラーが適切に通知されるよう注意する必要があります。インスタンスに設定します。クラスのドキュメントを参照)、再び使用するにはリセットが必要になるので注意してください。使用バックグラウンドでメディアを再生するアプリを設計する際には、サービスの実行中にデバイスがスリープ状態になることも考慮する必要があります。ハードウェアなど、不要なスマートフォン機能がすべてオフになります。サービスで音楽を再生またはストリーミングしている場合は、それがシステムにより妨げられないようにする必要があります。lock」を使用する必要があります。スマートフォンがアイドル状態でも、アプリで使用中の機能はそのまま使用可能にしておく必要があることをシステムに伝える方法です。常に慎重に判断のうえ、本当に必要な場合にのみ使用してください。これを使用すると、デバイスの電池寿命が大幅に短くなるためです。メソッドを呼び出します。よって保持され、一時停止または停止したときに解除されます。実行され続けることのみが保証されます。保持すべきですが、これについては手動で取得と解除を行う必要があります。準備を開始するときに行います。コード例を以下に示します。wifiLock.acquire();メディアを一時停止または停止するときや、ネットワークが不要になったときは、ロックを解除します。呼び出すようにします。メソッドを明示的に呼び出すことが重要です。使用分の回収を開始するまでには時間がかかる場合があることと、反応するのはメモリの需要に対してのみで、他のメディア関連リソースの不足には対応できないことです。確実に解放するようにします。解放できる機会を常に探るようにします。解放し、後で再度作成するようにします。そのまま保持して、再度の作成と準備にかかるオーバーヘッドを回避するほうがよいでしょう。オブジェクトは公開されません。機能をすべて提供するわけではありませんが、一般的な用途はサポートしています。タイプを処理できます。メソッドの使用例を示しています。呼び出しの通常のフローに新しいメソッドを含める必要があります。オブジェクトを初期化します。使用するため、以下の手順を行います。使用してプレーヤーにアタッチします。