Подтвердить что ты не робот

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 без каких-либо успехов. Может ли кто-нибудь указать мне в правильном направлении? Звук всегда воспроизводится с телефона динамика.

4b9b3361

Ответ 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, когда я пробовал другие режимы, во многих случаях я не мог включать и выключать динамик!