Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android 4.0中以编程方式打开/关闭扬声器_Android_Android 4.0 Ice Cream Sandwich_Speaker - Fatal编程技术网

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

如何在android 4.0中以编程方式打开/关闭扬声器,android,android-4.0-ice-cream-sandwich,speaker,Android,Android 4.0 Ice Cream Sandwich,Speaker,我通过媒体播放器播放文件,我想提供扬声器开/关、耳机播放、蓝牙等选项。 我尝试了下面的代码,这对Android2.2很有效,但我想要的东西也可以同时适用于2.2和4.0。 你能帮我以编程方式打开/关闭扬声器并通过耳机播放吗 AudioManager audioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE); if(isOn){ audioManager.setMode(Audi

我通过媒体播放器播放文件,我想提供扬声器开/关、耳机播放、蓝牙等选项。 我尝试了下面的代码,这对Android2.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);
附言:我已经在舱单上给予了这个许可:

android.permission.MODIFY_AUDIO_SETTINGS 
试一试


看看。

类似的东西可能在某些设备上工作(我只在XPeria p上测试过):


对于媒体,强制扬声器的组合
通常仅在内部用于将调频收音机音频传送到扬声器(因为调频收音机需要插入有线耳机/耳机作为天线)。没有调频收音机功能(或使用替代实现)的设备可能会忽略此参数组合,因此此方法在此类设备上不起作用。

您可以同时获取后扬声器或前耳机

如果没有连接附件

使用
audioManager.setMode(audioManager.MODE在调用中)
audioManager.Setspeakerphone(假)使用前置扬声器/耳机。但这将在听筒而不是扬声器上播放音频。要使用后扬声器,请使用
audioManager.setMode(audioManager.MODE_NORMAL)&
audioManager.setspeakerphone(真)

如果附件已连接;使用audioManager.setMode(audioManager.MODE_IN_CALL);&audioManager.Setspeakerphone(假);使用前置扬声器/耳机。但这将在听筒而不是扬声器上播放音频。要使用后扬声器,请使用
audioManager.setMode(audioManager.MODE\u在通话中)&
audioManager.setspeakerphone(真)


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

问题已解决。感谢你们所有仍在寻找答案的人。这不是一个bug,只是一个棘手的问题。您需要使用PhoneStateListener


使用本指南:

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

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

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

请尝试执行以下代码段:

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

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

顺便说一句,我在安卓7.0(Redmi 4x)上进行了测试,效果很好。

我想你是说
AudioManager.setspeakerphone
?(这是他已经在使用的)。音响系统中没有扬声器。请看我发布的链接。在该链接中,您可以找到该方法。您在答案中编写了AudioSystem,但链接到AudioManager参考。这就是我问的原因。@chirag:AudioManager.speakerphone(对);这不管用。你能推荐一些对2.2和4.0都有效的方法吗?你还必须这样做:
audioManager.setMode(audioManager.MODE在调用中)你是如何解决这个问题的?这在我的Galaxy S2和android 4.0.4上运行。你是怎么想到这个主意的?这就像一个奇迹
setForceUse
是一种内部使用的方法,用于将某些音频类型强制发送到给定的设备。我之所以知道这一点,是因为我以安卓音频为生。我不喜欢这样的黑客,因为他们几乎肯定会被安卓框架的未来版本打破。但这是我发现的唯一一种在耳机插入时允许通过扬声器输出的方法。在运行Android-4.1.1的华为Y300上工作嘿,Michael,当我们必须设置默认行为,即让它通过耳机播放时,我们是否执行setForceUse.invoke(null,1,0)?这在Android Pie设备中不起作用,你知道为什么吗?这对我很有效!耶!已经为此挣扎了一段时间。我现在唯一的问题是,在从扬声器到接收器的转换过程中,大约有一秒钟的死气。没什么大不了的,但有点烦人。audioManager.setMode(audioManager.MODE_NORMAL);这行代码适合我
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 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);
//for speakerphone on
audioManager.setMode(AudioManager.MODE_NORMAL);
audioManager.setSpeakerphoneOn(true);

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