SYSTEM_ALERT_WINDOW - Как автоматически получить это разрешение на Android 6.0 и targetSdkVersion 23
Facebook, Evernote, Pocket - все приложения получают это разрешение на Android 6.0 автоматически, даже если они нацелены на 23 (targetSdkVersion=23
).
Было много документации относительно новой модели разрешения Зефира. Один из них является 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
разрешение.
Yeh После того, как Marshmallow выйдет, 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
непосредственно запускает экран разрешений "Рисовать поверх других приложений".
Редактировать: мой код выше работает 100% правильно
Но я только что обнаружил, что многие ребята все еще ищут то, как можно позволить ACTION_MANAGE_OVERLAY_PERMISSION
навсегда, как если у пользователя есть разрешение "Раз", то не спрашивайте его каждый раз, когда он открывает приложение, поэтому выслушайте решение для вас:
Проверьте, имеет ли устройство API 23+
если API 23+, то проверьте, есть ли у пользователя разрешение или нет
если бы было разрешение, не вези его
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;
Теперь (2019 г.), что Google предлагает альтернативный API дляSYSTEM_ALERT_WINDOW
в виде пузырей в Android Q, Google решил в конечном итоге отказаться отSYSTEM_ALERT_WINDOW
в будущем выпуске Android.
И устройства Android Go больше не будут предоставлять это разрешение, т.е.Settings.canDrawOverlays() == false
Для тех, кто хочет получить это разрешение автоматически при загрузке приложения из Play Store, помимо SYSTEM_ALERT_WINDOW в манифесте, вы должны перейти по этой ссылке и запросить это у Google.
Вы должны предоставить дополнительную информацию, почему вам нужно это разрешение, и Google рассмотрит и автоматически предоставит вам разрешение.
Помните, что прежде чем вы попросите об этом, вам необходимо:
Иметь разрешение SYSTEM_ALERT_WINDOW в манифесте
Предложите пользователю предоставить разрешение SYSTEM_ALERT_WINDOW в вашем приложении, если оно еще не предоставлено
Если я что-то пропустил, смело обновляйте ответ
Если приложение предназначено для API 22 или ниже, то Play Store предоставит разрешение SYSTEM_ALERT_WINDOW и другие, когда пользователь щелкает по установке (показывает предупреждение), даже если его устройство является Android 6.0. В противном случае, если приложение предназначено для API 23 или выше, так что разрешение будет запрос на предоставление во время выполнения.