AudioManager отправляет сообщение обработчику по мертвой теме?

Я пытаюсь программно повысить громкость до максимального значения потока 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!"); 

После поиска по всему миру кажется, что эта ошибка связана с многопоточными ситуациями … Код в этой точке должен работать в потоке пользовательского интерфейса.

Фактически, я даже окружил его:

 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! 

Кто-нибудь знает, что здесь происходит?

Ваша проблема может быть связана с сообщением об этом потоке – onPostExecute не вызывается в AsyncTask (исключение выполнения Handler)

Дисплей для изменения фокусного звука запускает событие пользовательского интерфейса, которое андроид не может выполнить. Не сразу понятно, почему это так. Возможно, аудио-менеджер был получен с одним контекстом, а тост, чтобы показать, что том выполнен в другом контексте? Быстрое и грязное изменение заключается в замене флага для FLAG_VIBRATE и проверке того, что это имеет значение. Это сузило проблему до обновления пользовательского интерфейса, с которым вы сможете работать.

AudioManager использует поток, который был создан для вызова вашего обратного вызова или манипуляции с пользовательским интерфейсом (отображение тостов тома и т. Д.).
(Via Looper.myLooper или getMainLooper , см. Это ).

Поэтому вы должны убедиться, что ваш первый вызов Context.getSystemService(AUDIO_MANAGER) происходит в потоке пользовательского интерфейса.
(Не уверен, что вызовы с подпоследовательностями будут повторно использовать этот экземпляр, но даже если я повторно получаю AudioManager, все равно возникает исключение)

Сегодня я столкнулся с этой проблемой и решил ее, добавив этот вызов в свой Application.onCreate (). (Совсем похоже на этот ответ?)