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

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

setSpeakerphoneOn(true) 

и нерекомендованные

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

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

Я пробовал

setWiredHeadsetOn(false)

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

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

isSpeakerphoneOn()

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

isWiredHeadsetOn()

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

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
26
задан 25.11.2019, 20:53

4 ответа

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

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

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

28
ответ дан 25.11.2019, 20:55
  • 1
    если у меня есть тег изображения HTML < img src =" abc.gif/> html2haml преобразовывает его в %img {: src = > " abc gif"} там способ преобразовать его в =image_tag " abc gif" использовать помощников направляющих? – Mahmoud Khaled 19.03.2012, 06:31
  • 2
    это работает на все версии андроида? – android developer 25.11.2019, 20:56

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

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" />
1
ответ дан 25.11.2019, 20:53
  • 1
    Согласно последний html2haml исходный код , html2haml " находится в процессе того, чтобы быть извлеченным из haml драгоценного камня " – David J. 16.06.2012, 04:06
  • 2
    Попробуйте просто установку manager.setSpeakerphoneOn(true) в конструкторе и посмотрите, работает ли это. Кроме того, смотрите на ответ @Donal Rafferty в этот вопрос. Я думаю, что ему выяснили его. – A. Abiri 25.11.2019, 20:54
  • 3
    Этот doesn' t работают на меня. setRouting и setMode don' t делают что-либо (пустые функции в SDK), и звонящий isWiredHeadsetOn () прямо после setSpeakerphoneOn (истинные) верные возвраты. Музыка продолжает проигрывать наушники. – secureboot 25.11.2019, 20:54
  • 4
    Should' ve упомянул это I' m на APK 10 или выше, где setRouting doesn' t делают что-либо. – secureboot 25.11.2019, 20:55
  • 5
    У меня был setSpeakerphoneOn, но вызов setMode был приемом. – secureboot 25.11.2019, 20:55

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

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

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

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);
    }
});
2
ответ дан 25.11.2019, 20:54
  • 1
    Это не ' bad' ответ, но это не должно быть принято как лучший ответ. Инструмент командной строки (ниже) лучше. – David J. 16.06.2012, 03:50

Попробуйте это:

    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);
    }
2
ответ дан 25.11.2019, 20:54
  • 1
    Читайте сообщение, он сказал его didn' t хотят преобразовать каждый отдельный файл. – JackHasaKeyboard 31.12.2015, 13:37

Теги

Похожие вопросы