SYSTEM_ALERT_WINDOW - Jak automatycznie uzyskać to uprawnienie w systemie Android 6.0 i targetSdkVersion 23

82

Facebook, Evernote, Pocket - wszystkie aplikacje automatycznie uzyskują to uprawnienie w systemie Android 6.0, mimo że ich celem jest 23 ( targetSdkVersion=23).

Było dużo dokumentacji dotyczącej nowego modelu uprawnień Marshmallow. Jeden z nich SYSTEM_ALERT_WINDOWzostał „promowany” do klasy uprawnień „powyżej niebezpiecznej”, a zatem wymaga specjalnej interwencji użytkownika, aby aplikacje mogły zostać przyznane. Jeśli aplikacja ma targetSdkVersion22 lub mniej, uzyskuje to uprawnienie automatycznie (jeśli jest to wymagane w manifeście).

Zauważyłem jednak, że niektóre aplikacje uzyskują to uprawnienie bez konieczności wysyłania użytkownika na specjalną stronę ustawień Draw over other apps. Widziałem Facebooka, Evernote, Pocket - i być może jest ich więcej.

Czy ktoś wie, jak aplikacja może otrzymać to uprawnienie bez przechodzenia przez użytkownika Settings -> Apps -> Draw over other apps?

Dzięki

oriharel
źródło
stackoverflow.com/questions/33139754/... Ten post pomógł mi pokazać pozwolenie dialogowe zapisu na zewnętrzny
Bharath
1
Aktualizacja 2020: stackoverflow.com/a/60005258/4720433
Kzaf

Odpowiedzi:

116

Jest to nowe zachowanie wprowadzone w Marshmallow 6.0.1 .

Każda aplikacja, która prosi o SYSTEM_ALERT_WINDOWpozwolenie i jest instalowana za pośrednictwem Sklepu Play ( wymagana jest wersja 6.0.5 lub nowsza), automatycznie przyzna to uprawnienie.

Jeśli zamiast tego aplikacja jest ładowana z boku, uprawnienie nie jest przyznawane automatycznie. Możesz spróbować pobrać i zainstalować pakiet Evernote APK z apkmirror.com . Jak widać, musisz ręcznie przyznać uprawnienia w Settings -> Apps -> Draw over other apps.

Są to zobowiązania [1] [2], które pozwalają Sklepowi Play na automatyczne udzielenie SYSTEM_ALERT_WINDOWpozwolenia.

Mattia Maestrini
źródło
6
Chociaż zastanawiam się, dlaczego „ponad niebezpieczne” pozwolenie nagle stało się „poniżej normy”. To znaczy, nie możesz nawet zobaczyć tego uprawnienia w wyskakującym okienku, a aplikacje mogą je uzyskać automatycznie. jakieś pomysły?
oriharel
Uprawnienie pozostaje above dangerousw rzeczywistości, jeśli załadujesz aplikację z boku, uprawnienie nie zostanie przyznane. Tylko Sklep Play zachowuje się inaczej i automatycznie przyznaje pozwolenie, być może uważali, że aplikacje w Sklepie Play nie są złośliwe i można im ufać. A może otrzymali wiele skarg na tę zmianę i postanowili znaleźć obejście.
Mattia Maestrini
2
@oriharel Zastanawiam się, czy ogromna skala Facebook Messenger pchnęła Google w tym kierunku, aby to wspierać. Możliwe, że Facebook zawarł umowę z Google, aby nie zmuszać użytkownika do udzielenia pozwolenia, aby czatowie mogli kontynuować pracę.
dennisdrew
3
Kiedy zapytałem o to zachowanie polegające na automatycznym przyznawaniu tego uprawnienia (pomyślałem, że przyczyna jest inna: targetSdk), odpowiedź Google brzmiała: „Jest to zamierzone zachowanie, aby umożliwić działanie popularnych aplikacji, dopóki nie będziemy mieć alternatywnych interfejsów API w platformy do migracji tych aplikacji ”. . Oto posty: code.google.com/p/android/issues/detail?id=227123 code.google.com/p/android/issues/detail?id=222195
programista Androida
1
@MattiaMaestrini, czy możesz rzucić okiem na to podobne pytanie? stackoverflow.com/questions/54378632/…
ram
74

Tak Po Marshmallow nadchodzi Android, aby poziom bezpieczeństwa był bardziej stabilny, ale dla

SYSTEM_ALERT_WINDOW

możesz pokazać działanie pływające i cokolwiek Możesz onCreate()zmusić użytkownika do nadania mu uprawnień Podążając za kodami w swojej metodzie Umieść ten kod po 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);
    }

Akcja ACTION_MANAGE_OVERLAY_PERMISSIONbezpośrednio uruchamia ekran uprawnień „Rysuj nad innymi aplikacjami”.


Edycja: mój kod powyżej działa w 100% poprawnie

Ale właśnie odkryłem, że wielu facetów wciąż szuka tego, jak można zezwolić na ACTION_MANAGE_OVERLAY_PERMISSION stałe, na przykład Jeśli użytkownik ma zezwolenie Raz, nie pytaj o to za każdym razem, gdy otwiera aplikację, więc usłysz rozwiązanie dla siebie-

  1. Sprawdź, czy urządzenie ma API 23+

  2. jeśli 23+ API, sprawdź, czy użytkownik ma pozwolenie, czy nie

  3. jeśli miałeś pozwolenie, nie kieruj go do niego, Settings.ACTION_MANAGE_OVERLAY_PERMISSIONa jeśli jeszcze go nie ma, poproś o sprawdzenie uprawnień do uruchomienia

Umieść poniżej linię w swojej onCreate()metodzie. Odłóż to późniejsetContentView

checkPermission();

Teraz wprowadź poniższy kod 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 
        }

    }

}

Na koniec kod metody 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);
        }
    }
}

I nie zapomnij zadeklarować tej publicznej zmiennej w swojej klasie

public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE = 5469;
Jayman Jani
źródło
1
@JaymanJani Cześć, to działa dla mnie, ale chcę włączyć przycisk włączania zdarzenia
PriyankaChauhan
Przyznano pozwolenie, co mam zrobić? chcę otworzyć aplikację
Santanu Sur
Dobre rozwiązanie. Ale nie ma potrzeby ponownego sprawdzania uprawnienia canDrawOverlays w metodzie onActivityResult, ponieważ sprawdzamy to już w metodzie checkPermission ().
VahidShir
Działa, bardzo dobrze, ale teraz nie mogę dotykać elementów menu paska narzędzi. Czy da się to zrobić?
Pablo R.
hej, jeśli ktoś napotka problem, daj mi znać, dzięki
Jayman Jani
13

Teraz ( 2019 ), gdy Google oferuje alternatywny interfejs API SYSTEM_ALERT_WINDOWw postaci Bubbles w Androidzie Q, Google zdecydował ostatecznie wycofać się SYSTEM_ALERT_WINDOWw przyszłej wersji Androida.

Urządzenia z Androidem Go nie będą już udzielać tego uprawnienia, tjSettings.canDrawOverlays() == false

Dickson deweloper
źródło
Skąd ty to wiesz? Dokumentacja mówi, że jest nadal w podglądzie. developer.android.com/guide/topics/ui/bubbles
Noa Drach
To prawda @NoaDrach, dlatego powiedziałem, że w przyszłości Google ostatecznie wycofa SAW - tj. Gdy Bubble API będzie stabilny. youtu.be/td3Kd7fOROw?t=136
Dickson the developer
dzięki, pytałem b / c moją aplikację (która nie jest jeszcze przeznaczona dla Q), która otrzymywała to pozwolenie automatycznie po zainstalowaniu ze sklepu Play, a teraz nie otrzymujemy jej automatycznie. Myślę, że to b / c tego - reddit.com/r/androiddev/comments/a69q0i/...
Noa Drach
@Dicksonthedeveloper Proszę pozwolić mi jak zidentyfikować cechę SYSTEM_ALERT_WINDOW lub nakładki ekran zgody, które urządzenie nie ja potrzebuję rozwiązanie tego stackoverflow.com/questions/63938787/...
Shaikh Mohib
Android 11 zawiera ten interfejs API
NothingtoSay
9

Dla tych, którzy chcą uzyskać to pozwolenie automatycznie, gdy aplikacja jest pobierana ze Sklepu Play, oprócz SYSTEM_ALERT_WINDOW w Manifeście, należy przejść do tego linku i poprosić o to od Google.

Musisz podać dodatkowe informacje, dlaczego potrzebujesz tego pozwolenia, a Google sprawdzi i udzieli Ci automatycznie pozwolenia.

Pamiętaj, że zanim o to poprosisz, musisz:

  • Miej uprawnienie SYSTEM_ALERT_WINDOW w Manifest

  • Poproś użytkownika o przyznanie uprawnienia SYSTEM_ALERT_WINDOW w Twojej aplikacji, jeśli nie zostało jeszcze przyznane

Jeśli coś przegapię, zaktualizuj odpowiedź

Kzaf
źródło
To musi być teraz poprawna odpowiedź. Dziękuję Ci. Dodaj tylko swoją odpowiedź, w jaki sposób możemy programowo poprosić użytkownika o to pozwolenie.
Eren Tüfekçi
2

Jeśli aplikacja jest przeznaczona dla interfejsu API 22 lub niższego, Sklep Play udzieli uprawnienia SYSTEM_ALERT_WINDOW i innym, gdy użytkownik kliknie, aby zainstalować (pokazując alert), nawet jeśli jego urządzenie to Android 6.0. W przeciwnym razie, jeśli aplikacja jest przeznaczona dla interfejsu API 23 lub nowszego, tak pozwolenie będzie prośbą o przyznanie w czasie wykonywania.

Dennix
źródło
zgodnie ze zaktualizowaną polityką sklepu Play (od sierpnia 2018 r.) nie należy kierować reklam na SDK Mniej niż 26, zobacz te linki 1) developer.android.com/distribute/best-practices/develop/... 2) medium.com/codespace69/ ...
Jayman Jani