Mam aplikację MDM dla rodziców do kontrolowania urządzeń dziecięcych i używa ona pozwolenia SYSTEM_ALERT_WINDOW
do wyświetlania ostrzeżeń na urządzeniu dziecka, gdy wykonano zabronioną akcję. na urządzeniach M + Podczas instalacji aplikacja sprawdza uprawnienia przy użyciu tej metody:Dlaczego w Androidzie metoda O Ustawienia .canDrawOverlays() zwraca "false", gdy użytkownik udzielił uprawnień do rysowania nakładek i wraca do mojej aplikacji?
Settings.canDrawOverlays(getApplicationContext())
i jeśli ta metoda powrotu false
aplikacja otwiera okno dialogowe systemu, gdzie użytkownik może przyznać uprawnienie:
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_CODE);
W Androida O, gdy użytkownik pomyślnie udzieli pozwolenia i powróci do aplikacji, naciskając przycisk Wstecz, metoda canDrawOverlays()
nadal będzie zwracać false
, dopóki użytkownik nie zamknie aplikacji i nie otworzy jej ponownie lub po prostu wybierze ją w oknie dialogowym ostatnich aplikacji. Przetestowałem go na najnowszej wersji urządzenia wirtualnego z Android O w Android Studio, ponieważ nie mam prawdziwego urządzenia.
Zrobiłem trochę badań i dodatkowo sprawdzić uprawnienia z AppOpsManager:
AppOpsManager appOpsMgr = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
int mode = appOpsMgr.checkOpNoThrow("android:system_alert_window", android.os.Process.myUid(), getPackageName());
Log.d(TAG, "android:system_alert_window: mode=" + mode);
i tak:
- , gdy aplikacja nie posiada tego uprawnienia, tryb to "2" (MODE_ERRORED) (
canDrawOverlays()
zwracafalse
), gdy użytkownik uzyska zezwolenie i wrócił do aplikacji, tryb wynosi "1" (MO DE_IGNORED) (canDrawOverlays()
powracafalse
) - a jeśli teraz ponownie otworzyć aplikację, ten tryb jest "0" (MODE_ALLOWED) (
canDrawOverlays()
powracatrue
)
Proszę, może ktoś wyjaśnić ten problem dla mnie? Czy mogę polegać na mode == 1
operacji "android:system_alert_window"
i założyć, że użytkownik udzielił pozwolenia?
Zareagowali bardzo szybko, wspaniale. Po raz pierwszy spotykam nieusunięty błąd w systemie Android. Myślę, że problem został zamknięty i oznaczyć swój wpis jako odpowiedź. – fishbone
Czy możesz podzielić się pełnym kodem, aby sprawdzić, czy aplikacja uzyskała to uprawnienie? –