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

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

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

  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;

Если приложение нацелено на API 22 или ниже, то Play Store даст разрешение SYSTEM_ALERT_WINDOW и другие, когда пользователь нажимает на установку (показывая предупреждение), даже если его устройство Android 6.0 В противном случае, если приложение нацелено на API 23 или выше, это разрешение будет запрашиваться во время выполнения.