Подтвердить что ты не робот

SYSTEM_ALERT_WINDOW - как получить это разрешение автоматически на 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?

Спасибо

4b9b3361

Ответ 1

Это новое поведение, введенное в 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.

Ответ 2

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), если 23+ api затем проверьте, разрешено ли пользователю или нет

3), если он разрешил один раз не доставлять его до Settings.ACTION_MANAGE_OVERLAY_PERMISSION, и если он еще не разрешил, попросите проверить разрешение во время выполнения

 Put below line in in your Oncreate() method Put this after 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;

приветствия!; -)

Ответ 3

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