22

我通过媒体播放器播放文件,我想提供扬声器开/关、通过耳机播放、蓝牙等选项。我尝试了下面的代码,它适用于 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 
4

8 回答 8

27

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

于 2012-08-20T12:33:24.300 回答
6
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();
                }
            }
        });
于 2016-03-21T12:59:51.523 回答
5

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

如果没有连接配件;

使用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相应地路由音频。

于 2014-03-14T11:50:20.820 回答
4

尝试遵循代码片段:

//for speakerphone 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)中进行了测试,效果很好。

于 2018-08-24T09:04:00.793 回答
2

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

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

于 2014-08-22T07:52:58.623 回答
2

如果你只是想在你身上打开你的免提电话,只需在你的活动的 oncreate() 中写下这一行。

static AudioManager audioManager =  (AudioManager)getSystemService(Context.AUDIO_SERVICE);
audioManager.setMode(AudioManager.MODE_IN_CALL);
audioManager.setSpeakerphoneOn(true);
于 2014-10-29T10:12:13.920 回答
2

尝试这个。

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);
于 2018-04-20T08:51:17.757 回答
-1

尝试

AudioManager.speakerphone(true);

看看这个

于 2012-08-20T10:48:24.210 回答