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_WINDOW
został „promowany” do klasy uprawnień „powyżej niebezpiecznej”, a zatem wymaga specjalnej interwencji użytkownika, aby aplikacje mogły zostać przyznane. Jeśli aplikacja ma targetSdkVersion
22 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
Odpowiedzi:
Jest to nowe zachowanie wprowadzone w Marshmallow 6.0.1 .
Każda aplikacja, która prosi o
SYSTEM_ALERT_WINDOW
pozwolenie 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_WINDOW
pozwolenia.źródło
above dangerous
w 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.Tak Po Marshmallow nadchodzi Android, aby poziom bezpieczeństwa był bardziej stabilny, ale dla
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_PERMISSION
bezpoś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-Sprawdź, czy urządzenie ma API 23+
jeśli 23+ API, sprawdź, czy użytkownik ma pozwolenie, czy nie
jeśli miałeś pozwolenie, nie kieruj go do niego,
Settings.ACTION_MANAGE_OVERLAY_PERMISSION
a jeśli jeszcze go nie ma, poproś o sprawdzenie uprawnień do uruchomieniaUmieść 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;
źródło
Teraz ( 2019 ), gdy Google oferuje alternatywny interfejs API
SYSTEM_ALERT_WINDOW
w postaci Bubbles w Androidzie Q, Google zdecydował ostatecznie wycofać sięSYSTEM_ALERT_WINDOW
w przyszłej wersji Androida.Urządzenia z Androidem Go nie będą już udzielać tego uprawnienia, tj
Settings.canDrawOverlays() == false
źródło
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ź
źródło
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.
źródło