您的位置:首页 > 移动开发 > Android开发

android 扬声器和听筒切换兼容5.0以上版本

2016-05-02 22:45 573 查看

请尊重个人劳动成果,转载声明出处!

工作一年多了,一直也没使用过硬件方面的东西,本周在公司遇见一个问题,公司要做个对讲项目,播放声音的时候,要在扬声器和听筒进行切换。然后我的工作也来了,我以为很简单,从网上搜的也很简单,但问题来了,网上的版本都是对于5.0以下可以使用的,实测5.0及以上不能使用,系统没有提供权限给我们修改,但是qq的就可以,为此,研究了一整天,给大家分享以下。
从网上搜的都是这样的:
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioManager.setMode(AudioManager.MODE_IN_CALL);

只需要这两行代码就可以切换到听筒,实测,5.0以下不能用。

重点来了:兼容5.0及以上的版本分三个步骤

1.播放音频流类型要设置为AudioManager.STREAM_VOICE_CALL

2.在播放前调用AudioSystem.setForceUse(AudioSystem.FOR_COMMUNICATION,AudioSystem.FORCE_NONE);

3.配置权限:android.permission.MODIFY_AUDIO_SETTINGS

实际上调用声音可以通过android.media.AudioSystem这个类调用setForceUse( int, int )这个方法就可以实现听筒的切换。但是Android把这个类在jar包中隐藏了,我们看不到,也找不到。为此,我们必须要通过反射调获得这个方法。

private void setSpeakerphoneOn(boolean on) {

try {

//播放音频流类型

setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);

//获得当前类

Class audioSystemClass = Class.forName("android.media.AudioSystem");

//得到这个方法

Method setForceUse = audioSystemClass.getMethod("setForceUse", int.class, int.class);

if (on) {

audioManager.setMicrophoneMute(false);

audioManager.setSpeakerphoneOn(true);

audioManager.setMode(AudioManager.MODE_NORMAL);

// setForceUse.invoke(null, 1, 1);

} else {

audioManager.setSpeakerphoneOn(false);

audioManager.setMode(AudioManager.MODE_NORMAL);

setForceUse.invoke(null, 0, 0);

audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);

}

} catch (Exception e) {

e.printStackTrace();

}

}
http://download.csdn.net/detail/wl332197858/9508361
经过测试5.0,5.1可用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: