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



stackoverflow.com/questions/33139754/... Ten post pomógł mi pokazać pozwolenie dialogowe zapisu na zewnętrzny
— Bharath

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.


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;

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


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ź


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.