「 Media Playback」と「MediaPlayer 」の Android ドキュメントを読んだ後、私はまだ混乱しており、setDataSource のオーバーロードされたメソッドに関する経験豊富なアドバイスが必要です。
音楽の再生中にforegroundServiceになるプロジェクトのコンポーネントで使用MediaPlayer
しています。APKのフォルダーに音楽ファイル(.mp3)があります。再生を開始するには、MediaPlayer オブジェクトを準備する必要があることはわかっています。Android アプリケーションのサービスはデフォルトで単一のプロセスとメイン スレッドを使用するため、MediaPlayer の準備中にユーザーがANRを取得したくありません
(raw フォルダー内のメディア ファイルのサイズが大きい場合を考えてください)。次に、 (同期)の代わりに使用します。だから私は使用できません:Service
res/raw
prepareAsync
prepare
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();
そして最後に、「これらのさまざまな方法を含めて、どれが最良の選択肢でしょうか? どちらにも利点はありますか? 何か不足していますか?」という疑問が生じます。