Как включить / выключить динамик программно в Android 4.0

Я воспроизводлю файл через медиаплеер и хочу включить / выключить динамик, воспроизводить через гарнитуру, Bluetooth и т. Д. Я попробовал приведенный ниже код, который хорошо работает для Android 2.2, но я хочу что-то, что также может работать для 2.2 и 4.0. Можете ли вы помочь мне, как программно включить / выключить динамик и играть через наушники?

AudioManager audioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
    if(isOn){
        audioManager.setMode(AudioManager.MODE_IN_CALL);    
        audioManager.setMode(AudioManager.MODE_NORMAL); 
    }else{
        //Seems that this back and forth somehow resets the audio channel
        audioManager.setMode(AudioManager.MODE_NORMAL);     
        audioManager.setMode(AudioManager.MODE_IN_CALL);        
    }
    audioManager.setSpeakerphoneOn(isOn);

PS: я дал это разрешение в манифесте: android.permission.MODIFY_AUDIO_SETTINGS разрешение

8 ответов

Нечто подобное может работать на некоторых устройствах (я тестировал только на XPeria P):

final static int FOR_MEDIA = 1;
final static int FORCE_NONE = 0;
final static int FORCE_SPEAKER = 1;

Class audioSystemClass = Class.forName("android.media.AudioSystem");
Method setForceUse = audioSystemClass.getMethod("setForceUse", int.class, int.class);
setForceUse.invoke(null, FOR_MEDIA, FORCE_SPEAKER);
// To get back to the default behaviour, use the combination FOR_MEDIA,FORCE_NONE.

Комбинация FOR_MEDIA, FORCE_SPEAKER обычно используется только для внутренней передачи звука FM-радио в громкоговоритель (поскольку FM-радио требует, чтобы у вас была подключена проводная гарнитура / наушники для работы в качестве антенны). Устройства, которые не имеют функциональности FM-радио (или используют альтернативную реализацию), могут игнорировать эту комбинацию параметров, поэтому этот метод не будет работать на таком устройстве.

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

Button mVolumeButton = (Button)findViewById(R.id.btn_Volume);
        mVolumeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mAudioMgr.isWiredHeadsetOn()){
                    mAudioMgr = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
                    mAudioMgr.setWiredHeadsetOn(false);
                    mAudioMgr.setSpeakerphoneOn(true);
                    mAudioMgr.setMode(AudioManager.MODE_IN_COMMUNICATION);

                    Toast.makeText(getApplicationContext(), "SpeakerPhone On", Toast.LENGTH_LONG).show();
                }else{
                    mAudioMgr.setMode(AudioManager.MODE_IN_COMMUNICATION);
                    mAudioMgr.setSpeakerphoneOn(false);
                    mAudioMgr.setWiredHeadsetOn(true);
                    Toast.makeText(getApplicationContext(), "Wired Headset On", Toast.LENGTH_LONG).show();
                }
            }
        });

Вы можете приобрести задний динамик или передний динамик одновременно.

Если аксессуар не подключен;

использование audioManager.setMode(AudioManager.MODE_IN_CALL); & audioManager.setSpeakerphoneOn(false); использовать передний динамик / наушник. Но это будет воспроизводить звук в наушнике, а не на динамике. Чтобы использовать задний динамик, используйте audioManager.setMode(AudioManager.MODE_NORMAL); & audioManager.setSpeakerphoneOn(true);

Если аксессуар подключен; Использовать audioManager.setMode(AudioManager.MODE_IN_CALL); & audioManager.setSpeakerphoneOn(false); использовать передний динамик / наушник. Но это будет воспроизводить звук в наушнике, а не на динамике. Чтобы использовать задний динамик, используйте audioManager.setMode(AudioManager.MODE_IN_CALL); & audioManager.setSpeakerphoneOn(true);

Примечание: убедитесь, что audioManager.setWiredHeadsetOn(boolean on) а также audioManager.setBluetoothScoOn(boolean on) установлен в false направить аудио через динамик. И установите либо true направить аудио соответственно.

Попробуйте следовать фрагменту кода:

//for spearphone on
audioManager.setMode(AudioManager.MODE_NORMAL);
audioManager.setSpeakerphoneOn(true);

//for headphone on
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
audioManager.setSpeakerphoneOn(false);

Кстати, я тестировал в Android 7.0(Redmi 4x), и он работал нормально.

Попробуй это.

AudioManager audioManager =(AudioManager)getSystemService(Context.AUDIO_SERVICE);
    if (isOn) {
        isOn = false;
        audioManager.setMode(AudioManager.MODE_IN_CALL);
        audioManager.setMode(AudioManager.MODE_NORMAL);

    } else {
        isOn = true;
        audioManager.setMode(AudioManager.MODE_NORMAL);
        audioManager.setMode(AudioManager.MODE_IN_CALL);

    }
    audioManager.setSpeakerphoneOn(isOn);

Задача решена. Для всех вас, кто все еще ищет ответ. Ну, это не ошибка, а просто хитрость. Вам нужно использовать PhoneStateListener

Используя это руководство: http://danielthat.blogspot.co.il/2013/06/android-make-phone-call-with-speaker-on.html

Если вы просто хотите включить громкую связь, просто напишите эту строку в oncreate() вашей деятельности.

static AudioManager audioManager =  (AudioManager)getSystemService(Context.AUDIO_SERVICE);
audioManager.setMode(AudioManager.MODE_IN_CALL);
audioManager.setSpeakerphoneOn(true);

Пытаться

AudioManager.speakerphone(true);

Посмотри на это.

Другие вопросы по тегам