Це спливаюче вікно викликане маніфестом. PERMISSION.SYSTEM_ALERT_WINDOW PERMISSION.SYSTEM_ALERT_WINDOW, оголошеним маніфестом.
Існує 3 категорії дозволів, про які розробник повинен знати:
Звичайний дозвіл - нічого з ними не робити, просто заявити в Маніфесті
Вразливі дозволи - заявіть у Manifest та попросіть дозволу спочатку. Їх можна змінити через налаштування системи.
Вище небезпечних дозволів: SYSTEM_ALERT_WINDOW та WRITE_SETTINGS належать до цієї категорії. Вони повинні бути надані, але не відображаються в налаштуваннях системи. Для його запиту ви не використовуєте стандартний спосіб (int checkSelfPermission (дозвіл рядка)), але вам потрібно перевірити Settings.canDrawOverlays () або Settings.System.canWrite (), а якщо ви цього не зробите, ви отримаєте виняток, як
Не вдається додати вікно android.view.ViewRootImpl$W@1de28ad - дозвіл відхилено для цього типу вікна
1 - Запитуйте цей дозвіл самостійно у своєму коді, як зазначено нижче:
public class MainActivity extends AppCompatActivity {
public final static int REQUEST_CODE = 10000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (checkDrawOverlayPermission()) {
Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show();
}
}
public boolean checkDrawOverlayPermission() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return true;
}
if (!Settings.canDrawOverlays(this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_CODE);
return false;
} else {
return true;
}
}
@Override
@TargetApi(Build.VERSION_CODES.M)
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE) {
if (Settings.canDrawOverlays(this)) {
Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show();
}
}
}