Yeh After Marshmallow come Android зробить рівень безпеки ще більшим, ніж для
SYSTEM_ALERT_WINDOW
ви можете показати плаваючу дію та все, що можна. Ви можете змусити користувача дати на це дозвіл, дотримуючись кодів у вашому onCreate()
методі. Поставте цей код після setContentView
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Intent myIntent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
startActivity(myIntent);
}
Дія ACTION_MANAGE_OVERLAY_PERMISSION
безпосередньо запускає екран дозволів "Намалювати над іншими програмами".
Редагувати: Мій вище код працює на 100% коректно
Але я тільки що виявив, що багато хлопців все ще шукають, як можна дозволити ACTION_MANAGE_OVERLAY_PERMISSION
постійно, наприклад, якщо користувач дозволив дозвіл раз, то не питайте цього кожного разу, коли він відкриває програму, тому почуйте рішення для вас-
Перевірте, чи має пристрій API 23+
якщо 23+ API, то перевірте, чи має користувач дозвіл чи ні
якщо один раз мав дозвіл, не везти його, Settings.ACTION_MANAGE_OVERLAY_PERMISSION
а якщо ще не дозволив, то попроси перевірку дозволу на виконання
Поставте під вашим onCreate()
методом нижче рядка . Покладіть це післяsetContentView
checkPermission();
Тепер помістіть код нижче в onActivityResult
@TargetApi(Build.VERSION_CODES.M)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) {
if (!Settings.canDrawOverlays(this)) {
checkPermission();
} else {
}
}
}
Тепер нарешті код методу checkPermission
public void checkPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.canDrawOverlays(this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
}
}
}
І не забудьте оголосити цю загальнодоступну змінну у своєму класі
public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE = 5469;