在工作中,我们有时候会处理到耳机按键的逻辑,主要分为两类,一种是短按,一种是长按。

监听耳机的按键事件的方法有两种:

方法一:注册监听Media Button的按键事件

import android.app.Activity;

import android.app.ProgressDialog;

import android.content.BroadcastReceiver;

import android.content.ComponentName;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

import android.media.AudioManager;

import android.os.Bundle;

import android.util.Log;

import android.view.KeyEvent;

public class MainActivity extends Activity {

private AudioManager mAudioManager;

private ComponentName mComponentName;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

// AudioManager注册一个MediaButton对象

mComponentName = new ComponentName(getPackageName(), MediaButtonReceiver.class.getName());

}

@Override

protected void onResume() {

mAudioManager.registerMediaButtonEventReceiver(mComponentName);

registerReceiver(headSetReceiver, new IntentFilter(Intent.ACTION_HEADSET_PLUG));

super.onResume();

}

@Override

protected void onPause() {

// 取消注册

mAudioManager.unregisterMediaButtonEventReceiver(mComponentName);

unregisterReceiver(headSetReceiver);

super.onPause();

}

@Override

protected void onDestroy() {

mAudioManager = null;

mComponentName = null;

super.onDestroy();

}

private final BroadcastReceiver headSetReceiver = new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

String action = intent.getAction();

if (action.equals(Intent.ACTION_HEADSET_PLUG)) {

// phone headset plugged

if (intent.getIntExtra("state", 0) == 1) {

// do something

//Log.d(TAG, "耳机检测:插入");

//Toast.makeText(context, "耳机检测:插入", Toast.LENGTH_SHORT) .show();

mAudioManager.registerMediaButtonEventReceiver(mComponentName);

// phone head unplugged

} else {

// do something

//Log.d(TAG, "耳机检测:没有插入");

//Toast.makeText(context, "耳机检测:没有插入", Toast.LENGTH_SHORT).show();

mAudioManager.unregisterMediaButtonEventReceiver(mComponentName);

}

}

}

};MediaButtonReceiver.javaimport android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.util.Log;

import android.view.KeyEvent;

import android.widget.Toast;

public class MediaButtonReceiver extends BroadcastReceiver {

private static String TAG = "MediaButtonReceiver";

@Override

public void onReceive(Context context, Intent intent) {

// 获得Action

String intentAction = intent.getAction();

// 获得KeyEvent对象

KeyEvent keyEvent = (KeyEvent) intent

.getParcelableExtra(Intent.EXTRA_KEY_EVENT);

Log.i(TAG, "Action ---->" + intentAction + " KeyEvent----->"

+ keyEvent.toString());

// 按下 / 松开 按钮

int keyAction = keyEvent.getAction();

if (Intent.ACTION_MEDIA_BUTTON.equals(intentAction)

&& (KeyEvent.ACTION_DOWN == keyAction)) {

// 获得按键字节码

int keyCode = keyEvent.getKeyCode();

// 获得事件的时间

// long downtime = keyEvent.getEventTime();

// 获取按键码 keyCode

//StringBuilder sb = new StringBuilder();

这些都是可能的按键码 , 打印出来用户按下的键

//if (KeyEvent.KEYCODE_MEDIA_NEXT == keyCode) {

//sb.append("KEYCODE_MEDIA_NEXT");

//}

// 说明:当我们按下MEDIA_BUTTON中间按钮时,实际出发的是 KEYCODE_HEADSETHOOK 而不是

// KEYCODE_MEDIA_PLAY_PAUSE

if (KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE == keyCode) {

//sb.append("KEYCODE_MEDIA_PLAY_PAUSE");

}

if (KeyEvent.KEYCODE_HEADSETHOOK == keyCode) {

//sb.append("KEYCODE_HEADSETHOOK");

}

if (KeyEvent.KEYCODE_MEDIA_PREVIOUS == keyCode) {

//sb.append("KEYCODE_MEDIA_PREVIOUS");

}

if (KeyEvent.KEYCODE_MEDIA_STOP == keyCode) {

//sb.append("KEYCODE_MEDIA_STOP");

}

// 输出点击的按键码

//Log.i(TAG, sb.toString());

//Toast.makeText(context, sb.toString(), Toast.LENGTH_SHORT).show();

} else if (KeyEvent.ACTION_UP == keyAction) {

Log.i("chengjie", "aaa");

}

}

}注意,在AndroidManifest.xml中定义

注意这种方法只能监听耳机的短按事件,如果想监听长按事件,请用方法二。

方法二:直接监听onKeyDown方法

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

if (KeyEvent.KEYCODE_HEADSETHOOK == keyCode) { //按下了耳机键

if (event.getRepeatCount() == 0) { //如果长按的话,getRepeatCount值会一直变大

//短按

} else {

//长按

}

}

}

原文:http://blog.csdn.net/shineflowers/article/details/44857549

android监听耳机,Android监听耳机按键事件相关推荐

  1. Android APP:检测实体按键事件

    Android APP:检测实体按键事件 一.检测点击按键事件一般不对手机上的输入按键进行处理,直接由系统按照默认情况操作.当然有时为了改善用户体验,需要让应用拦截按键事件,并进行额外处理. 要想监控 ...

  2. android gridview 按钮事件处理,Android TV gridview 的按键事件响应巧变 事件分发机制...

    在gridview点击事件之后,打log看了下, 看到gridview的onclick事件响应的竟然排在onkeyup之后,这造成100~200ms的延迟啊, 后来换了在其它响应事件里面截取,但是在o ...

  3. Android 监听Home键按键事件

    Android 监听Home键按键事件 标签(空格分隔):Android Home键 在Android开发中有很多按键事件需要在App中捕获从而做出一些针对性的操作,例如返回键,音量键等都可以直接在d ...

  4. Android按键事件——上层与驱动的映射

    http://blog.csdn.net/zengdaquan007/article/details/8686431 首先查看android对上层按键事件的定义,在头文件<KeycodeLabe ...

  5. android 原生按键事件触发

    在项目中遇到了这样的问题,系统层修改了android原生逻辑,按键事件有mcu直接上报,没有走android原生的事件分发流程,因此不会触发onKeyDown/onKeyUp方法的回调,可以使用如下方 ...

  6. Android事件处理之处理键盘事件

    1.在Android开发中,首先和用户交互的是界面,接着就是事件处理,对于如今的图形界面应用程序,都是通过事件来实现人机交互的.事件就是用户对图形界面的操作,在Android手机和平板电脑上,主要包括 ...

  7. android自动屏幕点击事件,Android 中屏幕点击事件的实现

    在android下,事件的发生是在监听器下进行,android系统可以响应按键事件和触摸屏事件,事件说明如下: 常用实现OnClickListener,OnTouchListener,OnFocusC ...

  8. Android后台监听耳机(线控、蓝牙)按键事件

    在Activity中重写onKeyDown.onKeyUp这些方法只适用于APP在前台的情况,如果将APP切换到后台就失效了. 经过网上一番摸索.读源码,终于把这个功能整出来了,说一下我的实现过程. ...

  9. Android系统中自定义按键的短按、双击、长按事件

    在项目中碰到这样的问题: 由于系统中的按键在底层做了重新定义或者新增了按键,此时需要在APP层对按键事件(keyevent)做分解处理,模拟Android系统做法,把keyevent分解成: 1.单击 ...

最新文章

  1. 相持不下的争论:脑波,有用吗?
  2. AI:**消灭程序员需要一百年吗?
  3. Android系统中通过shell命令实现wifi的连接控制
  4. SAP自学指南:案例公司的SAP解决方案
  5. Java 中 notify 和 notifyAll 有什么区别?
  6. mac使用allure_制作测试报告,allure,生成
  7. eclipse中git分支创建与合并(-)
  8. 彻底理解python3的编码和解码过程
  9. win10设置任务栏全透明、免安装第三方软件
  10. linux网盘客户端,Linux下的百度网盘客户端BaiduPCS-Go
  11. 《软件测试》第十二章 文档测试
  12. 招生啦!清华大学SIGS人工智能硕士项目2021年硕士研究生普通招考说明
  13. 第五人格服务器维护中请稍后登录,第五人格:国际服维护重大故障,刚开精华二,却登录不了游戏...
  14. git第一次提交代码到远程仓库
  15. 如何判断外汇平台是否整个?MT4外汇投资靠谱吗?
  16. 中国剩余定理(也叫孙子定理)
  17. spring-session(一)揭秘
  18. h5页面苹果手机不兼容普通点击事件
  19. 南京python周末培训
  20. 漫谈程序员系列:快来约这些女生,保你脱单

热门文章

  1. c语言cast的用法,static_cast 用法
  2. 深度探索Hyperledger技术与应用之超级账本的典型交易流程
  3. 关于数据安全及保密(基于大数据板块的整理)
  4. Nginx的介绍与使用
  5. linux运维是做什么工作的?有哪些岗位?
  6. 服务器sata硬盘安装系统,#####SATA、RAID、SCSI硬盘用U盘安装原版XP、2003系统######支持服务器硬盘!...
  7. call指令和ret指令【笔记+详解】
  8. JS邮箱验证_手机号码验证_电话号码验证-正则验证
  9. 安卓开发必备知识体系:Java篇
  10. 在本地如何启动Vue项目