android 耳机线控的实现方法

keycodeonkeydownkeyevent
耳机线控的功能
耳机线控是一种很好用,并且能提升用户体验的功能。可以用来实现一些常用和基本的功能。比如:实现音乐播放的控制,接听电话,音量控制等。下面写一下耳机线控的几种实现方式。

耳机线控的实现
耳机线控实现方式主要有两种,(注:可能出现无法获取键值的问题,可能导致的原因是:1、驱动不支持;2、按键映射不正确)。
一种是前台的,前台的,在Activity 里处理,只有该Activity 在前台时才会处理按键。
重写onKeyUp()、onKeyDown(),它们分别处理放开事件和按下事件;
代码如下:
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {//放开事件处理,keyCode为按键的键值,event 为按键事件的对像,其中包含了按键的信息。
switch(keyCode){
case KeyEvent.KEYCODE_MEDIA_PREVIOUS://耳机三个按键是的上键,注意并不是耳机上的三个按键的物理位置的上下。
//按键功能定义的处理。

case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE://耳机单按键的按键或三按键耳机的中间按键。
case KeyEvent.KEYCODE_HEADSETHOOK://耳机单按键的按键或三按键耳机的中间按键。与上面的按键可能是相同的,具体得看驱动定义。
//按键功能定义的处理。一般与KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE、键的处理一样。

case KeyEvent.KEYCODE_MEDIA_NEXT://耳机三个按键是的下键,
//按键功能定义的处理。

}
return false;//为true,则其它后台按键处理再也无法处理到该按键,为false,则其它后台按键处理可以继续处理该按键事件。
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {//按下事件处理,同onKeyUp()方法。
switch(keyCode){
case KeyEvent.KEYCODE_MEDIA_PREVIOUS://耳机三个按键是的上键,注意并不是耳机上的三个按键的物理位置的上下。
//按键功能定义的处理。
//一般把功能定义为
//音乐:播放上一首
//视频:播放上一个视频或后退。
//收音机:向上搜索,
case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE://耳机单按键的按键或三按键耳机的中间按键。
case KeyEvent.KEYCODE_HEADSETHOOK://耳机单按键的按键或三按键耳机的中间按键。与上面的按键可能是相同的,具体得看驱动定义。
//按键功能定义的处理。一般与KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE、键的处理一样。
//一般把功能定义为:
音乐播放的播放和暂停
case KeyEvent.KEYCODE_MEDIA_NEXT://耳机三个按键是的下键,
//按键功能定义的处理。
//一般把功能定义为:
//音乐:播放下一首
//视频:播放下一个视频或前进。
//收音机:向下搜索,

}
return false;//为true,则其它后台按键处理再也无法处理到该按键,为false,则其它后台按键处理可以继续处理该按键事件。
}
@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {长按事件处理,同onKeyUp()方法。有的手机可能无法收到耳机的长按事件。
switch(keyCode){
case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
case KeyEvent.KEYCODE_HEADSETHOOK:
case KeyEvent.KEYCODE_MEDIA_NEXT:
}
return false;
}

另一种是注册监听,监听Intent.ACTION_MEDIA_BUTTON,后台处理按键事件,有优先级,有可能被拦截,接收不到按键事件。
实现方式如下:
1、注册监听Intent.ACTION_MEDIA_BUTTON,代码如下:

IntentFilter mediafilter = new IntentFilter();
//拦截按键KeyEvent.KEYCODE_MEDIA_NEXT、KeyEvent.KEYCODE_MEDIA_PREVIOUS、KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE
mediafilter.addAction(Intent.ACTION_MEDIA_BUTTON);
mediafilter.setPriority(100);//设置优先级,优先级太低可能被拦截,收不到信息。一般默认优先级为0,通话优先级为1,该优先级的值域是-1000到1000。
registerReceiver(mediaButtonReceiver, mediafilter);

2、处理广播信息。
private BroadcastReceiver mediaButtonReceiver = new BroadcastReceiver() {

@Override
public void onReceive(Context context, Intent intent) {
boolean isActionMediaButton = Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction());  //判断是不是耳机按键事件
if(!isActionMediaButton) return; 
KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);  //判断有没有耳机按键事件
if(event==null) return; 
//过滤按下事件
boolean isActionUp = (event.getAction()==KeyEvent.ACTION_UP); 
if(!isActionUp) return; 
//避免在Receiver里做长时间的处理,使得程序在CPU使用率过高的情况下出错,把信息发给handlera处理。
int keyCode = event.getKeyCode(); 
long eventTime = event.getEventTime()-event.getDownTime();//按键按下到松开的时长 
Message msg = Message.obtain(); 
msg.what = 100; 
Bundle data = new Bundle(); 
data.putInt("key_code", keyCode); 
data.putLong("event_time", eventTime); 
msg.setData(data); 
handler.sendMessage(msg);

//终止广播(不让别的程序收到此广播,免受干扰) 
abortBroadcast();
}
};
3、在handler中处理按键事件。
private Handler handler = new Handler(){
@Override 
public void handleMessage(Message msg) { 
int what = msg.what; 
switch(what){ 
case 100: 
Bundle data = msg.getData(); 
//按键值 
int keyCode = data.getInt("key_code"); 
//按键时长 
long eventTime = data.getLong("event_time"); 
//设置超过1000毫秒,就触发长按事件  //谷歌把超过1000s定义为长按。
boolean isLongPress = (eventTime>1000); 
switch(keyCode){ 
case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE://播放或暂停 
playOrPause(); 
break; 
//短按=播放下一首音乐,长按=音量加 
case KeyEvent.KEYCODE_MEDIA_NEXT: 
if(isLongPress){ 
adjustVolume(true);//自定义 
}else{ 
playNext();//自定义 

break; 
//短按=播放上一首音乐,长按=音量减   
case KeyEvent.KEYCODE_MEDIA_PREVIOUS: 
if(isLongPress){ 
adjustVolume(false);//自定义 
}else{ 
playPrevious();//自定义 

break; 

break; 
default://其他消息-则扔回上层处理 
super.handleMessage(msg); 


};
//注:这种方法处理长按之前一定会先执行短按。

MTK Android 耳机线控的实现方法的更多相关文章

  1. Android耳机线控具体解释,蓝牙耳机button监听(仿酷狗线控效果)

    转载请注明出处:http://blog.csdn.net/fengyuzhengfan/article/details/46461253 当耳机的媒体按键被单击后.Android系统会发出一个广播.该 ...

  2. 红米1S Mokee4.4.4 本人编译版耳机线控改动调音量以及上下曲方法

    改动的文件为,用Re管理器编辑: system/usr/keylayout/msm8226-tapan-snd-card_Button_Jack.kl 默认的耳机线控的上下键是切换上下曲功能,因此此文 ...

  3. iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控

    -- iOS事件全面解析 概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的,这不愧为一项伟大的设计.今天我们就针对iOS的触摸事 ...

  4. iOS-触摸事件、手势识别、摇晃事件、耳机线控

    概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的,这不愧为一项伟大的设计.今天我们就针对iOS的触摸事件(手势操作).运动事件. ...

  5. 转发:iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控

    -- iOS事件全面解析 转载来自崔江涛(KenshinCui) 链接:http://www.cnblogs.com/kenshincui/p/3950646.html 概览 iPhone的成功很大一 ...

  6. iphone 耳机 线控

    有电话呼入时: 按一次接听电话: 快速按两次将电话转到语音信箱: 通话中: 按一次挂断电话: 通话中如果有第二个电话打进来时: 按一次保留当前通话并接听第二个电话: 按住两秒钟不放忽略(拒绝接听)第二 ...

  7. iOS 耳机线控

    当你使用iphone的时候听音乐的时候,播放器在后台运行的时候,你仍然可以通过耳机来进行操作,完成曲目切换,快进,快退等功能!当然你的程序不一定是播放器应用,但是我们仍然可以让它具有这个功能,让用户通 ...

  8. 聊聊iOS开发中耳机的那点事(监听耳机拔插、耳机线控)-b

    如果说一个项目出现的最重大的事故,那无疑就是开发人员使用了不可控的元素. 前言 iOS开发当中有关于视音频播放的开发不在少数,用户时常会使用到一种输出设备,那就是"耳机",这一篇博 ...

  9. Android蓝牙线控切歌、连接状态监听(无线耳机也适用)

    1. 监听蓝牙设备(音频)连接状态 所有代码已测试在Android11也能正常使用 (Android SDK 30) 首先新建一个广播类 BluetoothStateReceiver /** * @a ...

随机推荐

  1. RPA如何跑赢传统自动化和人工?

    过去的4年时间里,RPA(机器人流程自动化)一词,在Gartner的搜索引擎中一直排名前五.去年Gartner发表的调查数据中显示,RPA行业在2018年保持了60%以上的增长速度,从而成为全球增长最 ...

  2. ajax3

    json json:JavaScript对象表示方法(JavaScript object notation) json:是存储和交换文本信息的语法,类似与xml.他使用键值对的方式来组织,易于人们阅读 ...

  3. 使用MySql对IdentityServer4进行持久化

    哈喽大家好,看见网上很少有使用MySql进行持久化的,毕竟又很多坑,说句实话,就连 MySql.Data.EntityFrameworkCore 都有问题,不知道是.net core更新太快还是其它的 ...

  4. 谈谈一些逻辑相同,性能差异却很大的sql

    总结写在前面: 1. 本篇讲述了三个例子,其本质都是揭示了若对索引字段做函数操作,可能会破坏索引值的有序性,由此优化器就决定放弃走树搜索功能. 2. 由第1点提供了一个优化思路,即我们能否避免或转化s ...

  5. HDU 5448 Marisa’s Cake

    给定一个由n个整点构成的凸多边形,求从n个点里任意选不少于3个点组成的所有凸多边形的面积之和,显然整点构成的多边形面积一定是0.5的整数倍,所以题目需要你算出答案的2倍 mod1000000007的值 ...

  6. void指针和数组指针之间的转换

    由于void* 可以被任何指针赋值,所以以void*作为函数参数可以使得接口更容易接受不同类型的参数,不过需要注意的时,实际操作时还需要利用强制类型转换,将指针转换为原类型,否则在内存上会有问题. 一 ...

  7. Python-文件操作-之优化购物车

    #此次购物车优化,主要使用了文件操作的相关方法,有买家入口,和商家入口 一.买家入口 1.买家第一次启动程序输入金额,金额会记录到文件里,再登录就读取文件里保存的金额,买家可以购买商品,按 ‘q’ 退 ...

  8. 学习笔记----C语言的面向对象

    2020-03-26    21:27:17 面向对象的编程语言都有一个类的概念,像Java.python等.类是对特定数据的特定操作的集合体.它包含两个范畴:数据和操作.C语言是没有类的概念的,但是 ...

  9. DRF之restful规范、Postman接口测试

    一. DRF简介 Django REST框架是一个功能强大且灵活的工具包,用于构建Web API. 使用REST框架的一些原因: 该网站可浏览API是你的开发人员一个巨大的可用性胜利. 身份验证策略包 ...

  10. 【西北大学集训队选拔赛】D温暖的签到题(自创数据结构)

    题目链接 #include <bits/stdc++.h> #define NUM #define ll long long using namespace std; int n, m; ...