Come aprire a livello di programmazione la schermata delle autorizzazioni per un'app specifica su Android Marshmallow?


330

Ho una domanda sulla nuova versione di Android Marshmallow:

È possibile visualizzare la schermata di autorizzazione per un'app specifica tramite un Intent o qualcosa di simile?

Schermata di autorizzazione Android M

È possibile visualizzare le impostazioni dell'app con il seguente codice: esiste una soluzione analogica per aprire direttamente la schermata di autorizzazione?

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

Ho già fatto qualche ricerca su questo, ma non sono riuscito a trovare una soluzione adeguata - apprezzerei ogni aiuto!


Prova questo potrebbe funzionare stackoverflow.com/a/41221852/5488468
Bipin Bharti

Risposte:


443

Secondo il video ufficiale delle autorizzazioni Marshmallow (al punto 4m 43s ), è invece necessario aprire la pagina Impostazioni dell'applicazione (da lì è un clic sulla pagina Autorizzazioni).

Per aprire la pagina delle impostazioni, lo faresti

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

12
Sta reindirizzando ai dettagli generali della schermata dell'applicazione. Come andare alla schermata Autorizzazioni app specifiche. Non voglio che anche quel clic rimanente,
Milind Mevada,

5
@MilindMevada - non puoi farlo al momento.
Martin Konecny,

potresti inviare dati dall'attività delle impostazioni alla tua attività usando gli intenti, in "tempo reale"? il problema che sto affrontando sta gestendo questi dati nella tua attività una volta che sono stati inviati dalle impostazioni.
ThunderWiring il

Funziona durante il debug dell'app, ma si arresta in modo anomalo senza motivo reale dopo aver firmato l'APK. Nulla di ovvio nel logcat.
JCutting8

181

Non è possibile. Ho provato anche a farlo. Potrei capire il nome del pacchetto e l'attività che verrà avviata. Ma alla fine otterrai un'eccezione di sicurezza a causa di un'autorizzazione mancante che non puoi dichiarare.

AGGIORNARE:

Per quanto riguarda l'altra risposta, consiglio anche di aprire la schermata delle impostazioni dell'app. Faccio questo con il seguente codice:

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

Poiché non voglio averlo nel mio stack di cronologia, lo rimuovo usando i flag di intento.


Ho sperimentato lo stesso e ho pensato che potrebbe esserci una soluzione alternativa / un'altra soluzione per questo ...: - /
Frederik Schweiger

No, sfortunatamente non è possibile in base alla progettazione. Per ulteriori informazioni, dai un'occhiata a questa discussione su Google+: goo.gl/Wqjjff
Frederik Schweiger,

1
@Mulgard Whatsapp deve utilizzare targetSdk = "23". Ciò consente all'app di richiedere all'utente di abilitare l'autorizzazione. Se l'SDK di destinazione <23, essere in grado di mostrare all'utente la schermata delle autorizzazioni dell'app è utile, tuttavia sembra che possiamo solo mostrare la schermata delle impostazioni generali dell'app.
vman,

4
Intent.FLAG_ACTIVITY_NO_HISTORY a volte può causare una situazione problematica sui tablet quando viene visualizzato un popup nella schermata delle impostazioni che chiuderà la schermata delle impostazioni. La semplice rimozione di quella bandiera risolverà questo problema.
Wirling,

2
Puoi mostrare un brindisi contemporaneamente
indicando

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

Descrizione Apre la pagina di impostazione dei dettagli per l'app. Da qui l'utente deve assegnare manualmente l'autorizzazione desiderata.

Settings.ACTION_APPLICATION_DETAILS_SETTINGS
  

Intent.FLAG_ACTIVITY_NEW_TASK
   Opzionale . Se impostato, apre la schermata delle impostazioni (Attività) come nuova attività. Altrimenti, verrà aperto nell'attività attualmente in esecuzione.

Uri.fromParts("package", getPackageName(), null)
   Prepara o crea l'URI, mentre getPackageName () - restituisce il nome del pacchetto dell'applicazione.

intent.setData(uri)
   Non dimenticare di impostare questo . Altrimenti, otterrai android.content.ActivityNotFoundException . Perché hai impostato il tuo intento come Settings.ACTION_APPLICATION_DETAILS_SETTINGS e Android si aspetta un nome da cercare.


Questa è letteralmente la risposta più votata. Perché duplicare questo e non estendere la risposta originale ?!
Thomas Keller,

1
Grazie per la spiegazione approfondita.
David Refoua,

34

Puoi invece aprire le impostazioni generali di una determinata app con una riga

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

È possibile che si desideri utilizzare getActivity (). GetPackageName () per ottenere il nome del pacchetto in base alla configurazione della build.
Cory Roy,

15

Non è possibile aprire a livello di codice la schermata delle autorizzazioni. Invece, possiamo aprire la schermata delle impostazioni dell'app.

Codice

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

Uscita campione

inserisci qui la descrizione dell'immagine


1
Chiede la pagina di autorizzazione
Maveň ツ

10

Se vuoi scrivere meno codice Kotlin, puoi farlo:

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

Basato sulla risposta di Martin Konecny


buon uso delle estensioni di Kotin
David Jarvis,

8

Stile Kotlin.

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

5

Potrebbe essere questo che ti aiuterà

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

Se stiamo parlando di Flyme OS (Meizu) SOLO ci sono una propria applicazione di sicurezza con le autorizzazioni.

Per aprirlo usa il seguente intento:

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-causa BuildConfig è la vostra applicazione 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

non è possibile ottenere pragmaticamente il permesso ... ma ti suggerisco di mettere quella riga di codice in try {} catch {} che fa fermare la tua app purtroppo ... e in catch body crea una finestra di dialogo che navigherà utente al piccolo tutorial per abilitare il disegno sopra le autorizzazioni di altre app ... quindi sul pulsante Sì fare clic su Inserisci questo codice ...

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

Questo intento è quello di aprire direttamente la lista di disegnare su altre applicazioni per gestire i permessi e poi da qui è uno scatto per il sorteggio su altre autorizzazioni applicazioni ... So che questa non è la risposta che state cercando ... ma Lo sto facendo nelle mie app ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.