Android – воспроизведение звука с динамика

Я хотел бы воспроизвести звук из файла в наушник телефона (или гарнитуру, который подключен) с помощью андроида MediaPlayer . Я попытался использовать взломанный MODE_IN_CALL, как было предложено в этой теме – Android – Получение звука для воспроизведения через динамик, но это не помогло. Приложение также имеет разрешение android.permission.MODIFY_AUDIO_SETTINGS , но любой вызов m_amAudioManager.setSpeakerphoneOn(false); Игнорируется.

 private AudioManager m_amAudioManager; m_amAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); m_amAudioManager.setMode(AudioManager.MODE_IN_CALL); m_amAudioManager.setSpeakerphoneOn(false); 

Вызов setMode(AudioManager.STREAM_VOICE_CALL); На MediaPlayer тоже не помогло.

 mediaPlayer.reset(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); mediaPlayer.setDataSource(path); mediaPlayer.prepare(); 

Что-то изменилось с тех пор, как андроид 2.3 нарушил этот код? Я пробовал код на Android ICS без каких-либо успехов. Может ли кто-нибудь указать мне в правильном направлении? Звук всегда воспроизводится с телефона динамика.

Solutions Collecting From Web of "Android – воспроизведение звука с динамика"

Оказывается, правильный способ сделать это через следующий код.

Играйте через ушную часть

 mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); 

Воспроизведение через громкоговоритель

 mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 

Вот и все. Любое другое решение (включая отправленный здесь -> Android – Получение звука для воспроизведения через динамик ) не работает последовательно на всех устройствах. Фактически использование MODE_IN_CALL гарантирует, что ваш звук никогда не будет воспроизводиться на определенных устройствах.

Примечание. Для изменения потоков вам необходимо будет повторно подготовить медиаплеер.

Я просто хотел добавить полный пример для ответа Дипака Балы. Он работает, когда не используется метод MediaPlayer.create ():

  this.player = new MediaPlayer(); this.player.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); try { this.player.setDataSource(getContext(), Uri.fromFile(new File(m.localFileUrl))); this.player.prepare(); } catch (IllegalStateException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } 

Как насчет этого тогда:

 // Make sure that streams following the PHONE routing strategy aren't forced // to play in the speaker. Class audioSystemClass = Class.forName("android.media.AudioSystem"); Method setForceUse = audioSystemClass.getMethod("setForceUse", int.class, int.class); // First 0 == FOR_COMMUNICATION, second 0 == FORCE_NONE. setForceUse.invoke(null, 0, 0); 

Затем используйте STREAM_VOICE_CALL для вашего MediaPlayer.

Если вызов setForceUse преуспевает, и звук из вашего MediaPlayer по-прежнему воспроизводится в громкоговорителе, я бы сказал, что что-то испортилось в реализации AudioPolicyManager на телефоне / планшете, на котором вы тестируете это.

Я нашел, что мне нужно было установить как медиаплеер, так и Audiomanager

 private MediaPlayer mp = new MediaPlayer(); AudioManager mAudioManager = (AudioManager) v.getContext() .getSystemService(Context.AUDIO_SERVICE); mAudioManager.setSpeakerphoneOn(false); mp.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); 

Этот метод работает отлично для меня.

Вам также нужно установить режим диспетчера аудио. А затем с помощью audiomgr.setSpeakerphoneOn (false) api вы можете переключаться.

 AudioManager audiomgr = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); audiomgr.setMode(AudioManager.STREAM_MUSIC); audiomgr.setSpeakerphoneOn(false);