Есть ли способ принудительно передавать звук через динамики при подключении наушников?

Я пробовал рекомендованный

setSpeakerphoneOn(true) 

и неоспоримый

AudioSystem.setForceUse(AudioSystem.FOR_MEDIA, AudioSystem.FORCE_SPEAKER);

но ни одна из них не сработала.

Я пробовал

setWiredHeadsetOn(false)

но это тоже не работает, и оно устарело.

Интересно, что

isSpeakerphoneOn()

сообщает true, как и

isWiredHeadsetOn()

Кроме того, установлено следующее разрешение

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

Ответ 1

Ответ оказался следующим: с советами от Android - Получение звука для воспроизведения через наушники

audioManager.setMode(AudioManager.MODE_IN_CALL);
audioManager.setSpeakerphoneOn(true);

Игнорировать setRouting, он ничего не делает в APK > 10. Игнорируйте комментарии о setMode. Игнорировать комментарии о setWiredHeadsetOn. Убедитесь, что у вас есть разрешения MODIFY_AUDIO.

Ответ 2

Благодаря некоторым комментариям здесь, и после некоторого поиска я наконец выяснил, как это сделать.

Мой код ниже вызывается, когда я нажимаю кнопку. Он настраивает звук для включения динамиков во время вызова, затем вызывает номер.

Обратите внимание на комментарии в моем коде относительно разрешений.

buttonRep.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        //1) we need to detect once the call has been established
        //Note : this requires READ_PHONE_STATE permission in your manifest

        final TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

        tm.listen(new PhoneStateListener()
        {
            @SuppressWarnings("unused")
            @Override
            public void onCallStateChanged (int state, String incomingNumber)
            {
                if(state == TelephonyManager.CALL_STATE_OFFHOOK) //Here we are
                {
                    //2) we switch sound to speakers
                    //Note : this requires MODIFY_AUDIO_SETTINGS permission in your manifest
                    AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
                    am.setMode(AudioManager.MODE_IN_CALL);
                    am.setSpeakerphoneOn(true);
                    int i = state;

                    //3) we don't need this call listener anymore so we "destroy it"
                    tm.listen(this, PhoneStateListener.LISTEN_NONE);
                }
            }
        }

        , PhoneStateListener.LISTEN_CALL_STATE);

        //4) we are ready to place our call  now
        //Note : this requires CALL_PHONE permission in your manifest
        Intent action = new Intent();
        action.setAction(Intent.ACTION_CALL);
        action.setData(Uri.parse("tel:660")); //660 is my answering-machine number :)
        MainActivity.this.startActivity(action);
    }
});

Ответ 3

Попробуйте следующее:

    AudioManager mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);

    IntentFilter iFilter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
    Intent iStatus = getApplicationContext().registerReceiver(null, iFilter);
    boolean isHeadsetOn = false;

    if (iStatus != null) {
        isHeadsetOn = iStatus.getIntExtra("state", 0) == 1;
    }
    if(mAudioManager.isWiredHeadsetOn() || isHeadsetOn)
    {
        //When headphones are plugged
        mAudioManager.setMode(AudioManager.MODE_CURRENT);
        mAudioManager.setSpeakerphoneOn(true);
    }else { 
        //When headphones are not plugged
        mAudioManager.setMode(AudioManager.MODE_IN_CALL);
        mAudioManager.setSpeakerphoneOn(true);
    }

Ответ 4

Попробуйте сделать это:

AudioManager manager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
if(manager.isWiredHeadsetOn())
{
    manager.setWiredHeadsetOn(false);
    manager.setSpeakerphoneOn(true); 
    manager.setRouting(AudioManager.MODE_CURRENT, AudioManager.ROUTE_SPEAKER, AudioManager.ROUTE_ALL);  
    manager.setMode(AudioManager.MODE_CURRENT); 
}

Вам понадобится это разрешение:

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

Ответ 5

С помощью root explorer перейдите к /system/etc/. Затем прокрутите вниз до asound.conf и откройте его текстовым редактором.

Вы должны сделать резервную копию этого файла перед редактированием, поскольку изменения будут постоянными. Теперь найдите значение subdevice для воспроизведения динамиков и измените все значения воспроизведения гарнитуры на это значение, за исключением того, что гарнитура при вызове должна соответствовать характеристикам динамика.

Вы поймете это. После этого перезагрузите телефон, чтобы применить изменения, но это будет постоянным, пока вы не вернете исходный файл asound.conf. Я только сделал это, потому что у меня застрял телефон в режиме гарнитуры, так как мой усилитель работал неправильно при подключении к моему телефону.