如何在android 4.0中以编程方式打开/关闭扬声器

时间:2012-08-20 10:42:16

标签: android android-4.0-ice-cream-sandwich speaker

我通过媒体播放器播放文件,我想提供扬声器开/关,播放耳机,蓝牙等选项。 我尝试了下面的代码,它适用于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);
P.S:我在清单中给了这个许可: android.permission.MODIFY_AUDIO_SETTINGS权限

8 个答案:

答案 0 :(得分:26)

这样的东西可能适用于某些设备(我只在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无线电功能(或使用替代实现)的设备可能会忽略这些参数组合,因此此方法不适用于此类设备。

答案 1 :(得分:4)

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();
                }
            }
        });

答案 2 :(得分:3)

您可以及时购买后置扬声器或前置听筒。

如果没有连接配件;

使用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(假);使用前置扬声器/耳机。但这会在耳机中播放音频,而不是扬声器。要使用后置扬声器,请使用audioManager.setMode(AudioManager.MODE_IN_CALL);& audioManager.setSpeakerphoneOn(true);

注意:确保audioManager.setWiredHeadsetOn(boolean on)audioManager.setBluetoothScoOn(boolean on)设置为 false ,以通过听筒传送音频。并设置为 true 以相应地路由音频。

答案 3 :(得分:2)

问题解决了。对于仍在寻找答案的所有人。嗯,这不是一个错误,但只是一个棘手的事情。您需要使用PhoneStateListener

使用本指南:http://danielthat.blogspot.co.il/2013/06/android-make-phone-call-with-speaker-on.html

答案 4 :(得分:2)

如果您只想打开扬声器,只需在活动的oncreate()中写下这一行。

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

答案 5 :(得分:1)

试试这个。

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);

答案 6 :(得分:0)

尝试遵循以下代码段:

//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)中进行了测试,并且工作正常。

答案 7 :(得分:-1)

尝试

AudioManager.speakerphone(true);

请看this