Окно системного оповещения - как получить это разрешение автоматически на 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 61

3 ответа:

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


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