Android - воспроизводить звук, когда устройство подключено к аудиоразъему

Я хочу воспроизвести аудиофайл, пока у меня есть устройство, подключенное к аудиоразъему (не обязательно только наушники).

Если это поможет, меня интересует только Android версии 4.3 и выше, и я готов рутировать телефон, если это необходимо.

Вот что я пробовал до сих пор:

  1. Какой-то хак, но он не работает.

     try {
        Class audioSystemClass = Class.forName("android.media.AudioSystem");
        Method setForceUse = audioSystemClass.getMethod("setForceUse", int.class, int.class);
        setForceUse.invoke(null, 1, 1);
    
        MediaPlayer mp = MediaPlayer.create(this, R.raw.bad);
        mp.start();
    
    } catch (ClassNotFoundException e) {
        Log.d("mediaException", "class", e);
    } catch (NoSuchMethodException e) {
        Log.d("mediaException", "method", e);
    } catch (IllegalAccessException e) {
        Log.d("mediaException", "access", e);
    } catch (InvocationTargetException e) {
        Log.d("mediaException", "invocation", e);
    }
    
  2. Нашел это здесь в какой-то теме, но это также не работает:

    AudioManager audioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
    
    audioManager.setMode(AudioManager.MODE_NORMAL);
    audioManager.setSpeakerphoneOn(true);
    
    MediaPlayer mp = MediaPlayer.create(this, R.raw.bad);
    mp.start();
    
  3. Используя класс MediaRouter, я попытался получить доступные маршруты. Но когда что-то подключено к аудиоразъему, доступен только маршрут «Наушники».

    MediaRouter router = (MediaRouter) this.getSystemService(Context.MEDIA_ROUTER_SERVICE);
    
    for (int i = 0; i < router.getRouteCount(); i++) {
        Log.d("playSound", router.getRouteAt(i).toString());
    }
    

person Koc    schedule 23.12.2013    source источник
comment
Как именно не работает?   -  person ozbek    schedule 23.12.2013
comment
Звук не воспроизводится по громкой связи, когда что-то подключено к аудиоразъему. Это то, что я пытаюсь сделать.   -  person Koc    schedule 23.12.2013
comment
Разве это не ожидаемое/нормальное поведение?   -  person ozbek    schedule 23.12.2013
comment
Вы не указали, какой тип потока вы используете для воспроизведения. Это очень важно.   -  person Michael    schedule 23.12.2013
comment
@shoerat да, это ожидаемое поведение. Попробую переформулировать вопрос.   -  person Koc    schedule 23.12.2013
comment
@ Майкл, я не уверен, о чем ты говоришь?   -  person Koc    schedule 23.12.2013
comment
Тип потока. Например, STREAM_MUSIC, STREAM_VOICE_CALL и т. д. Например, хак, который вы указали выше, будет работать только для STREAM_MUSIC (и, возможно, STREAM_SYSTEM).   -  person Michael    schedule 23.12.2013
comment
Я попытался добавить: MediaPlayer mp = MediaPlayer.create(this, R.raw.bad); mp.setAudioStreamType(AudioManager.STREAM_MUSIC); но взлом все равно не работает (устройство: Nexus 5)   -  person Koc    schedule 23.12.2013
comment
Попробуйте с STREAM_NOTIFICATION   -  person ozbek    schedule 23.12.2013
comment
Я пробовал STREAM_NOTIFICATION, и это не работает.   -  person Koc    schedule 23.12.2013


Ответы (2)


Я узнал, как это можно сделать. Обратите внимание, что MediaPlayer и AudioManger находятся в одном и том же режиме. Я пробовал это на Nexus 5 (4.4.2)

        final AudioManager audioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
        audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
        audioManager.setSpeakerphoneOn(true);

        MediaPlayer mp = null;
        mp = MediaPlayer.create(this, R.raw.bad);
        mp.setAudioStreamType(AudioManager.MODE_IN_COMMUNICATION);
        mp.start();
person Koc    schedule 24.12.2013

Также важно добавить использование разрешений в манифест:

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
person Fedir Tsapana    schedule 19.02.2019