Вопрос:
Я ищу способ воспроизведения звука с динамика устройства Android, даже когда вставлены наушники.
Фактически, типичное поведение заключается в том, что при вставке наушников из динамиков не выводится звук. Однако некоторые приложения, такие как приложение часов по умолчанию (com.google.android.deskclock), могут перенаправить звук на динамик, даже когда вставлены наушники.
Как я могу программно получить это поведение?
Я ищу решение, которое работает (по крайней мере) на устройствах Nexus 5, запуская KitKat (Android 4.4)
Благодарю.
Лучший ответ:
Вероятно, поиск в исходном коде этого приложения поможет. Я нашел класс AsyncRingtonePlayer ), который мог бы выполнить эту работу.
Хитрость заключается в том, чтобы использовать другой Audiostream, я думаю. Давайте посмотрим на startAlarm-метод:
private void startAlarm(MediaPlayer player) throws IOException { // do not play alarms if stream volume is 0 (typically because ringer mode is silent). if (mAudioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) { if (Utils.isLOrLater()) { player.setAudioAttributes(new AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_ALARM) .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) .build()); } player.setAudioStreamType(AudioManager.STREAM_ALARM); player.setLooping(true); player.prepare(); mAudioManager.requestAudioFocus(null, AudioManager.STREAM_ALARM, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); player.start(); } }
Тип аудиопотока объекта проигрывателя будет установлен в AudioManager.STREAM_ALARM. Думаю, это могло быть решением. Я не тестировал его, но это первое, что я нашел в исходном коде.
Также обратите внимание на некоторые необходимые разрешения, перечисленные в AndroidManifest:
<uses-permission android:name=»android.permission.RECEIVE_BOOT_COMPLETED» /> <uses-permission android:name=»android.permission.WAKE_LOCK»/> <uses-permission android:name=»android.permission.VIBRATE»/> <uses-permission android:name=»android.permission.DISABLE_KEYGUARD» /> <!— WRITE_SETTINGS is required to record the upcoming alarm prior to L —> <uses-permission android:name=»android.permission.WRITE_SETTINGS» /> <!— READ_PHONE_STATE is required to determine when a phone call exists prior to M —> <uses-permission android:name=»android.permission.READ_PHONE_STATE» /> <!— READ_EXTERNAL_STORAGE is required to play custom ringtones from the SD card prior to M —> <uses-permission android:name=»android.permission.READ_EXTERNAL_STORAGE» />
(https://android.googlesource.com/platform/packages/apps/DeskClock/+/master/AndroidManifest.xml)
Ответ №1
Удаление кода не требуется для Android 4.4
//context = a valid context AudioManager am = (AudioManager) context.getSystemService(context.AUDIO_SERVICE); MediaPlayer mp = new MediaPlayer(); Uri loc = Uri.parse(«android.resource://com.example.test/» + R.raw.music); try { mp.setDataSource(context, loc); mp.setAudioStreamType(AudioManager.STREAM_ALARM); mp.setLooping(true); mp.prepare(); } catch (IllegalArgumentException | SecurityException| IllegalStateException | IOException e) { e.printStackTrace(); } am.requestAudioFocus(null, AudioManager.STREAM_ALARM,AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); mp.start();