У меня есть приложение MDM для родителей для управления дочерними устройствами, и оно использует разрешение SYSTEM_ALERT_WINDOW
для отображения предупреждений на дочернем устройстве при запрещенных действиях.
На устройствах M + во время установки приложение проверяет разрешение с помощью этого метода:
Settings.canDrawOverlays(getApplicationContext())
и если этот метод возвращает false
, приложение открывает системный диалог, в котором пользователь может предоставить разрешение:
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_CODE);
В Android O, когда пользователь успешно предоставит разрешение и вернется в приложение, нажав кнопку "Назад", метод canDrawOverlays()
все еще возвращает false
, пока пользователь не закроет приложение и не откроет его снова или просто выберите его в последнем диалоговом окне приложений. Я тестировал его на последней версии виртуального устройства с Android O в Android Studio, потому что у меня нет реального устройства.
Я провел небольшое исследование и дополнительно проверил разрешение с помощью 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);
И так:
- когда приложение не имеет этого разрешения, режим "2"
(MODE_ERRORED) (
canDrawOverlays()
возвращаетfalse
), когда пользователь - предоставил разрешение и вернулся в приложение, режим "1"
(MODE_IGNORED) (
canDrawOverlays()
возвращаетfalse
) - и если вы сейчас снова открываете приложение, режим "0" (MODE_ALLOWED) (
canDrawOverlays()
возвращаетtrue
)
Пожалуйста, может ли кто-нибудь объяснить это поведение мне? Можно ли полагаться на mode == 1
операции "android:system_alert_window"
и предположить, что пользователь предоставил разрешение?