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 навсегда, как если у пользователя есть разрешение "Раз", то не спрашивайте его каждый раз, когда он открывает приложение, поэтому выслушайте решение для вас:

  1. Проверьте, имеет ли устройство API 23+

  2. если API 23+, то проверьте, есть ли у пользователя разрешение или нет

  3. если бы было разрешение, не вези его 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 или выше, так что разрешение будет запрос на предоставление во время выполнения.