7

STREAM_MUSICプログラムでボリュームをストリームの最大値まで上げようとしていますが、そうすると「デッドスレッドでハンドラーにメッセージを送信する」という問題が発生します。また、100%の確率で音量が上がるわけではないようですが、このエラーが発生すると、ほとんどの場合音量が上がります。

コードは次のとおりです。

System.out.println("Maximum volume for this stream is: "+maxstreamvol+" and it used to be set to: "+currentvol);     
final AudioManager am = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE);
am.setStreamVolume(AudioManager.STREAM_MUSIC, maxstreamvol, AudioManager.FLAG_SHOW_UI);
am.setStreamSolo(AudioManager.STREAM_MUSIC, true);
System.out.println("Volume Raised!"); 

グーグルした後、このエラーはマルチスレッドの状況に関係しているようです...この時点でのコードはUIスレッドで実行されているはずです。

実際、私はそれを次のように囲みました。

runOnUiThread(new Runnable() {

    public void run() {
        // code_goes_here
    }
});

そして、それは同じエラーを引き起こしました。私が見ているエラーはこれです:

I/System.out(24949): Maximum volume for this stream is: 15 and it used to be set to: 0
W/MessageQueue(  490): Handler (android.media.AudioManager$FocusEventHandlerDelegate$1) {42b52f28} sending message to a Handler on a dead thread
W/MessageQueue(  490): java.lang.RuntimeException: Handler (android.media.AudioManager$FocusEventHandlerDelegate$1) {42b52f28} sending message to a Handler on a dead thread
W/MessageQueue(  490):  at android.os.MessageQueue.enqueueMessage(MessageQueue.java:294)
W/MessageQueue(  490):  at android.os.Handler.enqueueMessage(Handler.java:618)
W/MessageQueue(  490):  at android.os.Handler.sendMessageAtTime(Handler.java:587)
W/MessageQueue(  490):  at android.os.Handler.sendMessageDelayed(Handler.java:558)
W/MessageQueue(  490):  at android.os.Handler.sendMessage(Handler.java:495)
W/MessageQueue(  490):  at android.media.AudioManager$1.dispatchAudioFocusChange(AudioManager.java:1894)
W/MessageQueue(  490):  at android.media.IAudioFocusDispatcher$Stub.onTransact(IAudioFocusDispatcher.java:57)
W/MessageQueue(  490):  at android.os.Binder.execTransact(Binder.java:351)
W/MessageQueue(  490):  at dalvik.system.NativeStart.run(Native Method)
I/System.out(24949): Volume Raised!

ここで何が起こっているのか誰か知っていますか?

4

2 に答える 2

3

問題は、このスレッドで報告された問題に関連している可能性があります-onPostExecuteがAsyncTaskで呼び出されていません(ハンドラーランタイム例外)

オーディオフォーカスの変更の表示により、Androidが完了できないUIイベントがトリガーされます。なぜそうなるのかはすぐにはわかりません。おそらく、オーディオマネージャは1つのコンテキストで取得され、ボリュームを示すトーストは別のコンテキストで実行されますか?手っ取り早い変更は、フラグをFLAG_VIBRATEと交換し、それが違いを生むかどうかを確認することです。これにより、問題がUIの更新に絞り込まれ、作業できるようになります。

于 2013-03-12T04:46:44.540 に答える
0

AudioManager uses the thread which it was created to invoke your callback or do UI manipulating (display Volume toast etc.)
(Via Looper.myLooper or getMainLooper, see this).

So you should make sure your first call to Context.getSystemService(AUDIO_MANAGER) happens on the UI thread.
(Not sure that subsequence calls will reuse that instance, but even if I re-retrieve the AudioManager the exception still occur)

I've come across this issue today and solved it by adding that call to my Application.onCreate(). (Somewhat similar to this answer?)

于 2017-05-31T11:05:52.283 に答える