android听筒+扬声器自动切换,Android 听筒扬声器切换(多机型兼容、兼容5.0以上)...
目录
本以为是个很简单的切换,没想到搞了快一天。网络上各种答案,各种坑,浪费了大量的时间。
亲测有效机型(案例有限、仅供参考)
三星系: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以上)...相关推荐
- android 进度条自动增长,Android 进度条自动前进效果的实现代码
今天给大家分享进度条自动前进功能的实现,先给大家分享实现效果图,感觉不错可以参考实现代码. 效果如下图: 首先布局要设置进度条最大值: android:id="@+id/pro1" ...
- android系统相机自动录像,android 调用系统相机录像并保存
1.在AndroidManifest.xml中添加如下代码 tools:ignore="ProtectedPermissions" /> android:authoritie ...
- android 阅读器自动滚动,Android编程实现小说阅读器滑动效果的方法
本文实例讲述了Android编程实现小说阅读器滑动效果的方法.分享给大家供大家参考,具体如下: 看过小说都知道小说阅读器翻页有好多种效果,比如仿真翻页,滑动翻页,等等.由于某种原因,突然想写一个简单点 ...
- android如何设置自动补,Android Studio 中设置代码块自动补齐
AS中很多提示键,并不如Eclipse中做的好,需要我们自己去自定义.这里以switch...case为例,讲解一下如何设置代码自动补全. 1.进入settings --> Editor -- ...
- android ble 实现自动连接,Android:自动重新连接BLE设备
经过多次试验和磨难之后,这就是我最好让Android自动连接的唯一用户操作是首先选择设备(如果使用设置菜单然后首先配对). 您必须将配对事件捕获到BroadcastReceiver中并执行Blueto ...
- android如何不自动获取焦点,Android 如何让EditText不自动获取焦点
在项目中,一进入一个页面, EditText默认就会自动获取焦点. 那么如何取消这个默认行为呢? 在网上找了好久,有点 监听软键盘事件,有点 调用 clearFouse()方法,但是测试了都没有! x ...
- android蓝牙配对 自动联接,Android系统下蓝牙自动配对连接方法
Android系统下蓝牙自动配对连接方法 [专利摘要]本发明涉及一种Android系统下蓝牙自动配对连接方法,其包括如下步骤:步骤1.在Android设备端内存储上次进行蓝牙连接蓝牙外设的蓝牙地址,并 ...
- android看彩信自动退出,Android短彩信收发流程(应用层)
下图为ComposeMessageActivity中confirmSendMessageIfNeeded部分的信息发送流程.主要以接收者有效性的确认为主,然后转向sendMessage方法进行发送. ...
- android目录icon,自动裁剪Android ICON并保存到对应路径脚本
在给Android游戏或app打包时,经常会遇到有几十上百个渠道的问题.不同的渠道app的名字不一样,icon也可能不一样.程序员总是懒的,最烦手动去改来改去.因此用Python写了一个自动裁剪不同尺 ...
- android studio butterknife自动生成,Android Studio使用ButterKnife和Zelezny的方法
Android Studio使用ButterKnife和Zelezny的方法 发布时间:2020-08-22 00:29:27 来源:脚本之家 阅读:182 作者:CSDN_陈诚 前言 ButterK ...
最新文章
- GridControl摘录
- 在所有浏览器下一次性测试您的网站
- php生成有复杂结构的excel文档
- JavaScript基本数据类型讲解
- android使用自定义,Android 自定义View的使用
- 输入n个字符串字典序排序_30个Python奇淫技巧集
- 今天生日,高興!!!
- Scrum实践:每日站会
- JAVA关键字及作用
- Web性能测试工具:http_load安装使用简介
- 转 疯狂代码 大型网站架构系列(未完待续)
- 机房计算机组网方案,网络机房测试方案
- 决策支持系统是什么?
- php采标教程,国内液压与气动行业标准大全
- 【SystemVerilog基础】OOP思想之重载
- vmware14安装黑苹果max ox x 10.13懒人版教程
- 进程间通讯(IPC)(有信号捕捉函数)
- 小内存堆管理算法详细解析
- 无线桥接怎么设置网关和dns服务器,无线桥接怎么设置网关和dns服务器
- 龙芯(mips)+麒麟V10 electron适配
热门文章
- Excel获取目标时间点/日期的方法
- YOUTUBE API调用 JAVA
- uva 10780 分解质因数
- 用HTML搞一个汇率转换器,Currency Converter:实时汇率转换
- 毕设项目部署到服务器,在云服务器上做毕设
- 计算机硬盘小影响,系统C盘容量太小有哪些危害?又要如何扩容呢?今天再说一遍!...
- python实现图形旋转_图像随机旋转及坐标进行旋转原理及Python实现
- 约瑟夫问题c语言链表41人,约瑟夫问题 C语言链表实现
- 前端实现导入(excel文件)导出(word)文件
- 如何把视频压缩到最小?请看详细步骤