Я использую следующий код для увеличения громкости музыки, когда пользователь нажимает кнопку увеличения громкости:
@Override
public boolean onKeyDown(int keyCode, KeyEvent e) {
if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
AudioManager audio = (AudioManager)getApplicationContext().getSystemService(AUDIO_SERVICE);
audio.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);
return true;
}
}
В консоли разработчика Google я вижу следующее сообщение ANR:
Возможно, этот вызов Binder занимает слишком много времени. , что заставляет основной поток
ожидать и активировать ANR.
at android.os.BinderProxy.transactNative (Native method)
at android.os.BinderProxy.transact (Binder.iava: 1154)
at android.media.IAudioServiceSStub$Proxy.adjustStreamVolume (IAudioService.java: 1150)
at android.media.AudioManager.adjustStreamVolume (AudioManager.java: 820)
at com.example.MyActivity.onKeyDown (MyActivity.java:42)
Код вашего приложения приводит к вызову Binder, указанному выше. Код, запускающий
вызовы Binder, должен быть перемещен из основного потока.
Должны ли выполняться вызовы AudioManager.adjustStreamVolume фоновый поток?
@Override
public boolean onKeyDown(int keyCode, KeyEvent e) {
if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
new Thread(this::increaseVolume).start();
return true;
}
}
private void increaseVolume() {
AudioManager audio = (AudioManager)getApplicationContext().getSystemService(AUDIO_SERVICE);
audio.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);
}
Подробнее здесь: https://stackoverflow.com/questions/785 ... -avoid-anr