通过AccessibilityService实现系统按键监听
来源:互联网 发布:ps命令详解 linux 编辑:程序博客网 时间:2024/06/10 02:46
真是孤陋寡闻了,一直只知道android的辅助功能,竟然不知道还有辅助类存在可以帮助第三方监听系统事件。查阅网上几乎跟AccessibilityService有关的应用都是跟微信抢红包有关系,而我这本由于项目需要,需要在apk挂起后台之后,依然可以监听系统的按键事件。
起初觉得这样的需求蛮简单,监听keydown不就好了。操作起来才发现我真的是too young too simple,keydown这几个函数只能在apk内部监听,一旦退居后台,他们几个一点办法都木有。
在网上溜达了一圈,发现了这个AccessibilityService功能,其实如果做成系统函数,实现性会更好。下次有机会再尝试下如何将第三方应用做成系统函数。
言归正传,继续我的系统按键监听功能。具体代码实行就是套路了
在AndroidManifest.xml中进行如下配置:
<service android:name="krelve.demo.rob.RobMoney" android:enabled="true" android:exported="true" android:label="@string/app_name" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" > <intent-filter> <action android:name="android.accessibilityservice.AccessibilityService" /> </intent-filter> <meta-data android:name="android.accessibilityservice" android:resource="@xml/rob_service_config" /> </service>
RobMoney.java文件,是通过继承AccessibilityService这个类,来实现对按键监听之后所做处理的地方。
public class RobMoney extends AccessibilityService { private static final String TAG = "dxj"; @Override protected boolean onKeyEvent(KeyEvent event) { Log.i(TAG, "onKeyEvent"); int key = event.getKeyCode(); switch(key){ case KeyEvent.KEYCODE_VOLUME_DOWN: Intent downintent = new Intent("com.exmaple.broadcaster.KEYDOWN"); downintent.putExtra("dtime", System.currentTimeMillis()); sendBroadcast(downintent); Log.i(TAG, "KEYCODE_VOLUME_DOWN"); break; case KeyEvent.KEYCODE_VOLUME_UP: Intent upintent = new Intent("com.exmaple.broadcaster.KEYUP"); upintent.putExtra("utime", System.currentTimeMillis()); sendBroadcast(upintent); Log.i(TAG, "KEYCODE_VOLUME_UP"); break; } return super.onKeyEvent(event); } @Override public void onInterrupt() { } @Override public void onCreate() { Log.i(TAG, "RobMoney::onCreate"); super.onCreate(); } @Override public void onAccessibilityEvent(AccessibilityEvent event) { // TODO Auto-generated method stub }}
rob_service_config.xml这个文件是对AccessibilityService所对应的配置处理文件。
<?xml version="1.0" encoding="utf-8"?><accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" android:accessibilityEventTypes="typeAllMask" android:accessibilityFeedbackType="feedbackGeneric" android:accessibilityFlags="flagRequestFilterKeyEvents" android:canRetrieveWindowContent="true" android:canRequestFilterKeyEvents="true" android:description="@string/accessibility_description" android:notificationTimeout="100"/>
由于是对事件监听,所以android:accessibilityFlags=”flagRequestFilterKeyEvents”,同时注意,Android:accessibilityFlags不能使用默认的,android:canRequestFilterKeyEvents必须为true,默认的是false。
采用辅助类有一个缺点就是需要用户手动同意打开关于按键监听的辅助功能,当然,也可以作为系统应用实现监听。这样就可以通过代码开启对应的辅助功能。
只要理解了原理,其实整个代码写起来就很简单了,都是套路。
附上代码用例一份,监听事件之后,在time显示按键按下的时间列表。请参考哦。
Demo
- 通过AccessibilityService实现系统按键监听
- 通过代码调整系统音量,监听音量实体按键事件
- 按键监听实现Fragment跳转
- Android通过AccessibilityService实现微信自动回复功能
- Android通过AccessibilityService实现微信自动回复功能
- Android 监听系统虚拟导航栏按键
- 按键监听
- 按键监听
- android4.0以上版本监听home按键 通过监听log的方式监听home按钮
- Android通过Intent.ACTION_CLOSE_SYSTEM_DIALOGS监听Home按键消息
- Android通过Intent.ACTION_CLOSE_SYSTEM_DIALOGS监听Home按键消息
- Android通过Intent.ACTION_CLOSE_SYSTEM_DIALOGS监听Home按键消息
- Android通过Intent.ACTION_CLOSE_SYSTEM_DIALOGS监听Home按键消息
- Android通过Intent.ACTION_CLOSE_SYSTEM_DIALOGS监听Home按键事件
- 通过命令发送按键到Android系统
- 通过BroadcastReceiver实现监听电池电量
- Android 通过AccessibilityService实现微信自动抢红包时如何过滤已抢红包
- 实现检测系统按键和模拟系统按键
- Matlab编程与数据类型 -- 内联函数
- Python抓取CSV文件中数据【V2】
- JZOJ 3887. 【长郡NOIP2014模拟10.22】字符串查询
- 第64篇 摄像头屏蔽(四)及运行官网音频代码
- 2017.1.19【初中部 】普及组模拟赛C组 小x的游戏 题解
- 通过AccessibilityService实现系统按键监听
- 2017.1.19【初中部 】普及组模拟赛C组 小x的三角形 题解
- OL2中测量工具的扩展
- 2017.1.19【初中部 】普及组模拟赛C组 eko 题解
- Eclipse中自动添加注释
- 2017.1.19【初中部 】普及组模拟赛C组 MATH 题解
- 2017.1.19【初中部 GDKOI】模拟赛B组 开灯 题解
- 2017.1.19【初中部 GDKOI】模拟赛B组 长方形 题解
- [CDQ分治 并查集] BZOJ 1453 [Wc]Dface双面棋盘