通过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

2 0