getRootInActiveWindow () всегда пусто в onAccessibilityEvent - PullRequest
0 голосов
/ 04 ноября 2019

в 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;
    }
...