android / codelab-android-accessibility

Basic Android Accessibility: making sure everyone can use what you create!
https://codelabs.developers.google.com/codelabs/basic-android-accessibility/
Apache License 2.0
112 stars 86 forks source link

IllegalAccessException in StrictMode #87

Open everwanna opened 1 year ago

everwanna commented 1 year ago

When I enable StrictMode, I can see IllegalAccessException in the log.

What is the correct way to show overlay in AccessibilityService?


    @Override
    protected void onServiceConnected() {
        super.onServiceConnected();
        debugStrictMode();

        WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
        FrameLayout mLayout = new FrameLayout(this);
        WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
        lp.type = WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY;
        lp.format = PixelFormat.TRANSLUCENT;
        lp.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
        lp.width = WindowManager.LayoutParams.WRAP_CONTENT;
        lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
        lp.gravity = Gravity.TOP;
        LayoutInflater inflater = LayoutInflater.from(this);
        inflater.inflate(R.layout.action_bar, mLayout);
        wm.addView(mLayout, lp);
    }

    void debugStrictMode() {
        StrictMode.VmPolicy.Builder policyBuilder = (new StrictMode.VmPolicy.Builder())
                .detectAll()
                .penaltyLog()
                .penaltyListener(getMainExecutor(), v -> Log.d("StrictMode", "onVmViolation: " + v));
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            policyBuilder.detectUnsafeIntentLaunch();
        }
        StrictMode.setVmPolicy(policyBuilder.build());
    }
E/StrictMode: Tried to access the API:ViewConfiguration which needs to have proper configuration from a non-UI Context:com.example.android.globalactionbarservice.GlobalActionBarService@b1bf96a The API:ViewConfiguration needs a proper configuration. Use UI contexts such as an activity or a context created via createWindowContext(Display, int, Bundle) or  createConfigurationContext(Configuration) with a proper configuration.
    java.lang.IllegalAccessException: Tried to access the API:ViewConfiguration which needs to have proper configuration from a non-UI Context:com.example.android.globalactionbarservice.GlobalActionBarService@b1bf96a
        at android.os.StrictMode.assertConfigurationContext(StrictMode.java:2296)
        at android.view.ViewConfiguration.get(ViewConfiguration.java:522)
        at android.view.View.<init>(View.java:5307)
        at android.view.View.<init>(View.java:5452)
        at android.view.ViewGroup.<init>(ViewGroup.java:702)
        at android.view.ViewGroup.<init>(ViewGroup.java:698)
        at android.view.ViewGroup.<init>(ViewGroup.java:694)
        at android.view.ViewGroup.<init>(ViewGroup.java:690)
        at android.widget.FrameLayout.<init>(FrameLayout.java:85)
        at com.example.android.globalactionbarservice.GlobalActionBarService.onServiceConnected(GlobalActionBarService.java:36)
        at android.accessibilityservice.AccessibilityService.dispatchServiceConnected(AccessibilityService.java:762)
        at android.accessibilityservice.AccessibilityService.access$100(AccessibilityService.java:236)
        at android.accessibilityservice.AccessibilityService$2.onServiceConnected(AccessibilityService.java:2160)
        at android.accessibilityservice.AccessibilityService$IAccessibilityServiceClientWrapper.executeMessage(AccessibilityService.java:2404)
        at com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:44)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loopOnce(Looper.java:201)
        at android.os.Looper.loop(Looper.java:288)
        at android.app.ActivityThread.main(ActivityThread.java:7842)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
D/StrictMode: StrictMode policy violation: android.os.strictmode.IncorrectContextUseViolation: The API:LayoutInflater needs a proper configuration. Use UI contexts such as an activity or a context created via createWindowContext(Display, int, Bundle) or  createConfigurationContext(Configuration) with a proper configuration.
        at android.os.StrictMode.onIncorrectContextUsed(StrictMode.java:2261)
        at android.os.StrictMode.assertConfigurationContext(StrictMode.java:2297)
        at android.view.LayoutInflater.<init>(LayoutInflater.java:260)
        at com.android.internal.policy.PhoneLayoutInflater.<init>(PhoneLayoutInflater.java:44)
        at android.app.SystemServiceRegistry$33.createService(SystemServiceRegistry.java:534)
        at android.app.SystemServiceRegistry$33.createService(SystemServiceRegistry.java:531)
        at android.app.SystemServiceRegistry$CachedServiceFetcher.getService(SystemServiceRegistry.java:1848)
        at android.app.SystemServiceRegistry.getSystemService(SystemServiceRegistry.java:1525)
        at android.app.ContextImpl.getSystemService(ContextImpl.java:2064)
        at android.content.ContextWrapper.getSystemService(ContextWrapper.java:857)
        at android.accessibilityservice.AccessibilityService.getSystemService(AccessibilityService.java:2075)
        at android.view.LayoutInflater.from(LayoutInflater.java:288)
        at com.example.android.globalactionbarservice.GlobalActionBarService.onServiceConnected(GlobalActionBarService.java:44)
        at android.accessibilityservice.AccessibilityService.dispatchServiceConnected(AccessibilityService.java:762)
        at android.accessibilityservice.AccessibilityService.access$100(AccessibilityService.java:236)
        at android.accessibilityservice.AccessibilityService$2.onServiceConnected(AccessibilityService.java:2160)
        at android.accessibilityservice.AccessibilityService$IAccessibilityServiceClientWrapper.executeMessage(AccessibilityService.java:2404)
        at com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:44)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loopOnce(Looper.java:201)
        at android.os.Looper.loop(Looper.java:288)
        at android.app.ActivityThread.main(ActivityThread.java:7842)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
     Caused by: java.lang.IllegalAccessException: Tried to access the API:LayoutInflater which needs to have proper configuration from a non-UI Context:com.example.android.globalactionbarservice.GlobalActionBarService@b1bf96a
        at android.os.StrictMode.assertConfigurationContext(StrictMode.java:2296)
        at android.view.LayoutInflater.<init>(LayoutInflater.java:260) 
        at com.android.internal.policy.PhoneLayoutInflater.<init>(PhoneLayoutInflater.java:44) 
        at android.app.SystemServiceRegistry$33.createService(SystemServiceRegistry.java:534) 
        at android.app.SystemServiceRegistry$33.createService(SystemServiceRegistry.java:531) 
        at android.app.SystemServiceRegistry$CachedServiceFetcher.getService(SystemServiceRegistry.java:1848) 
        at android.app.SystemServiceRegistry.getSystemService(SystemServiceRegistry.java:1525) 
        at android.app.ContextImpl.getSystemService(ContextImpl.java:2064) 
        at android.content.ContextWrapper.getSystemService(ContextWrapper.java:857) 
        at android.accessibilityservice.AccessibilityService.getSystemService(AccessibilityService.java:2075) 
        at android.view.LayoutInflater.from(LayoutInflater.java:288) 
        at com.example.android.globalactionbarservice.GlobalActionBarService.onServiceConnected(GlobalActionBarService.java:44) 
        at android.accessibilityservice.AccessibilityService.dispatchServiceConnected(AccessibilityService.java:762) 
        at android.accessibilityservice.AccessibilityService.access$100(AccessibilityService.java:236) 
        at android.accessibilityservice.AccessibilityService$2.onServiceConnected(AccessibilityService.java:2160) 
        at android.accessibilityservice.AccessibilityService$IAccessibilityServiceClientWrapper.executeMessage(AccessibilityService.java:2404) 
        at com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:44) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loopOnce(Looper.java:201) 
        at android.os.Looper.loop(Looper.java:288) 
        at android.app.ActivityThread.main(ActivityThread.java:7842) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)