2015-10-30 2 views
0

Я ищу способ воспроизведения звука с динамика устройства Android, даже когда вставлены наушники.Android, как перенаправить звук на динамики при вставлении наушников?

На самом деле типичное поведение заключается в том, что при вставке наушников из динамиков не выводится звук. Однако некоторые приложения, такие как приложение часов по умолчанию (com.google.android.deskclock), могут перенаправить звук на динамик, даже когда вставлены наушники.

Как я могу программно получить это поведение?

Я ищу решение, которое работает (по крайней мере) на Nexus 5 устройств, работает KitKat (Android 4.4)

Спасибо.

ответ

2

Возможно, посмотрите в исходном коде этого приложения. Я нашел класс AsyncRingtonePlayer (https://android.googlesource.com/platform/packages/apps/DeskClock/+/master/src/com/android/deskclock/AsyncRingtonePlayer.java), который мог бы выполнить эту работу.

Трюк заключается в использовании другого аудиопотока, я думаю. Давайте посмотрим на на 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)

+0

Этот код работает! Опубликуя свое окончательное решение ниже ... – user975176

0

Удаление кода не требуется для 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(); 
Смежные вопросы