Android, как перенаправить звук на динамики при вставлении наушников?

Вопрос: Я ищу способ воспроизведения звука с динамика устройства Android, даже когда вставлены наушники. Фактически, типичное поведение заключается в том, что при вставке наушников из динамиков не выводится звук. Однако некоторые приложения, такие как приложение часов по умолчанию (com.google.android.deskclock), могут перенаправить звук на динамик, даже когда вставлены наушники. Как я могу программно получить это поведение?

Вопрос:

Я ищу способ воспроизведения звука с динамика устройства 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();

Оцените статью
Добавить комментарий