Jak programowo otworzyć ekran uprawnień dla konkretnej aplikacji na Androida Marshmallow?


330

Mam pytanie dotyczące nowej wersji Androida Marshmallow:

Czy można wyświetlić ekran uprawnień dla konkretnej aplikacji za pośrednictwem zamiaru lub czegoś podobnego?

Ekran uprawnień Androida M.

Możliwe jest wyświetlenie ustawień aplikacji z następującym kodem - czy istnieje analogiczne rozwiązanie do bezpośredniego otwierania ekranu uprawnień?

startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.fromParts("package", getPackageName(), null)));

Przeprowadziłem już kilka badań na ten temat, ale nie byłem w stanie znaleźć odpowiedniego rozwiązania - byłbym wdzięczny za każdą pomoc!


Spróbuj, może to być praca stackoverflow.com/a/41221852/5488468
Bipin Bharti

Odpowiedzi:


443

Zgodnie z oficjalnym filmem z uprawnieniami Marshmallow (przy znaku 4m 43s ), musisz zamiast tego otworzyć stronę Ustawienia aplikacji (stamtąd wystarczy jedno kliknięcie na stronie Uprawnienia).

Aby otworzyć stronę ustawień, zrób to

Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);

12
Przekierowuje do ogólnych szczegółów ekranu aplikacji. Jak przejść do konkretnego ekranu uprawnień aplikacji. Nie chcę też, aby pozostało jedno kliknięcie,
Milind Mevada,

5
@MilindMevada - obecnie nie możesz tego zrobić.
Martin Konecny

czy możesz wysyłać dane z działania ustawień do swojej aktywności za pomocą zamiarów w „czasie rzeczywistym”? problemem, jaki napotykam, jest obsługa tych danych w Twojej aktywności po ich wysłaniu z ustawień.
ThunderWiring

Działa to podczas debugowania aplikacji, ale zawiesza się bez prawdziwego powodu po podpisaniu APK. W logcat też nie ma nic oczywistego.
JCutting8

181

To jest niemożliwe. Próbowałem to też zrobić. Mógłbym ustalić nazwę pakietu i działanie, które zostanie uruchomione. Ale w końcu dostaniesz wyjątek bezpieczeństwa z powodu brakującego uprawnienia, którego nie możesz zadeklarować.

AKTUALIZACJA:

Jeśli chodzi o drugą odpowiedź, polecam również otworzyć ekran ustawień aplikacji. Robię to za pomocą następującego kodu:

    public static void startInstalledAppDetailsActivity(final Activity context) {
    if (context == null) {
        return;
    }
    final Intent i = new Intent();
    i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
    i.addCategory(Intent.CATEGORY_DEFAULT);
    i.setData(Uri.parse("package:" + context.getPackageName()));
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
    i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
    context.startActivity(i);
}

Ponieważ nie chcę mieć tego w stosie historii, usuwam go za pomocą flag intencyjnych.


Doświadczyłem tego samego i pomyślałem, że może być obejście / inne rozwiązanie tego ...: - /
Frederik Schweiger

Nie, niestety nie jest to możliwe z założenia. Aby uzyskać więcej informacji, sprawdź tę dyskusję w Google+: goo.gl/Wqjjff
Frederik Schweiger

1
@Mulgard Whatsapp musi używać targetSdk = „23”. Pozwala to aplikacji na monitowanie użytkownika o włączenie zezwolenia. Jeśli docelowy zestaw SDK <23, możliwość pokazania użytkownikowi ekranu uprawnień do aplikacji jest przydatna, wydaje się jednak, że możemy wyświetlić tylko ekran ogólnych ustawień aplikacji.
vman

4
Intent.FLAG_ACTIVITY_NO_HISTORY może czasami powodować problematyczną sytuację na tabletach, gdy wyskakujące okienko jest wyświetlane na ekranie ustawień, zamyka ekran ustawień. Usunięcie tej flagi rozwiąże ten problem.
Wirling

2
Możesz pokazać Toast w tym samym czasie, instruując użytkownika, aby wszedł w „Zezwolenie” (dobry pomysł, aby zlokalizować tę wiadomość, nawet jeśli reszta aplikacji nie jest dostępna w języku użytkownika)
vgergo

81
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);

Opis Otwiera stronę ustawień Szczegóły aplikacji. Stąd użytkownik musi ręcznie przypisać pożądane uprawnienia.

Settings.ACTION_APPLICATION_DETAILS_SETTINGS
  

Intent.FLAG_ACTIVITY_NEW_TASK
   Opcjonalny . Jeśli jest ustawiony, otwiera ekran ustawień (aktywność) jako nową aktywność. W przeciwnym razie zostanie otwarty w aktualnie działającej aktywności.

Uri.fromParts("package", getPackageName(), null)
   Przygotowuje lub tworzy identyfikator URI, a getPackageName () - zwraca nazwę pakietu aplikacji.

intent.setData(uri)
   Nie zapomnij tego ustawić . W przeciwnym razie dostaniesz android.content.ActivityNotFoundException . Ponieważ ustawiłeś swój zamiar jako, Settings.ACTION_APPLICATION_DETAILS_SETTINGS a Android oczekuje, że nazwa będzie wyszukiwana.


To jest dosłownie ta najczęściej głosowana odpowiedź. Po co powielać to, a nie rozszerzać oryginalnej odpowiedzi ?!
Thomas Keller

1
Dziękuję za szczegółowe wyjaśnienie.
David Refoua,

34

Zamiast tego możesz otworzyć ogólne ustawienia konkretnej aplikacji za pomocą jednej linii

 startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + BuildConfig.APPLICATION_ID)));

Możesz użyć getActivity (). GetPackageName (), aby uzyskać nazwę pakietu w zależności od konfiguracji kompilacji.
Cory Roy

15

Nie można programowo otworzyć ekranu uprawnień. Zamiast tego możemy otworzyć ekran ustawień aplikacji.

Kod

Intent i = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + BuildConfig.APPLICATION_ID));
startActivity(i);

Przykładowe dane wyjściowe

wprowadź opis zdjęcia tutaj


1
Prosi o stronę pozwolenia
Maveň

10

Jeśli chcesz napisać mniej kodu, Kotlinmożesz to zrobić:

fun Context.openAppSystemSettings() {
    startActivity(Intent().apply {
        action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
        data = Uri.fromParts("package", packageName, null)
    })
}

Na podstawie odpowiedzi Martina Konecnego


fajne użycie rozszerzeń Kotin
David Jarvis

7

Styl Kotlin.

    startActivity(Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
        data = Uri.fromParts("package", packageName, null)
    })

5

Może ci to pomóc

private void openSettings() {
    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
    Uri uri = Uri.fromParts("package", getPackageName(), null);
    intent.setData(uri);
    startActivityForResult(intent, 101);
}

3

Jeżeli mówimy o FLYME OS (Meizu) TYLKO istnieją własną aplikacja bezpieczeństwa z uprawnieniami.

Aby go otworzyć, użyj następujących zamiarów:

public static void openFlymeSecurityApp(Activity context) {
    Intent intent = new Intent("com.meizu.safe.security.SHOW_APPSEC");
    intent.addCategory(Intent.CATEGORY_DEFAULT);
    intent.putExtra("packageName", BuildConfig.APPLICATION_ID);
    try {
        context.startActivity(intent);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Z przyczyn BuildConfig jest z aplikacji BuildConfig .


3

Xamarin Forms Android:

//---------------------------------------------------------
public void OpenSettings()
//---------------------------------------------------------
{
    var intent = new Intent(Android.Provider.Settings.ActionApplicationDetailsSettings,
        Android.Net.Uri.Parse("package:" + Forms.Context.PackageName));
    Forms.Context.StartActivity(intent);
}

0

nie jest możliwe pragmatyczne uzyskanie pozwolenia ... ale źle sugeruję, abyś wpisał ten wiersz kodu w try {} catch {}, co spowoduje, że twoja aplikacja niestety się zatrzyma ... i w treści catch, utworzy się okno dialogowe, które będzie poruszać się po od małego samouczka, aby włączyć rysowanie na uprawnieniu innych aplikacji ... a następnie kliknij przycisk Tak, kliknij ten kod ...

 Intent callSettingIntent= new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
            startActivity(callSettingIntent);

celem tego jest bezpośrednie otwarcie listy rysowania nad innymi aplikacjami w celu zarządzania uprawnieniami, a następnie tutaj jest jedno kliknięcie, aby narysować inne aplikacje Uprawnienia ... wiem, że nie jest to odpowiedź, której szukasz ... ale Robię to w moich aplikacjach ...

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.