SYSTEM_ALERT_WINDOW - Как получить это разрешение автоматически на Android 6.0 и targetSdkVersion 23

82

Facebook, Evernote, Pocket - все приложения на Android 6.0 получают это разрешение автоматически, даже если они нацелены на 23 ( targetSdkVersion=23).

О новой модели разрешений Marshmallow было написано много документации. Один из них SYSTEM_ALERT_WINDOWбыл «повышен» до «выше опасного» класса разрешений, что требует специального вмешательства пользователя, чтобы приложения были предоставлены с ними. Если у приложения targetSdkVersion22 или меньше, приложение получает это разрешение автоматически (если запрошено в манифесте).

Однако я заметил, что некоторые приложения получают это разрешение без необходимости отправлять пользователя на специальную страницу настроек Draw over other appsразрешения. Я видел Facebook, Evernote, Pocket - а может быть, и другие.

Кто-нибудь знает, как приложение может получить это разрешение без прохождения пользователем Settings -> Apps -> Draw over other apps?

благодаря

Орихарель
источник
stackoverflow.com/questions/33139754/… это помогло мне
Бхарат,
stackoverflow.com/questions/33139754/… этот пост помог мне показать диалоговое разрешение на запись во внешний
Бхарат,
1
Обновление 2020: stackoverflow.com/a/60005258/4720433
Kzaf

Ответы:

116

Это новое поведение, представленное в Marshmallow 6.0.1 .

Каждое приложение, запрашивающее SYSTEM_ALERT_WINDOWразрешение и установленное через Play Store ( требуется версия 6.0.5 или выше), автоматически предоставит разрешение.

Если вместо этого приложение загружается неопубликованно, разрешение не предоставляется автоматически. Вы можете попробовать загрузить и установить APK Evernote с apkmirror.com . Как видите, вам нужно вручную предоставить разрешение в Settings -> Apps -> Draw over other apps.

Это коммиты [1] [2], которые позволяют Play Store автоматически предоставлять SYSTEM_ALERT_WINDOWразрешение.

Маттиа Маэстрини
источник
6
Хотя мне интересно, почему разрешение «выше опасности» внезапно оказалось «ниже нормы». Я имею в виду, что вы даже не видите это разрешение во всплывающем окне, и приложения могут получить его автоматически. Есть предположения?
oriharel
Разрешение остается above dangerousфактическим, если вы загружаете приложение неопубликованным образом, разрешение не предоставляется. Только Play Store имеет другое поведение и автоматически предоставляет разрешение, возможно, они думали, что приложения в Play Store не являются вредоносными и им можно доверять. Или, может быть, они получили много жалоб на это изменение и решили найти обходной путь.
Маттиа Маэстрини,
2
@oriharel Мне интересно, подтолкнули ли массовые масштабы Facebook Messenger Google в этом направлении, чтобы поддержать это. Возможно, Facebook заключил сделку с Google, чтобы не заставлять пользователя предоставлять разрешение, чтобы чаты могли продолжать работать.
dennisdrew
3
Когда я спросил об этом поведении автоматического предоставления этого разрешения (я подумал, что причина в другом: targetSdk), Google ответил: «Это предполагаемое поведение, позволяющее популярным приложениям продолжать работать до тех пор, пока у нас не появятся альтернативные API в платформа для переноса этих приложений ". . Вот сообщения: code.google.com/p/android/issues/detail?id=227123 code.google.com/p/android/issues/detail?id=222195
разработчик Android
1
@MattiaMaestrini, можете ли вы взглянуть на этот аналогичный вопрос? stackoverflow.com/questions/54378632/…
ram
74

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

  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;
Джайман Джани
источник
1
@JaymanJani Привет, это работает для меня, но я хочу, чтобы кнопка была выключена
Приянка
onPermission предоставляется что мне делать? Я хочу открыть приложение
Сантану Сур
Хорошее решение. Но нет необходимости снова проверять разрешение canDrawOverlays в методе onActivityResult, поскольку мы уже проверяем это в методе checkPermission ().
VahidShir
Работает, очень хорошо, но теперь я не могу нажимать на пункты меню панели инструментов. Можно ли это сделать?
Пабло Р.
эй, если у кого-то возникнут проблемы, пожалуйста, дайте мне знать, спасибо
Jayman Jani
13

Теперь ( 2019 ), когда Google предлагает альтернативный API SYSTEM_ALERT_WINDOWв виде пузырей в Android Q, Google решил в конечном итоге отказаться отSYSTEM_ALERT_WINDOW в будущей версии Android.

И устройства Android Go больше не будут предоставлять это разрешение, т.е.Settings.canDrawOverlays() == false

Диксон разработчик
источник
откуда ты это знаешь? В документации говорится, что он все еще находится в предварительной версии. developer.android.com/guide/topics/ui/bubbles
Ноа Драч
Верно @NoaDrach, поэтому я сказал, что в будущем Google в конечном итоге прекратит поддержку SAW, то есть когда Bubble API будет стабильным. youtu.be/td3Kd7fOROw?t=136
Диксон разработчик
спасибо, я спрашивал b / c мое приложение (которое еще не нацелено на Q), которое раньше получало это разрешение автоматически при установке из магазина воспроизведения, и теперь мы не получаем его автоматически. Я предполагаю, что это ч / п - reddit.com/r/androiddev/comments/a69q0i/…
Ноа Драч
@Dicksonthedeveloper Пожалуйста, позвольте мне определить, какое устройство не имеет функции SYSTEM_ALERT_WINDOW или разрешения наложения экрана. Мне нужно решение этого stackoverflow.com/questions/63938787/…
Шейх Мохиб
Android 11 содержит этот API
NothingtoSay
9

Для тех, кто хочет получить это разрешение автоматически при загрузке приложения из Play Store, помимо SYSTEM_ALERT_WINDOW в манифесте, вы должны перейти по этой ссылке и запросить это у Google.

Вы должны предоставить дополнительную информацию, почему вам нужно это разрешение, и Google рассмотрит и автоматически предоставит вам разрешение.

Помните, что прежде чем попросить об этом, вам необходимо:

  • Иметь разрешение SYSTEM_ALERT_WINDOW в манифесте

  • Предложить пользователю предоставить разрешение SYSTEM_ALERT_WINDOW в вашем приложении, если оно еще не предоставлено

Если я что-то пропущу, смело обновляйте ответ

Кзаф
источник
Теперь это должен быть правильный ответ. Спасибо. Пожалуйста, просто добавьте свой ответ на вопрос, как мы можем запросить у пользователя это разрешение программно.
Эрен Тюфекчи
2

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

Dennix
источник
в соответствии с обновленной политикой игрового магазина (с августа 2018 г.) вы не должны настраивать таргетинг на SDK меньше 26, см. ссылки на эту ссылку 1) developer.android.com/distribute/best-practices/develop/… 2) medium.com/codespace69/…
Jayman Jani,