Rock_Artist Rock_Artist - 26 days ago 10
Android Question

Avoid Screen Overlay Detected for service that uses SYSTEM_ALERT_WINDOW

My app main usage is overlay, the overlay is running from a service.

Android Security add the nice "Screen Overlay Detected"

I want to avoid "Screen Overlay Detected" when user tries to change permissions. so... I've add an AccessiblityService that detects:

if ( event.getPackageName().equals("com.google.android.packageinstaller") ){
stopService(myServiceIntent);
}


However, even now I see this message popping. (when my service is stopped...).

I saw Twilight does it without problem.

What am I missing?

p.s. - I've also tried building a signed apk but saw exact same behavior.

Answer

It seems I've been able to resolve this.

a) stopService isn't assured your service will be stopped. as described here :

It will not be destroyed until all of these bindings are removed. See > the Service documentation for more details on a service's lifecycle.

b) I was able to kill my service by sending intent that called stopSelf(). However process killing/starting can be slow.

c) Best resolution: so it seems Android checks for view visibility. no need to kill services or do anything more complicated.

Current way I'm doing it: - AccessibilityService (already used by my app) monitor "com.google.android.packageinstaller" though it can be refined to class: "com.android.packageinstaller.permission.ui.ManagePermissionsActivity"

  • Once detected in this class, we send Intent to "duck", and when we're out, we send another intent that we're back on.

  • The service handles those calls by:

    [ourView].setVisibility(View.INVISIBLE); // when permission settings shown

    [ourView].setVisibility(View.VISIBLE); // when normal flow