7

「 Media Playback」と「MediaPlayer 」の Android ドキュメントを読んだ後、私はまだ混乱しており、setDataSource のオーバーロードされたメソッドに関する経験豊富なアドバイスが必要です。

音楽の再生中にforegroundServiceになるプロジェクトのコンポーネントで使用MediaPlayerしています。APKのフォルダーに音楽ファイル(.mp3)があります。再生を開始するには、MediaPlayer オブジェクトを準備する必要があることはわかっています。Android アプリケーションのサービスはデフォルトで単一のプロセスとメイン スレッドを使用するため、MediaPlayer の準備中にユーザーがANRを取得したくありません (raw フォルダー内のメディア ファイルのサイズが大きい場合を考えてください)。次に、 (同期)の代わりに使用します。だから私は使用できません:Serviceres/rawprepareAsyncprepare

mp = MediaPlayer.create(context, R.raw.myfile);

これはすでにprepare()内部的に呼び出しているため、 prepareAsync(). したがって、基本的に私には2つのオプションがあります(4つから2つ):

Uri myUri = Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.myfile);
mp.setDataSource(context, myUri);

また

AssetFileDescriptor afd = context.getResources().openRawResourceFd(R.raw.myfile);
mp.setDataSource(fd.getFileDescriptor());
afd.close();

それらの1つを使用した後、私は簡単に使用できます:

mp.prepareAsync();

そして最後に、「これらのさまざまな方法を含めて、どれが最良の選択肢でしょうか? どちらにも利点はありますか? 何か不足していますか?」という疑問が生じます。

4

1 に答える 1

8

createまたはを呼び出すさまざまな方法には、実際の利点はありませんsetDataSource。静的メソッドは、 と を呼び出す以上のことcreateはしません。さまざまなメソッドが内部的に相互に呼び出します。最終的に、それらは 2 つのネイティブ呼び出しに要約されます。1 つはリモート URI を記述する文字列を使用し、もう 1 つはローカル ファイル記述子を使用します。ファイル記述子を自分で作成すると、パフォーマンスがわずかに向上する可能性がありますが、コンテキスト内ではそれほど大きくはありません。setDataSourcepreparesetDataSource

ローカル ファイルの再生では、コードで示しているように、単に呼び出しprepare(または静的createメソッド) を実行することは悪い習慣ではありません。基盤となるプレーヤーは、ファイルのサイズに関係なく、関連するメタデータを問題なく判断してすばやく返す必要があります。このprepareAsync方法は、予期しない遅延が発生する可能性があるネットワーク ストリームの場合により便利です。汎用プレーヤーを設計している場合は、このprepareAsync方法を使用するのがよいでしょうが、生のアセットを単に再生するだけであれば、違いはありません。提供されているさまざまなメソッドは、便宜上のものです ( の javadoc に注意してくださいcreate)。

于 2013-09-27T16:45:08.190 に答える