首页 > 其他分享 >[android]使用线控耳机来操控应用功能

[android]使用线控耳机来操控应用功能

时间:2023-06-13 19:07:01浏览次数:41  
标签:耳机 KeyEvent msg handler 线控 import android event


使用线控耳机来操控应用功能

 

 

实现原理:通过广播拦截来实现。

 

(一)定义1个广播拦截器,用来拦截线控耳机按键产生的广播事件。

 

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.KeyEvent;

public class MediaButtonReceiver extends BroadcastReceiver {
	
	/**
	 * Handler
	 */
	private Handler handler;
	
	/**
	 * 构造器.
	 * @param handler
	 */
	public MediaButtonReceiver(Handler handler) {
		this.handler = handler;
	}

	@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;
		
		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();
	}
}

 

(二)在主程序的处理:

 

(1)定义并注册广播服务

//初始化Handler对象
    	MyHandler handler = new MyHandler();
    	//初始化媒体(耳机)广播对象.
    	MediaButtonReceiver mediaButtonReceiver = new MediaButtonReceiver(handler);
    	//注册媒体(耳机)广播对象
    	IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);
    	intentFilter.setPriority(100);
    	registerReceiver(mediaButtonReceiver, intentFilter);

 

(2)定义MyHandler和处理广播发回的消息:

private class MyHandler extends 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");
				//设置超过2000毫秒,就触发长按事件
				boolean isLongPress = (eventTime>2000);
				
				switch(keyCode){
				case KeyEvent.KEYCODE_HEADSETHOOK://播放或暂停
				case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE://播放或暂停
					playOrPause();
					break;
					
				//短按=播放下一首音乐,长按=当前音乐快进
				case KeyEvent.KEYCODE_MEDIA_NEXT:
					if(isLongPress){
						fastNext(1);//自定义
					}else{
						playNext();//自定义
					}
					break;
					
				//短按=播放上一首音乐,长按=当前音乐快退	
				case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
					if(isLongPress){
						fastPrevious(1);//自定义
					}else{
						playPrevious();//自定义
					}
					break;
				}
				
				break;
			default://其他消息-则扔回上层处理
				super.handleMessage(msg);
			}
		}
	}

(3)应用程序退出的时候,别忘了取消注册的广播拦截器。

unregisterReceiver(mediaButtonReceiver);

 

 

 

 

 

 

标签:耳机,KeyEvent,msg,handler,线控,import,android,event
From: https://blog.51cto.com/u_16160131/6471961

相关文章

  • android调用系统发短信界面功能
    android调用系统发短信界面功能 Intentintent=newIntent(Intent.ACTION_SENDTO,Uri.parse("smsto:13xxxxxxx")); startActivity(intent); 需要的权限: <uses-permissionandroid:name="android.permission.SEND_SMS"></uses-permission>......
  • Android中杀掉当前进程
    android.os.Process.killProcess(android.os.Process.myPid())killProcess方法用于杀掉一个进程,它接收一个进程ID参数,我们可以通过myPid()方法获取当前程序的进程id。需要注意的是,killProcess()方法只能用于杀掉当前程序的进程,不能杀掉其他程序。......
  • Android的服务Service
    Android学了太久了,都忘了。复习下四大组件之一的Service。介绍Android的Service是一种在后台执行长时间运行操作的组件,它可以在没有用户界面的情况下执行任务,并且可以与应用程序的其他组件进行通信。Service通常用于处理网络请求、音乐播放、数据同步等需要在后台持续运行的任务......
  • Android-RIL&IMS源码分析
    一、需求1、了解IMS相关知识体系2、RILD与RILJ、IMS回调消息的机制二、相关概念2.1IMS        IMS全称是IPMultimediaSubsystem,中文意义为IP多媒体子系统。IMS是一种基于IP基础结构,能够融合数据、话音和移动等网络技术的系统。        IP=基于IP的......
  • 小米MIX 2升级Lineage OS 20(Android 13)卡进度0%
    参考lineageoswiki安装时sideload会卡进度0%,电脑终端卡在serving'lineage-20.0-20230608-nightly-chiron-signed.zip'(~0%)手机端卡在Verifyingupdatepackage...wiki步骤基本步骤:#重启到fastbootadbrebootbootloader#连接设备fastbootdevices#刷recoveryf......
  • Android 12 addWindow过程分析
    1背景分析过Window层级结构之后,以addWindow为切入点看一下系统是怎么使用的。而且addWindow也是系统非常重要的一个环节,无论是Activity(PhoneWindow)还是各种系统窗口,都会走到这里。addView举例:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/Sta......
  • Android自动化随机测试工具-Monkey测试心得
    心得一Monkey测试Android应用,尤其是在测试长时间的稳定性和健壮性时,切勿盲目的使用--throttle参数。我们的测试思路应该是:第一次,我们尽量先不使用--throttle参数,执行事件计数少点,比如300或500。执行完后,记录下所需要的时间。接下来,我们使用第一次的Monkey命令,加......
  • Android Handler 详解
    概述为了避免多个线程同时更新UI,导致不可预知的错误;所以现今几乎所有的GUI框架都只允许在主线程修改UI;因此这些框架都选择了消息驱动编程模型;消息驱动编程模型有以下几个组件:消息队列:存储待处理的消息分发器:将不同事件分发到不同的业务逻辑单元消息通道:分发器和处理器......
  • kanzi的android程序修改包名和应用程序名字
    1、修改进程名: 2、修改应用程序名字: 3、修改系统调度ID 通知权限 ......
  • scrcpy——Android投屏神器(使用教程)
    scrcpy简介简单地来说,scrcpy就是通过adb调试的方式来将手机屏幕投到电脑上,并可以通过电脑控制您的Android设备。它可以通过USB连接,也可以通过Wifi连接(类似于隔空投屏),而且不需要任何root权限,不需要在手机里安装任何程序。scrcpy同时适用于GNU/Linux,Windows和macOS。它的一些特......