想做一个启动另一个APP并且点击其中一个控件的功能,使用了AccessibilityService
,但是始终不会执行onAccessibilityEvent()
,不知道为什么。
我在AndroidManifest.xml
中设置了相关的service:
<service
android:name=".DemoService"
android:enabled="true"
android:exported="true"
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/demo_service" />
</service>
我的demo_service如下:
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFlags="flagDefault"
android:canRetrieveWindowContent="true"
android:notificationTimeout="100"
android:packageNames="xxx.xxx.demo" />
然后我在MainAcitivity中使用PackageManager去打开Demo app,同时我的DemoService是这样的:
public class DemoService extends AccessibilityService {
private static final String TAG = "DemoService";
@Override
protected void onServiceConnected() {
super.onServiceConnected();
Log.wtf(TAG, "DemoService授权成功");
}
@Override
public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {
Log.wtf(TAG,"onAccessibilityEvent : " + accessibilityEvent.toString());
int eventType = accessibilityEvent.getEventType();
switch (eventType) {
case AccessibilityEvent.TYPE_VIEW_FOCUSED:
ServiceUtils.performClick(this,"Hello World!");
break;
}
}
@Override
public void onInterrupt() {
Log.wtf(TAG, "授权中断");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.wtf(TAG, "onDestroy");
}
}
然后ScreenUtils:
public class ServiceUtils {
private static AccessibilityNodeInfo findNodeInfoByViewId(AccessibilityNodeInfo nodeInfo, String viewId) {
List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByViewId(viewId);
if (list == null || list.isEmpty()) {
return null;
}
return list.get(0);
}
private static AccessibilityNodeInfo findNodeInfoByText(AccessibilityNodeInfo nodeInfo, String text) {
List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByText(text);
if (list == null || list.isEmpty()) {
return null;
}
return list.get(0);
}
public static void performClick(AccessibilityService service, String packageName, String viewId) {
AccessibilityNodeInfo nodeInfo = service.getRootInActiveWindow();
AccessibilityNodeInfo targetNode = findNodeInfoByViewId(nodeInfo, packageName + ":id/" + viewId);
if (targetNode != null && targetNode.isClickable()) {
targetNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}
}
public static void performClick(AccessibilityService service, String text) {
AccessibilityNodeInfo nodeInfo = service.getRootInActiveWindow();
AccessibilityNodeInfo targetNode = findNodeInfoByText(nodeInfo, text);
if (targetNode != null && targetNode.isClickable()) {
targetNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}
}
}
遇到了一样的问题,求问楼主解决了没?