我遵循了this的建议,以编程方式取消安装我的应用程序,并且一切正常,直到Android 7.1,但是在我在Android 8.1和9上对其进行测试后,这似乎不起作用(在Ui窗口上未单击任何操作)。发生了什么?在这些版本中对此做了一些更新?
主要代码>
MyAccessibility:
public void onAccessibilityEvent(AccessibilityEvent event) {
AccessibilityNodeInfo source = event.getSource();
if (source == null) {
return;
}
if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) {
List<AccessibilityNodeInfo> list = source.findAccessibilityNodeInfosByViewId("android:id/button1");
for (AccessibilityNodeInfo node : list) {
node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}
}
}
XML(主要):
<service
android:name=".MyAccessibility"
class=".MyAccessibility"
android:enabled="true"
android:exported="false"
android:label="@string/accessibility_service_label"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action
android:name=".MyAccessibility"
android:value=".MyAccessibility" />
</intent-filter>
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/accessibility_service_config" />
</service>
XML(AccessibilityService):
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackAllMask"
android:accessibilityFlags="flagDefault|flagIncludeNotImportantViews|flagReportViewIds"
android:canPerformGestures="true"
android:canRetrieveWindowContent="true"
android:description="@string/accessibility_service_description"
android:notificationTimeout="100"
tools:ignore="UnusedAttribute" />
编辑:
测试环境:
AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED
事件,但没有触发。另外,当您在AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED
类型的事件上调用AccessibilityEvent.getSource()
方法时,它返回null。因此,当AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED
方法返回null时,我使用了getRootInActiveWindow()
方法,此外,在API 26及更高版本上,我也尝试处理AccessibilityEvent.getSource()
事件。请尝试以下代码:AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED
我也修改了@Override public void onAccessibilityEvent(AccessibilityEvent event) { AccessibilityNodeInfo source = event.getSource(); if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && source == null) source = getRootInActiveWindow(); if (source == null) { return; } if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED || Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { List<AccessibilityNodeInfo> list = source.findAccessibilityNodeInfosByViewId("android:id/button1"); for (AccessibilityNodeInfo node : list) { node.performAction(AccessibilityNodeInfo.ACTION_CLICK); } } }
文件以提高准确性。
accessibility_service_config.xml
我已经在API 24,API 27,API 28和API 29上测试了此代码,并且有效。
AccessibilityService
,其中某些事件仍然未被检测到。这里可能发生的情况是该服务可能无法拾取卸载对话框窗口。解决方案是使用FLAG_RETRIEVE_INTERACTIVE_WINDOWS
,它采用单独的代码路径并规避此错误。
在FLAG_RETRIEVE_INTERACTIVE_WINDOWS
中,在accessibility_service_config.xml
下添加flagRetrieveInteractiveWindows
:
accessibilityFlags
检查上面的代码更改,看看是否有效?这应该允许发送点击事件。