I am getting ANR in accessibility service at onEvent Method after calling event.getSource(); function

118 Views Asked by At

I am using Accessibility service in my application and getting ANR in onEvent method while calling event.getSource();

When i put this code in another thread, to resolve this above ANR it creates an exception:

java.lang.IllegalStateException: Cannot perform this action on a not sealed instance.

Please guide me how can i resolve it? Code is below:

  @Override
public void onAccessibilityEvent(final AccessibilityEvent event) {
    int eventType = event.getEventType();
    if (eventType == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) {
        OnEvent(this, event);
    }
}

private void OnEvent(final Context context, AccessibilityEvent event) {
    String eventText = "", eventPackageName = "", eventClassName = "";
    try {

        if (event.getText() != null && event.getText().size() > 0)
            eventText = event.getText().toString();
        if (event.getPackageName() != null)
            eventPackageName = event.getPackageName().toString();
        if (event.getClassName() != null)
            eventClassName = event.getClassName().toString();

        AccessibilityNodeInfo eventSource = event.getSource();
        final AccessibilityEventModel accessibilityEventModel = new AccessibilityEventModel();
        accessibilityEventModel.setPackageName(eventPackageName);
        accessibilityEventModel.setEventText(eventText);
        accessibilityEventModel.setEventClassName(eventClassName);
        accessibilityEventModel.setEventSource(eventSource);
        accessibilityEventModel.setParcelable(event.getParcelableData());
       executorService.execute(() -> {
            AccessibilityManager accessibilityManager = new AccessibilityManager(context, localDatabaseSource);
            accessibilityManager.goThroughAccessibilityEvent(eventType,
                    accessibilityEventModel);
        });
        
    } catch (Exception e) {
        Log.d(TAG, " Error: " + e.getMessage());
    }
}






fun goThroughAccessibilityEvent(
    eventType: AccessibilityEventType,
    accessibilityEventModel: AccessibilityEventModel
) {
    when (eventType) {
        AccessibilityEventType.TYPE_WINDOW_CONTENT_CHANGED -> WindowContentChangeEventData(
            localDatabaseSource
        ).onAccessibilityEvent(context, accessibilityEventModel)
    }
}


 
1

There are 1 best solutions below

11
On

I can't tell what you're actually doing with the accessibilityEventModel after it's generated, but you should try placing the whole try/catch (and any other logic that needs uses that accessibilityEventModel) block inside a background thread:

new Thread(new Runnable() {
   @Override
   public void run() {
        Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)
        //your code
   }
}).start()