目录

本以为是个很简单的切换,没想到搞了快一天。网络上各种答案,各种坑,浪费了大量的时间。

亲测有效机型(案例有限、仅供参考)

三星系:SM-A9000、SM-S5

魅族系:魅蓝E(yun os)、魅蓝note5

小米系:红米1s、小米note

Vivo系:忘了什么型号了

代码

/** * ================================================ * 作 者:JayGoo * 版 本:1.1.0 * 创建日期:2016/11/24 * 描 述:音频听筒扬声器切换控制器 * ================================================ */

public class AudioModeManger {

private AudioManager audioManager;

private SensorManager sensorManager;

private Sensor mProximiny;

private onSpeakerListener mOnSpeakerListener;

/** * 扬声器状态监听器 * 如果要做成类似微信那种切换后重新播放音频的效果,需要这个监听回调 * isSpeakerOn 扬声器是否打开 */

public interface onSpeakerListener{

void onSpeakerChanged(boolean isSpeakerOn);

}

public void setOnSpeakerListener(onSpeakerListener listener){

if (listener != null){

mOnSpeakerListener = listener;

}

}

public AudioModeManger(){

}

/** * 距离传感器监听者 */

private SensorEventListener mDistanceSensorListener = new SensorEventListener() {

@Override

public void onSensorChanged(SensorEvent event) {

float f_proximiny = event.values[0];

//扬声器模式

//魅蓝E传感器得到的值竟然比最大值都要大?what fuck ?

if (f_proximiny >= mProximiny.getMaximumRange()) {

setSpeakerPhoneOn(true);

if (mOnSpeakerListener != null){

mOnSpeakerListener.onSpeakerChanged(true);

}

} else {//听筒模式

setSpeakerPhoneOn(false);

if (mOnSpeakerListener != null){

mOnSpeakerListener.onSpeakerChanged(false);

}

}

}

@Override

public void onAccuracyChanged(Sensor sensor, int accuracy) {

}

};

/** * 注册距离传感器监听 */

public void register(){

audioManager = (AudioManager) SMApp.getInstance()

.getSystemService(Context.AUDIO_SERVICE);

sensorManager = (SensorManager) SMApp.getInstance()

.getSystemService(Context.SENSOR_SERVICE);

if (sensorManager != null && mDistanceSensorListener != null) {

mProximiny = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);

sensorManager.registerListener(mDistanceSensorListener, mProximiny,

SensorManager.SENSOR_DELAY_NORMAL);

}

}

/** * 取消注册距离传感器监听 */

public void unregister(){

if (sensorManager != null &&mDistanceSensorListener != null ) {

sensorManager.unregisterListener(mDistanceSensorListener);

}

}

/** * 听筒、扬声器切换 * * 注释: 敬那些年踩过的坑和那些网上各种千奇百怪坑比方案!! * * AudioManager设置声音类型有以下几种类型(调节音量用的是这个): * * STREAM_ALARM 警报 * STREAM_MUSIC 音乐回放即媒体音量 * STREAM_NOTIFICATION 窗口顶部状态栏Notification, * STREAM_RING 铃声 * STREAM_SYSTEM 系统 * STREAM_VOICE_CALL 通话 * STREAM_DTMF 双音多频,不是很明白什么东西 * * ------------------------------------------ * * AudioManager设置声音模式有以下几个模式(切换听筒和扬声器时setMode用的是这个) * * MODE_NORMAL 正常模式,即在没有铃音与电话的情况 * MODE_RINGTONE 铃响模式 * MODE_IN_CALL 接通电话模式 5.0以下 * MODE_IN_COMMUNICATION 通话模式 5.0及其以上 * *@param on */

private void setSpeakerPhoneOn(boolean on) {

if (on) {

audioManager.setSpeakerphoneOn(true);

audioManager.setMode(AudioManager.MODE_NORMAL);

//设置音量,解决有些机型切换后没声音或者声音突然变大的问题

audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,

audioManager.getStreamVolume(AudioManager.STREAM_MUSIC), AudioManager.FX_KEY_CLICK);

} else {

audioManager.setSpeakerphoneOn(false);

//5.0以上

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){

audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);

//设置音量,解决有些机型切换后没声音或者声音突然变大的问题

audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL,

audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL), AudioManager.FX_KEY_CLICK);

} else {

audioManager.setMode(AudioManager.MODE_IN_CALL);

audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL,

audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL), AudioManager.FX_KEY_CLICK);

}

}

}

}

用法

第一步:注册监听器

*可以放到Activity的onCreate中或者封装到音频管理器中(建议)*

if (audioModeManger == null) {

audioModeManger = new AudioModeManger();

}

audioModeManger.register();

第二步:释放监听器

*可以放到Activity的onDestory中或者封装到音频管理器中(建议)*

if (audioModeManger != null)

audioModeManger.unregister();

第三步:权限

Demo

Feature

1、插入耳机监听

2、某些机型可能存在切换时卡顿、丢音的情况,建议采取微信的方案,重新播放音频,最佳

android听筒+扬声器自动切换,Android 听筒扬声器切换(多机型兼容、兼容5.0以上)...相关推荐

  1. android 进度条自动增长,Android 进度条自动前进效果的实现代码

    今天给大家分享进度条自动前进功能的实现,先给大家分享实现效果图,感觉不错可以参考实现代码. 效果如下图: 首先布局要设置进度条最大值: android:id="@+id/pro1" ...

  2. android系统相机自动录像,android 调用系统相机录像并保存

    1.在AndroidManifest.xml中添加如下代码 tools:ignore="ProtectedPermissions" /> android:authoritie ...

  3. android 阅读器自动滚动,Android编程实现小说阅读器滑动效果的方法

    本文实例讲述了Android编程实现小说阅读器滑动效果的方法.分享给大家供大家参考,具体如下: 看过小说都知道小说阅读器翻页有好多种效果,比如仿真翻页,滑动翻页,等等.由于某种原因,突然想写一个简单点 ...

  4. android如何设置自动补,Android Studio 中设置代码块自动补齐

    AS中很多提示键,并不如Eclipse中做的好,需要我们自己去自定义.这里以switch...case为例,讲解一下如何设置代码自动补全. 1.进入settings -->  Editor -- ...

  5. android ble 实现自动连接,Android:自动重新连接BLE设备

    经过多次试验和磨难之后,这就是我最好让Android自动连接的唯一用户操作是首先选择设备(如果使用设置菜单然后首先配对). 您必须将配对事件捕获到BroadcastReceiver中并执行Blueto ...

  6. android如何不自动获取焦点,Android 如何让EditText不自动获取焦点

    在项目中,一进入一个页面, EditText默认就会自动获取焦点. 那么如何取消这个默认行为呢? 在网上找了好久,有点 监听软键盘事件,有点 调用 clearFouse()方法,但是测试了都没有! x ...

  7. android蓝牙配对 自动联接,Android系统下蓝牙自动配对连接方法

    Android系统下蓝牙自动配对连接方法 [专利摘要]本发明涉及一种Android系统下蓝牙自动配对连接方法,其包括如下步骤:步骤1.在Android设备端内存储上次进行蓝牙连接蓝牙外设的蓝牙地址,并 ...

  8. android看彩信自动退出,Android短彩信收发流程(应用层)

    下图为ComposeMessageActivity中confirmSendMessageIfNeeded部分的信息发送流程.主要以接收者有效性的确认为主,然后转向sendMessage方法进行发送. ...

  9. android目录icon,自动裁剪Android ICON并保存到对应路径脚本

    在给Android游戏或app打包时,经常会遇到有几十上百个渠道的问题.不同的渠道app的名字不一样,icon也可能不一样.程序员总是懒的,最烦手动去改来改去.因此用Python写了一个自动裁剪不同尺 ...

  10. android studio butterknife自动生成,Android Studio使用ButterKnife和Zelezny的方法

    Android Studio使用ButterKnife和Zelezny的方法 发布时间:2020-08-22 00:29:27 来源:脚本之家 阅读:182 作者:CSDN_陈诚 前言 ButterK ...

最新文章

  1. GridControl摘录
  2. 在所有浏览器下一次性测试您的网站
  3. php生成有复杂结构的excel文档
  4. JavaScript基本数据类型讲解
  5. android使用自定义,Android 自定义View的使用
  6. 输入n个字符串字典序排序_30个Python奇淫技巧集
  7. 今天生日,高興!!!
  8. Scrum实践:每日站会
  9. JAVA关键字及作用
  10. Web性能测试工具:http_load安装使用简介
  11. 转 疯狂代码 大型网站架构系列(未完待续)
  12. 机房计算机组网方案,网络机房测试方案
  13. 决策支持系统是什么?
  14. php采标教程,国内液压与气动行业标准大全
  15. 【SystemVerilog基础】OOP思想之重载
  16. vmware14安装黑苹果max ox x 10.13懒人版教程
  17. 进程间通讯(IPC)(有信号捕捉函数)
  18. 小内存堆管理算法详细解析
  19. 无线桥接怎么设置网关和dns服务器,无线桥接怎么设置网关和dns服务器
  20. 龙芯(mips)+麒麟V10 electron适配

热门文章

  1. Excel获取目标时间点/日期的方法
  2. YOUTUBE API调用 JAVA
  3. uva 10780 分解质因数
  4. 用HTML搞一个汇率转换器,Currency Converter:实时汇率转换
  5. 毕设项目部署到服务器,在云服务器上做毕设
  6. 计算机硬盘小影响,系统C盘容量太小有哪些危害?又要如何扩容呢?今天再说一遍!...
  7. python实现图形旋转_图像随机旋转及坐标进行旋转原理及Python实现
  8. 约瑟夫问题c语言链表41人,约瑟夫问题 C语言链表实现
  9. 前端实现导入(excel文件)导出(word)文件
  10. 如何把视频压缩到最小?请看详细步骤