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可用。
相关文章推荐
- Android开发-------Android的IPC机制
- android TextView滚动、添加图片、设置颜色
- android:ems什么意思
- android卫星菜单的简单实现
- Android下am和pm命令简介
- [android] 轮播图-滑动图片标题焦点
- ListView从入门到中级,android菜鸟级别,
- android客户端和php服务简单交互
- Android手机客户端与服务器端的信息通信交互
- Android之Activity
- Android Studio 进阶详细配置
- 解决Android Studio倒入项目或者打开项目卡死
- android 小技巧
- 给大家推荐一些学习android的书籍(第一篇博客)
- Android 使用LayerDrawable自定制SeekBar的外观
- AndroidStudio项目提交(更新)到github最详细步骤
- Android ListView点击事件无反应
- 安卓中通过intent组件跳转到系统联系人编辑界面,及具体案例分析
- Android自学笔记(一)
- android sha1和签名证书的学习