MediaPlayer を使用してループ オーディオを再生しています。サービス内で再生する必要があります。数秒後に終了します。サービスがまだ実行中であることを確認しました。コードをアクティビティに移動すると、正常に機能し、停止することはありません。これにより、問題はスレッドに関係していると信じるようになりました。アクティビティでは、MediaPlayer は UI スレッドで実行されていますが、私のサービスでは、UI スレッドにバインドされていない独自のスレッドで実行されます。ひょっとしたらこれが関係しているのかもしれません。また、MediaPlayer オブジェクトをプライベートな静的フィールドとして宣言しましたが、それも役に立ちません。
Logcat は、「メディア サーバーが停止した」ことを示すだけで、それ以上の理由はありません。
MediaPlayer が UI スレッド内で動作する必要がある場合、サービスまたはサービスによって生成されたスレッド内からどのようにアクセスしますか?
Android 4.1 でこの問題が発生しています。おおよそのコードは次のようになります。
class PlaySound implements Runnable
{
private static MediaPlayer mp;
public void run()
{
this.mp = MediaPlayer.create(this.context, R.raw.sound);
this.mp.setVolume(1, 1);
this.mp.setLooping(true);
this.mp.start();
do
{
// Do something until told to stop thread.
}
while (true);
}
}
また、プライベート フィールドをサービスに移動し、do...while を削除して、再生が開始された直後にスレッドを終了できるようにしましたが、これも役に立ちませんでした。
編集:
これは Android 4.1 の問題のようです。同じメーカーのデバイスで 2.3 でアプリをテストしましたが、この問題は発生しません。実際、2.3 デバイスのリソースははるかに少なく、プロセッサも低速でした。そのため、リソースに問題がある場合は、いずれかを終了する必要がありました。