Android使用AccessibilityService
介绍
AccessibilityService设计初衷在于帮助残障用户使用android设备和应用,在后台运行,可以监听用户界面的一些状态转换,例如页面切换、焦点改变、通知、Toast等,并在触发AccessibilityEvents时由系统接收回调。后来被开发者另辟蹊径,用于一些插件开发,比如微信红包助手,还有一些需要监听第三方应用的插件。
AcyService
import android.accessibilityservice.AccessibilityService; import android.view.accessibility.AccessibilityEvent; public class AcyService extends AccessibilityService { @Override public void onAccessibilityEvent(AccessibilityEvent event) { PrintUtils.printEvent(event); } @Override public void onInterrupt() { PrintUtils.log("onInterrupt"); } @Override protected boolean onGesture(int gestureId) { PrintUtils.log("onGesture"); return super.onGesture(gestureId); } @Override protected void onServiceConnected() { super.onServiceConnected(); PrintUtils.log("onServiceConnected"); } }
所有用法输出,代码是这个人的,我们这行,代码都是祖传,一个人写的代码,几万人用毫不夸张
/**
* Created by _SOLID
* Date:2016/7/21
* Time:11:14
*/
import android.util.Log; import android.view.accessibility.AccessibilityEvent; public class PrintUtils { public static void log(CharSequence log) { Log.i("test", log + ""); } public static void printEvent(AccessibilityEvent event) { log("-------------------------------------------------------------"); int eventType = event.getEventType(); log("packageName:" + event.getPackageName() + ""); log("source:" + event.getSource() + ""); log("source class:" + event.getClassName() + ""); log("event type(int):" + eventType + ""); switch (eventType) { case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:// 通知栏事件 log("event type:TYPE_NOTIFICATION_STATE_CHANGED"); break; case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED://窗体状态改变 log("event type:TYPE_WINDOW_STATE_CHANGED"); break; case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED://View获取到焦点 log("event type:TYPE_VIEW_ACCESSIBILITY_FOCUSED"); break; case AccessibilityEvent.TYPE_GESTURE_DETECTION_START: log("event type:TYPE_VIEW_ACCESSIBILITY_FOCUSED"); break; case AccessibilityEvent.TYPE_GESTURE_DETECTION_END: log("event type:TYPE_GESTURE_DETECTION_END"); break; case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED: log("event type:TYPE_WINDOW_CONTENT_CHANGED"); break; case AccessibilityEvent.TYPE_VIEW_CLICKED: log("event type:TYPE_VIEW_CLICKED"); break; case AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED: log("event type:TYPE_VIEW_TEXT_CHANGED"); break; case AccessibilityEvent.TYPE_VIEW_SCROLLED: log("event type:TYPE_VIEW_SCROLLED"); break; case AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED: log("event type:TYPE_VIEW_TEXT_SELECTION_CHANGED"); break; } for (CharSequence txt : event.getText()) { log("text:" + txt); } log("-------------------------------------------------------------"); } }
MainActivity
Intent intent = new Intent(android.provider.Settings.ACTION_ACCESSIBILITY_SETTINGS); startActivity(intent);
manifest文件中添加
<service android:name=".AcyService" 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/services_config" /> </service>
services_config放xml中
<?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="flagReportViewIds" android:canRetrieveWindowContent="true" android:description="@string/app_name" android:notificationTimeout="100" />
GitHub地址 下载前给star
分类:
Android开发
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)