Окно SYSTEM ALERT - Как получить это разрешение автоматически на Android 6.0 и targetSdkVersion 23
Facebook, Evernote, Pocket - все приложения получают это разрешение на Android 6.0 автоматически, даже если они нацелены на 23 (targetSdkVersion=23
).
было много документации, касающейся новой модели разрешений Marshmallow. Один из них -SYSTEM_ALERT_WINDOW
был "повышен" до "выше опасного" класса разрешений, что требует специального вмешательства пользователя, чтобы приложения могли быть предоставлены с ними. Если приложение имеет targetSdkVersion
22 или ниже, приложение получает это разрешение автоматически (если запрошено в манифесте).
однако я заметил некоторые приложения, которые получают это разрешение, без необходимости отправлять пользователя на специальную страницу настроек Draw over other apps
разрешения. Я видел Facebook, Evernote, Pocket - и, возможно, их больше.
кто-нибудь знает, как приложение может быть предоставлено такое разрешение без пользователя пройти Settings -> Apps -> Draw over other apps
?
спасибо
3 ответов
это новое поведение, введенное в Marshmallow 6.0.1.
каждое приложение, которое просит SYSTEM_ALERT_WINDOW
разрешение и устанавливается через Play Store (версия 6.0.5 или выше Требуется), будет предоставлено разрешение автоматически.
Если вместо этого приложение загружено, разрешение не предоставляется автоматически. Вы можете попробовать загрузить и установить Evernote APK из apkmirror.com. Как видите вам необходимо вручную предоставить разрешение в Settings -> Apps -> Draw over other apps
.
это коммиты [1] [2] что позволяет Play Store, чтобы дать автоматический грант SYSTEM_ALERT_WINDOW
разрешения.
Да после зефира приходят Android сделать уровень безопасности больше палку, но для
SYSTEM_ALERT_WINDOW
вы можете показать плавающее действие и все, что вы можете заставить пользователя дать разрешение на него, следуя кодам в вашем onCreate()
способ
Поместите этот код после setContentView
// Check if Android M or higher
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// Show alert dialog to the user saying a separate permission is needed
// Launch the settings activity if the user prefers
Intent myIntent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
startActivity(myIntent);
}
действие ACTION_MANAGE_OVERLAY_PERMISSION
непосредственно запускает экран разрешения "Draw over other apps".
изменить: Мой код выше работает на 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)) {
// You don't have permission
checkPermission();
} else {
// Do as per your logic
}
}
}
теперь, наконец, код метода 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;
Если приложение нацелено на API 22 или ниже, то Play Store даст разрешение SYSTEM_ALERT_WINDOW и другие, когда пользователь нажимает на установку (показывая предупреждение), даже если его устройство Android 6.0 В противном случае, если приложение нацелено на API 23 или выше, это разрешение будет запрашиваться во время выполнения.