Android M-Berechtigungsdialog wird nicht angezeigt

73

Ich versuche derzeit, meine Anwendung an das neue Berechtigungsmodell von Android M anzupassen.

Ich sammle alle erforderlichen Berechtigungen und führe sie aus

Log.i("Permissions", "Requesting permissions: " + permissions);
requestPermissions(requiredPermissions.toArray(new String[requiredPermissions.size()]), requestCodeForPermissions);

requiredPermissions enthält die Berechtigungen, die ich benötige android.permission.WRITE_EXTERNAL_STORAGE.

Diese Routine wird definitiv ausgeführt, da ich die Protokollzeile im Protokoll habe:

08-07 12:52:46.469: I/Permissions(1674): Requesting permissions: android.permission.RECEIVE_BOOT_COMPLETED; android.permission.WRITE_EXTERNAL_STORAGE

Der Berechtigungsdialog wird jedoch nie angezeigt, geschweige denn onRequestPermissionsResult () wird aufgerufen.

Was mache ich falsch? Aufgrund einiger Tutorials habe ich festgestellt, dass mir nichts fehlt. Ich habe nur den Emulator zum Testen, kein physisches Gerät. Dies ist der Info-Bildschirm aus den Einstellungen: Bild

Es könnte erwähnenswert sein, noch etwas anderes zu erwähnen: Wenn ich versuche, die Übersicht der installierten Apps über den Startbildschirm zu öffnen, erhalte ich nur launcher3 has exited. Ich bin mir nicht sicher, ob das damit zusammenhängt.

Hat jemand eine Idee, warum es nicht angezeigt wird?

Jens
quelle
4
Welche Version der M Developer Preview verwenden Sie? In v1 WRITE_EXTERNAL_STORAGEwurde dangerousund musste nicht manuell angefordert werden. Das hat sich in v2 geändert, wo es wie andere dangerousBerechtigungen wie funktioniert CAMERA. Beachten Sie, dass dies RECEIVE_BOOT_COMPLETEDkeine dangerousErlaubnis ist. Sie müssen es nicht zur Laufzeit anfordern.
CommonsWare
Ich habe v2. Zum Testen habe ich Audio aufgenommen, das jetzt angefordert wird: 08-07 13: 49: 31.647: I / Permissions (1540): Anfordern von Berechtigungen: android.permission.RECEIVE_BOOT_COMPLETED; android.permission.WRITE_EXTERNAL_STORAGE; android.permission.RECORD_AUDIO Dies ist aus meinem Manifest: <used-sdk android: minSdkVersion = "MNC" android: targetSdkVersion = "MNC" /> Und dies ist aus der Datei project.properties: target = android-MNC targetSdkVersion = MNC compileSdkVersion = android-MNC Vermisse ich etwas, das für andere offensichtlich sein könnte?
Jens
2
Haben Sie die <uses-permission>Elemente in Ihrem Manifest? Das neue Laufzeitberechtigungsmodell macht <uses-permission>Elemente nicht überflüssig . Es werden lediglich zusätzliche Anforderungen zum Anfordern von Berechtigungen zur Laufzeit für ausgewählte Berechtigungsgruppen hinzugefügt.
CommonsWare
Ja, mein Manifest enthält noch alle alten Verwendungsberechtigungselemente.
Jens
Nun, diese Beispiel-App von mir scheint auf MNC v2 gut zu funktionieren. Vergleichen und kontrastieren Sie das, was Sie haben, mit dem, was ich habe.
CommonsWare

Antworten:

113

Ich hatte das gleiche Problem, aber später wurde mir klar, dass ich vergessen hatte, die Berechtigung zur Manifestdatei hinzuzufügen. Nach dem Hinzufügen des Verwendungsberechtigungs-Tags zeigte das System den Dialog an. Vielleicht hilft jemand.

Tamás Cseh
quelle
13
pfff.wasted fast 2 Stunden bis zu diesem Beitrag (im Manifest war grobe_Lage im Code fine_location) ....
Alexandru Circus
Gleich hier ... Danke!
Silas
3
Genial! Das ist das Problem bei der schnellen Entwicklung! Sie vermissen grundlegende Dinge dahinter. Vielen Dank!
Guillem Roca
Interessant, ich auch =))
Hilal
2
Aber es wurde nicht behoben, weil ich auch tabhost verwendet habe und das ist wahrscheinlich auch ein Problem, wenn Sie den zulässigen Dialog anzeigen möchten, fand diesen Beitrag
Hilal
28

Ich habe den ganzen Tag gebraucht, um herauszufinden, was das Problem verursacht hat. Die ursprüngliche Antwort hat mir geholfen.

Ich habe Folgendes behoben tools:remove="android:maxSdkVersion":

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:remove="android:maxSdkVersion"/>
Khang .NT
quelle
14

Ich hatte das gleiche Problem, weil ich den negativen Wert als REQUEST_CODE verwendet habe.

requestPermissions(new String[]{android.Manifest.permission.CAMERA}, -1)

Nach Verwendung des positiven Werts zeigte das System den Dialog an. Hoffe es hilft jemandem.

Shanraisshan
quelle
Dies war die Lösung. Absolut bizarr, dass negative Zahlen dazu führen, dass Android auf solch subtile und ärgerliche Weise versagt.
aroth
Danke!, Das war mein Fall, da ich nicht am Rückruf teilnehmen wollte
jevora
Du hast mein Leben gerettet
YON
10

Basierend auf dem Kommentar von Hilal (vielen Dank!): In meinem Fall verwendet meine App tatsächlich Tabhost und die Berechtigungen wurden von einer Aktivität im Tabhost angefordert. Nach dem Starten einer separaten Aktivität, die die Berechtigungen anfordert, funktioniert sie.

Jens
quelle
9

Ich hatte gerade das gleiche Problem. Mein Problem war, dass ich die Erlaubnis an der falschen Stelle im Manifest geschrieben habe. Stellen Sie sicher, dass die Verwendungsberechtigung außerhalb der Anwendung liegt:

    <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.google.android.gms.samples.vision.face.photo"
    android:installLocation="auto"
    android:versionCode="1"
    android:versionName="1" >

    <uses-sdk
        android:minSdkVersion="9"
        android:targetSdkVersion="21" />

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>


    <application
        android:hardwareAccelerated="true"
        android:label="FacePhotoDemo"
        android:allowBackup="true"
        android:icon="@drawable/icon">
Loïs Talagrand
quelle
9

hinzufügen

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

in AndroidManifest.xml

Hinweis: Die Berechtigung, die Sie erhalten möchten. ZB: android.permission.ACCESS_FINE_LOCATION etc.

Vinil Chandran
quelle
Das war mein Problem. Lassen Sie sich nicht von dem offiziellen Dokument täuschen, das Sie auffordert, einen maxSdk-Wert festzulegen. :(
obwohl
2

Ich bin auch auf eine Situation gestoßen, in der der Berechtigungsdialog nicht angezeigt wird oder die Anwendung bei Verwendung des <uses-permission-sdk23>Elements abstürzt. Die Ursache scheint jedoch ein Systemfehler auf aktuellen 6.0-Geräten zu sein:

https://code.google.com/p/android/issues/detail?id=189841

Absturzausnahme:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity}: java.lang.NullPointerException: Attempt to get length of null array
Das es
quelle
2

Ich habe das gleiche Problem und das Problem ist behoben, nachdem die shouldShowRequestPermissionRationale wie folgt hinzugefügt wurde:

if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
        Manifest.permission.READ_CONTACTS)) {

} else {
    ActivityCompat.requestPermissions(thisActivity,
            new String[]{Manifest.permission.READ_CONTACTS},
            MY_PERMISSIONS_REQUEST_READ_CONTACTS);

}
Hai nguyen thanh
quelle
1
Dies würde nichts ändern
Chad Bingham
2

Um @ shanraisshans Antwort zu ergänzen, muss die REQUEST_CODEtatsächlich größer als 0 sein, nicht nur nicht negativ.

Joakim
quelle
2

In unserem Code war es ein einfacher Rechtschreibfehler.

Wir hatten:

<uses-permission android:name="android.permission.ACCESS_COURSE_LOCATION" /> 

Es sollte sein:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
RJ.
quelle
2

In meinem Fall war die von mir angeforderte Berechtigung (WRITE_SETTINGS) spezieller und erforderte zum Starten Einstellungen. Der Dialog wurde also nicht angezeigt.

Ich musste seine Erlaubnis mit dem folgenden Code einholen:

Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse("package:" + context.getPackageName()));
startActivityForResult(intent, CODE_WRITE_SETTINGS_PERMISSION);
M. Usman Khan
quelle
WRITE_SETTINGSwird als spezielle Erlaubnis behandelt und erfordert eine besondere Behandlung: developer.android.com/guide/topics/permissions/…
ccpizza
2

Ein weiterer Grund dafür, dass der Berechtigungsdialog nicht angezeigt wird, wenn eine gefährliche Berechtigung angefordert wird ...

Ich musste Build -> Clean Project und dann Build -> Rebuild Project ausführen . Ich denke, Android Studio hat die Änderungen, die ich im Manifest vorgenommen habe, nicht aufgegriffen.

Magnus W.
quelle
Ich habe einen halben Tag verschwendet, um herauszufinden, was mit meinem Code nicht stimmt. Vielen Dank :)
Hidd
2

Ich hatte ein ähnliches Problem, das durch den falschen Fall der Berechtigungskonstante im Manifest verursacht wurde, den ich read_contactsin Kleinbuchstaben verwendete:

<uses-permission android:name="android.permission.read_contacts" />

Nach dem Wechsel read_contactsin Großbuchstaben funktionierte es wie erwartet

<uses-permission android:name="android.permission.READ_CONTACTS" />
Roberto
quelle
1

Ich habe all die Dinge , die in den Antworten oben , aber noch wurde Dialog nicht angezeigt wird und dann wechselte ich targetSdkVersionzu 23in gradle und es schien. Hoffe das hilft jemandem

Naveen Rao
quelle
1

Berechtigungen sind in Kategorien unterteilt, sodass unkritische Berechtigungen erteilt werden, ohne dass der Dialog angezeigt wird.

Ich fand dies auf die harte Tour mit der Internet-Berechtigung. Wenn Sie dieses Problem haben, können Sie durch Ändern einer kritischen Berechtigung wie read_contacts Ihren Datenfluss testen und feststellen, ob es sich bei dem Problem um eine nicht kritische Berechtigung oder um etwas anderes handelt.

Normale Schutz Berechtigungen aufgeführt hier

Nick Cardoso
quelle
1

Im Manifest habe ich mich verändert

 <uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="22" />

zu

 <uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
     />

Vielleicht hilft das.

mogile_oli
quelle
1

Fügen Sie der Manifestdatei ebenfalls Berechtigungen hinzu.

Phani Varma
quelle
1

Wenn jemand von euch eine Anwendung hat, die sich ändert / modifiziert WRITE_SETTINGSund mit diesem Problem konfrontiert ist. Auschecken CommonsWare Antwort auf WRITE_SETTINGS Mehrdeutigkeit

Ich war 2 Wochen lang mit diesem Problem konfrontiert und stellte später fest, dass dieses Problem auf die Tatsache zurückzuführen ist, dass requestPermissionses nicht funktioniert, um eine WRITE_SETTINGSErlaubnis anzufordern . Hoffe das hilft: D.

Irfan S.
quelle
1

In meinem Fall hatte ich "ACCESS_COARSE_LOCATION" in meiner Manifestdatei angefordert und dann die Berechtigung "ACCESS_FINE_LOCATION" im Code angefordert, weshalb der Berechtigungsdialog nicht geöffnet wurde.

Akash Bisariya
quelle
1

Ich habe zwei Aufrufe von requestPermissions () direkt nacheinander ausgeführt. Diese Fehlermeldung wurde in Logcat angezeigt (beachten Sie die Rechtschreibfehler bei "Anfrage"):

Can reqeust only one set of permissions at a time

requestPermissions () ist tatsächlich so konzipiert, dass mehrere Anforderungen gleichzeitig entgegengenommen werden. Dafür ist das String-Array gedacht.

Papierente
quelle
0

Nach einer Weile scheint es erforderlich zu sein, den Wert compileSdkVersion auf "android-MNC" oder ab heute auf 23 zu setzen. Dies erfordert das Gradle-Build-System, für das dann anscheinend Android Studio erforderlich ist. Zumindest konnte ich kein einziges Handbuch finden, wie man es außerhalb der Gradle-Dateien einstellt.

Jens
quelle
Ich habe das gleiche Problem und habe es noch nicht gelöst. Das Lesen Ihrer Antwort hilft mir nicht wirklich, sie zu lösen? Könnten Sie bitte etwas mehr klarstellen? Meine compileSdkVersion war und ist 23 und ich erhalte immer noch diesen Fehler.
SudoPlz
ich auch. Ihre Antwort ist nichts wert, da unter 23 keine Laufzeitberechtigungen vorhanden waren.
Evgeniy Mishustin
Warum ist es nichts wert? Ich habe nur gesagt, dass es nicht funktioniert, um dies zu erreichen, wenn man Eclipse verwendet.
Jens
0
@Override
    public final void validateRequestPermissionsRequestCode(int requestCode) {
       // We use 16 bits of the request code to encode the fragment id when
       // requesting permissions from a fragment. Hence, requestPermissions()
       // should validate the code against that but we cannot override it as we
       // can not then call super and also the ActivityCompat would call back to
       // this override. To handle this we use dependency inversion where we are
       // the validator of request codes when requesting permissions in
       // ActivityCompat.
        if (!mRequestedPermissionsFromFragment
                && requestCode != -1 && (requestCode & 0xffff0000) != 0) {
            throw new IllegalArgumentException("Can only use lower 16 bits for requestCode");
        }
    }
Ahmad Aghazadeh
quelle
0

Hatte das gleiche Problem. Später wurde mir klar, dass wir jede Erlaubnis im Manifest deklarieren müssen (auch wenn eine eine Unterklasse einer anderen ist). In meinem Fall habe ich erklärt

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

in meinem Manifest und versuchte, auf den groben Standort des Benutzers zuzugreifen.

ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)

Das Problem wurde behoben, indem auch im Manifest eine grobe Berechtigung hinzugefügt wurde.

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
Shahrukhamd
quelle
0

Setzen Sie Ihre targetSdkVersion auf 22 .

Iman Marashi
quelle
0

hatte das gleiche (ich denke) Problem und die Lösung wurde entfernt

import <app package>.Manifest;

Wird von Android Studio oben in der Datei automatisch importiert und durch ersetzt

import android.Manifest; 

und fing an zu arbeiten

Alberto Cappellina
quelle
0

In meinem Fall ist die Lösung die Zeichenfolge selbst

android.permission.READ_CONTACTS

Ich habe Manifest.permission.READ_CONTACTS ausgeführt, was zu einem Stillefehler führte (Noting wird auf dem Bildschirm angezeigt).

Stellen Sie sicher, dass dies korrekt ist

Kadir Erturk
quelle
Manifest.permission.READ_CONTACTS = "android.permission.READ_CONTACTS"
M. Usman Khan
0

Meine Android targetSDK-Version ist 28.

Ich sehe keine Popups, die dem Benutzer angezeigt werden, der um Erlaubnis bittet, und die in android Manifest.xml als aufgeführt sind. Während der Installation installieren Sie .apk über USB und installieren die App aus dem Google Play Store. Daher habe ich in meiner Aktivität den folgenden Code hinzugefügt, der den Benutzer zur Laufzeit um Erlaubnis bittet

ActivityCompat.requestPermissions (MyActivity.this, neuer String [] {Manifest.permission.READ_PHONE_STATE}, 1);

Smitha
quelle
0

Ich bat um Erlaubnis durch Code, hatte aber das Hinzufügen des <uses-permission ..>Tags im Manifest verpasst !

AndroidGuy
quelle
-1

Ändern Sie den endgültigen Konstantenwert auf 1.

private static final int REQUEST_PERMISSION_WRITE = 1;

ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_PERMISSION_WRITE);
anto004
quelle