в Accessibility Services Я имею дело с очень странной ситуацией. GetRootInActiveWindow () всегда имеет значение null в onAccessibilityEvent.
Это результаты logcat:
- E / PackageName: com.google.android.packageinstaller E / EventName: TYPE_WINDOW_STATE_CHANGED ==== null ==== CONTENT_CHANGE_TYPE_UNDEFINED ==== null ==== [Packageinstaller]
- E / getRootInActiveWindow (): getRootInActiveWindow () = Null
- E /PackageName: com.google.android.packageinstaller E / EventName:
TYPE_WINDOW_STATE_CHANGED ==== null ==== CONTENT_CHANGE_TYPE_UNDEFINED ==== null ==== [3D Live Wallpaper, хотите удалить это приложение ?,ОТМЕНА, ОК] - E / getRootInActiveWindow (): getRootInActiveWindow () = Null
Сообщение getRootInActiveWindow (): getRootInActiveWindow () = Null генерируется в начале findAlertDialogNode, когда приложение найдет кнопку «ОК».
Что я здесь не так делаю? Я ценю вашу помощь.
Код:
Служба специальных возможностей XML
<accessibility-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityEventTypes="typeAllMask"
android:packageNames="com.google.android.packageinstaller"
android:accessibilityFlags="flagDefault"
android:canPerformGestures="true"
android:canRetrieveWindowContent="true"
android:description="@string/accessibility_service_description"
/>
onAccessibilityEvent
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
String eventText = getTypeName(event.getEventType()) + "===="
+ event.getContentDescription() + "===="
+ getContentChangeTypesName(event.getContentChangeTypes()) + "===="
+ event.getSource() + "===="
+ event.getText(); //TODO REMOVE
if (event.getPackageName() != null) Log.e("PackageName", event.getPackageName().toString()); //TODO REMOVE
Log.e("EventName", eventText); //TODO REMOVE
PreferenceManager preferenceManager = new PreferenceManager(mContext);
if (!preferenceManager.isCleanUpProcessStarted()) return;
if (!preferenceManager.isScreenBlocked()) return;
List<App> selectedAppsForDeletionList = preferenceManager.getSelectedAppsForDeletion();
if (selectedAppsForDeletionList == null || selectedAppsForDeletionList.size() == 0) return;
selectedAppPackageNameForDeletion = null;
AccessibilityNodeInfo OkButton = findAlertDialogNode(getRootInActiveWindow(), selectedAppsForDeletionList);
if (OkButton != null) {
OkButton.performAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_CLICK.getId());
removePackageFromDeletionList(selectedAppsForDeletionList, selectedAppPackageNameForDeletion);
Log.e("PackageName Deleted ", selectedAppPackageNameForDeletion); //TODO REMOVE
startSelectedAppsForDeletion();
}
}
findAlertDialogNode
private AccessibilityNodeInfo findAlertDialogNode(AccessibilityNodeInfo root, List<App> selectedAppsForDeletionList) {
String packageName = null;
if (root == null) {
Log.e("getRootInActiveWindow()", "getRootInActiveWindow() = Null "); //TODO REMOVE
return null;
}
Deque<AccessibilityNodeInfo> deque = new ArrayDeque<>();
deque.add(root);
while (!deque.isEmpty()) {
AccessibilityNodeInfo node = deque.removeFirst();
if (node == null) return null;
if (node.getClassName().equals("android.widget.TextView")) {
if (packageName == null)
packageName = findPackageToUninstall(node, selectedAppsForDeletionList);
}
if (node.getActionList().contains(AccessibilityNodeInfo.AccessibilityAction.ACTION_CLICK)) {
if (node.getText() != null) {
if (node.getText().equals("OK")) {
if (packageName != null) {
//removePackageFromDeletionList(selectedAppsForDeletionList, packageName);
Log.e("PackageName Selected For Deletion ", packageName); //TODO REMOVE
selectedAppPackageNameForDeletion = packageName;
return node;
}
}
}
}
for (int i = 0; i < node.getChildCount(); i++) {
deque.addLast(node.getChild(i));
}
}
return null;
}