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();
Что-то изменилось с тех пор, как Android 2.0 нарушил этот код? Я пробовал код на Android ICS без каких-либо успехов. Может ли кто-нибудь указать мне в правильном направлении? Звук всегда воспроизводится с телефона динамика.
Ответы
Ответ 1
Оказывается, правильный способ сделать это через следующий код.
Воспроизведение через ушную часть
mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
Воспроизведение через громкоговоритель
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
Вот и все. Любое другое решение (в том числе размещенное здесь → Android - получение аудио для воспроизведения через наушники) не работает последовательно на всех устройствах. Фактически использование MODE_IN_CALL гарантирует, что ваш звук будет никогда воспроизводиться на определенных устройствах.
Примечание. Вам нужно будет повторно подготовить медиаплеер для изменения потоков.
Ответ 2
Я просто хотел добавить полный пример для Deepak Bala Answer. Он работает, если не используется метод 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();
}
Ответ 3
Как насчет этого:
// 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 на телефоне/планшете, на котором вы тестируете это.
Ответ 4
Мне показалось, что мне нужно установить как медиаплеер, так и Audiomanager
private MediaPlayer mp = new MediaPlayer();
AudioManager mAudioManager = (AudioManager) v.getContext()
.getSystemService(Context.AUDIO_SERVICE);
mAudioManager.setSpeakerphoneOn(false);
mp.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
Ответ 5
Этот метод отлично работает для меня.
Вам также нужно установить режим аудио-менеджера. а затем с помощью audiomgr.setSpeakerphoneOn(false) api вы можете переключаться.
AudioManager audiomgr = (AudioManager)
context.getSystemService(Context.AUDIO_SERVICE);
audiomgr.setMode(AudioManager.STREAM_MUSIC);
audiomgr.setSpeakerphoneOn(false);
Ответ 6
Следующий код работает отлично для меня, и я тестировал его на нескольких устройствах:
1- создание экземпляров:
MediaPlayer mPlayer = MediaPlayer.create(MainActivity.this, R.raw.skype_call_dialing);
AudioManager mAudioManager = ((AudioManager).getSystemService(Context.AUDIO_SERVICE));
2-, если вы хотите установить громкость на максимум (необязательно)
int maxVolumeMusic = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, maxVolumeMusic, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
mAudioManager.setMode(AudioManager.STREAM_MUSIC);
3- установить звук для воспроизведения с динамика:
mAudioManager.setSpeakerphoneOn(false);
4- воспроизведение:
mPlayer.setLooping(true);
mPlayer.start();
Готово!!!! Но есть некоторые советы, которые я собираюсь поделиться с вами:
1- на шаге 2, если вы установили Audiomanager.setMode() перед AudioManager.setStreamVolume(), то громкость не будет установлена на max!
2- если вы добавите mPlayer.prepare() перед mPlayer.setLooping(true); это приведет к сбою!, вы не должны использовать mPlayer.prepare(), в то время как mPlayer инициализируется следующим образом:
MediaPlayer mPlayer = MediaPlayer.create(MainActivity.this, R.raw.skype_call_dialing);
3- на шаге 2, mAudioManager.setMode() Я использовал AudioManager.STREAM_MUSIC, когда я пробовал другие режимы, во многих случаях я не мог включать и выключать динамик!