SYSTEM_ALERT_WINDOW - Як отримати цей дозвіл автоматично на Android 6.0 і targetSdkVersion 23


82

Facebook, Evernote, Pocket - усі додатки отримують цей дозвіл на Android 6.0 автоматично, навіть якщо націлені на 23 ( targetSdkVersion=23).

Існує багато документації щодо нової моделі дозволу на Зефір. Одну з них SYSTEM_ALERT_WINDOWбуло «підвищено» до класу дозволів «вище небезпечного», що вимагає спеціального втручання користувача для того, щоб програми могли отримувати ці програми. Якщо у програми targetSdkVersion22 або менше, програма автоматично отримує цей дозвіл (якщо про це вимагається в маніфесті).

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

Хто-небудь знає, як програмі може бути надано цей дозвіл без проходження користувачем Settings -> Apps -> Draw over other apps?

Дякую


stackoverflow.com/questions/33139754/… це мені допомогло
Bharath

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 або новіша), надаватиме дозвіл автоматично.

Якщо натомість додаток завантажується збоку, дозвіл не надається автоматично. Ви можете спробувати завантажити та встановити Evernote APK з apkmirror.com . Як бачите, вам потрібно вручити дозвіл вручну Settings -> Apps -> Draw over other apps.

Це коміти [1] [2], які дозволяють Play Store автоматично надавати SYSTEM_ALERT_WINDOWдозвіл.


6
Хоча мені цікаво, як так, що "над небезпечним" дозволом раптом тепер є "нижче норми". Я маю на увазі, ви навіть не бачите цей дозвіл у спливаючому вікні, і програми можуть отримати його автоматично. Будь-які думки?
oriharel

Дозвіл залишається above dangerousфактично, якщо ви завантажуєте додаток, дозвіл не надається. Тільки Play Store має іншу поведінку і автоматично надає дозвіл, можливо, вони думали, що програми в play play не є шкідливими, і їм можна довіряти. А може, вони отримали багато скарг на цю зміну, і вони вирішили знайти обхідний шлях.
Маттіа Маестріні,

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/…
таран

74

Yeh After Marshmallow come 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;

1
@JaymanJani Привіт, це працює для мене, але я хочу кнопку вимкнення вимкнути
PriyankaChauhan

надано дозвіл, що мені робити? я хочу відкрити програму
Сантану-Сур

Хороше рішення. Але немає необхідності перевіряти дозвіл canDrawOverlays у методі onActivityResult ще раз, оскільки ми вже перевіряємо це в методі checkPermission ().
VahidShir

Це працює, дуже добре, але зараз я не можу торкнутися пунктів меню панелі інструментів. Чи можна це зробити?
Пабло Р.

привіт, якщо хтось зіткнеться з проблемою, будь ласка, дайте мені знати подяку
Джейман Джані

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
розробник Діксон

дякую, я запитував б / к мою програму (яка ще не націлена на Q), раніше отримував цей дозвіл автоматично при встановленні з магазину ігор, і тепер ми не отримуємо його автоматично. Думаю, це b / c цього - reddit.com/r/androiddev/comments/a69q0i/…
Ноа Драч

@Dicksonthedeveloper ласка , дайте мені , як визначити , які пристрої не мають особливість дозволу SYSTEM_ALERT_WINDOW або накладення екрану мені потрібне рішення цієї stackoverflow.com/questions/63938787 / ...
Шайх Mohib

Android 11 містить цей API
NothingtoSay

9

Для тих, хто хоче отримати цей дозвіл автоматично, коли додаток завантажується з Play Store, крім SYSTEM_ALERT_WINDOW у Маніфесті, вам слід перейти за цим посиланням і подати запит на це в Google.

Ви повинні надати додаткову інформацію, чому вам потрібен цей дозвіл, і Google перевірить і надасть вам автоматичний дозвіл.

Майте на увазі, що перед тим, як просити про це, вам потрібно:

  • Майте дозвіл SYSTEM_ALERT_WINDOW у Маніфесті

  • Запропонуйте користувачеві надати дозвіл SYSTEM_ALERT_WINDOW у вашому додатку, коли він ще не наданий

Якщо я щось пропустив, сміливо оновлюйте відповідь


Це має бути правильна відповідь зараз. Дякую. Просто додайте свою відповідь на те, як ми можемо програмно попросити цього дозволу у користувача.
Eren Tüfekçi

2

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


згідно з оновленою політикою магазину відтворення (з серпня 2018 р.) ви не повинні націлювати SDK менше 26, див. посилання на посилання 1) developer.android.com/distribute/best-practices/develop/… 2) medium.com/codespace69/…
Jayman Jani
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.