Wie öffne ich programmgesteuert den Berechtigungsbildschirm für eine bestimmte App auf Android Marshmallow?


330

Ich habe eine Frage zur neuen Android Marshmallow-Version:

Ist es möglich, den Berechtigungsbildschirm für eine bestimmte App über eine Absicht oder ähnliches anzuzeigen?

Android M-Berechtigungsbildschirm

Es ist möglich, die App-Einstellungen mit dem folgenden Code anzuzeigen - gibt es eine analoge Lösung zum direkten Öffnen des Berechtigungsbildschirms?

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

Ich habe bereits einige Nachforschungen angestellt, konnte aber keine richtige Lösung finden - ich würde mich über jede Hilfe freuen!


Versuchen Sie dies, es kann Arbeit stackoverflow.com/a/41221852/5488468
Bipin Bharti

Antworten:


443

Laut dem offiziellen Marshmallow-Berechtigungsvideo (an der 4m 43s-Marke ) müssen Sie stattdessen die Seite mit den Anwendungseinstellungen öffnen (von dort aus ist es ein Klick auf die Seite Berechtigungen).

Um die Einstellungsseite zu öffnen, würden Sie tun

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

12
Es wird zu allgemeinen Details des Anwendungsbildschirms umgeleitet. Wie kann man zum Bildschirm "App-Berechtigungen" gehen? Ich will nicht, dass noch ein Klick übrig bleibt
Milind Mevada

5
@MilindMevada - das kannst du momentan nicht.
Martin Konecny

Können Sie Daten aus der Einstellungsaktivität mit Absichten in "Echtzeit" an Ihre Aktivität senden? Das Problem besteht darin, diese Daten in Ihrer Aktivität zu verarbeiten, sobald sie von den Einstellungen gesendet wurden.
ThunderWiring

Dies funktioniert beim Debuggen der App, stürzt jedoch nach dem Signieren der APK ohne wirklichen Grund ab. Auch im Logcat ist nichts offensichtlich.
JCutting8

181

Das ist nicht möglich. Ich habe es auch versucht. Ich könnte den Paketnamen und die Aktivität herausfinden, die gestartet wird. Am Ende erhalten Sie jedoch eine Sicherheitsausnahme aufgrund einer fehlenden Berechtigung, die Sie nicht deklarieren können.

AKTUALISIEREN:

In Bezug auf die andere Antwort empfehle ich außerdem, den Bildschirm mit den App-Einstellungen zu öffnen. Ich mache das mit folgendem Code:

    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);
}

Da ich dies nicht in meinem Verlaufsstapel haben möchte, entferne ich es mit Absichtsflags.


Ich habe das gleiche erlebt und dachte, es könnte eine Problemumgehung / eine andere Lösung dafür geben ...: - /
Frederik Schweiger

Nein, leider ist das nicht beabsichtigt. Weitere Informationen finden Sie in dieser Diskussion auf Google+: goo.gl/Wqjjff
Frederik Schweiger

1
@ Mulgard WhatsApp muss targetSdk = "23" verwenden. Dadurch kann die App den Benutzer auffordern, die Berechtigung zu aktivieren. Wenn Ihr Ziel-SDK <23 ist, ist es hilfreich, dem Benutzer den Bildschirm mit den App-Berechtigungen anzeigen zu können. Es scheint jedoch, dass wir nur den Bildschirm mit den allgemeinen App-Einstellungen anzeigen können.
Vman

4
Die Absicht.FLAG_ACTIVITY_NO_HISTORY kann manchmal zu einer problematischen Situation auf Tablets führen, wenn im Einstellungsbildschirm ein Popup angezeigt wird, das den Einstellungsbildschirm schließt. Durch einfaches Entfernen dieses Flags wird dieses Problem behoben.
Wirling

2
Sie können gleichzeitig einen Toast
anzeigen und

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);

Beschreibung Öffnet die Einstellungsseite für Details für die App. Von hier aus muss der Benutzer die gewünschte Berechtigung manuell zuweisen.

Settings.ACTION_APPLICATION_DETAILS_SETTINGS
  

Intent.FLAG_ACTIVITY_NEW_TASK
   Optional . Wenn festgelegt, wird der Einstellungsbildschirm (Aktivität) als neue Aktivität geöffnet. Andernfalls wird es in der aktuell ausgeführten Aktivität geöffnet.

Uri.fromParts("package", getPackageName(), null)
   Bereitet einen URI vor oder erstellt ihn, während getPackageName () - den Namen Ihres Anwendungspakets zurückgibt.

intent.setData(uri)
   Vergessen Sie nicht, dies einzustellen . Andernfalls erhalten Sie android.content.ActivityNotFoundException . Weil Sie Ihre Absicht als festgelegt haben Settings.ACTION_APPLICATION_DETAILS_SETTINGS und Android erwartet, dass ein Name gesucht wird.


Dies ist buchstäblich die am häufigsten gewählte Antwort. Warum dies duplizieren und die ursprüngliche Antwort nicht erweitern?!
Thomas Keller

1
Vielen Dank für die ausführliche Erklärung.
David Refoua

34

Stattdessen können Sie die allgemeinen Einstellungen einer bestimmten App mit einer Zeile öffnen

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

Möglicherweise möchten Sie getActivity (). GetPackageName () verwenden, um den Paketnamen abzurufen, je nachdem, wie Ihr Build konfiguriert ist.
Cory Roy

15

Es ist nicht möglich, den Berechtigungsbildschirm programmgesteuert zu öffnen. Stattdessen können wir den App-Einstellungsbildschirm öffnen.

Code

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

Beispielausgabe

Geben Sie hier die Bildbeschreibung ein


1
Er bittet um Erlaubnis Seite
Maveň ツ

10

Wenn Sie weniger Code schreiben möchten, Kotlinkönnen Sie dies tun:

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

Basierend auf der Antwort von Martin Konecny


nette Verwendung von Kotin-Erweiterungen
David Jarvis

6

Kotlin-Stil.

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

5

Vielleicht hilft dir das

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

Wenn wir NUR über FLYME OS (Meizu) sprechen, gibt es eine eigene Sicherheits-App mit Berechtigungen.

Verwenden Sie zum Öffnen die folgende Absicht:

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();
    }
}

Of-Ursache BuildConfig ist die App 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

Es ist nicht möglich , die Erlaubnis pragmatisch zu erhalten ... aber ich empfehle Ihnen, diese Codezeile in try {} catch {} zu setzen, wodurch Ihre App leider stoppt ... und in catch body ein Dialogfeld zu erstellen, in dem Sie navigieren Benutzer zu kleinem Tutorial, um das Zeichnen über die Berechtigung anderer Apps zu aktivieren ... dann klicken Sie auf die Schaltfläche Ja, um diesen Code einzugeben ...

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

Diese Absicht ist es, die Liste der Zeichnungen über andere Apps direkt zu öffnen , um Berechtigungen zu verwalten. Von hier aus ist es ein Klick, um über andere Apps zu ziehen. Berechtigungen ... Ich weiß, dies ist nicht die Antwort, die Sie suchen ... aber Ich mache das in meinen Apps ...

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.