如何在android 4.0中以编程方式打开/关闭扬声器
我通过媒体播放器播放文件,我想提供扬声器开/关、耳机播放、蓝牙等选项。 我尝试了下面的代码,这对Android2.2很有效,但我想要的东西也可以同时适用于2.2和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
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);