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

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

        工作一年多了,一直也没使用过硬件方面的东西,本周在公司遇见一个问题,公司要做个对讲项目,播放声音的时候,要在扬声器和听筒进行切换。然后我的工作也来了,我以为很简单,从网上搜的也很简单,但问题来了,网上的版本都是对于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 扬声器和听筒切换兼容5.0以上版本)