Ich versuche gerade, meine Anwendung an das neue Berechtigungsmodell von Android M anzupassen.
Ich sammle alle Berechtigungen, die ich benötige, und dann ausführen
Log.i("Permissions", "Requesting permissions: " + permissions);
requestPermissions(requiredPermissions.toArray(new String[requiredPermissions.size()]), requestCodeForPermissions);
requiredPermissions enthält die Berechtigungen, die ich wie Android.permission.WRITE_EXTERNAL_STORAGE
benötige.
Diese Routine wird definitiv ausgeführt, da ich die Log-Zeile im Logcat habe:
08-07 12:52:46.469: I/Permissions(1674): Requesting permissions: Android.permission.RECEIVE_BOOT_COMPLETED; Android.permission.WRITE_EXTERNAL_STORAGE
Aber der Berechtigungsdialog zeigt nie, geschweige denn wird onRequestPermissionsResult () aufgerufen.
Was mache ich falsch? Basierend auf einigen Tutorials habe ich nichts vermisst ... Ich habe nur den Emulator zum Testen, kein physisches Gerät. Dies ist der Info-Bildschirm von den Einstellungen: Image
Vielleicht sollte man noch etwas anderes erwähnen: Wenn ich versuche, die Übersicht der installierten Apps vom Startbildschirm aus zu öffnen, bekomme ich nur launcher3 has exited
. Ich bin mir nicht sicher, ob das damit zusammenhängt.
Hat jemand eine Idee, warum es nicht angezeigt wird?
Basierend auf dem Kommentar von Hilal (vielen Dank!): In meinem Fall verwendet meine App Tabhost und die Berechtigungen wurden von einer Aktivität innerhalb des Tabhosts angefordert. Nachdem Sie eine separate Aktivität gestartet haben, die die Berechtigungen anfordert, funktioniert sie.
Ich habe das gleiche Problem erlebt, aber später wurde mir klar, dass ich vergessen habe, die Erlaubnis zur Manifestdatei hinzuzufügen. Nach dem Hinzufügen des Tags "users-permission" zeigte das System den Dialog an. Vielleicht hilft jemandem.
Ich habe meinen ganzen Tag gebraucht, um herauszufinden, was das Problem verursacht hat. Die ursprüngliche Antwort hat mir geholfen.
Ich habe das Problem behoben, indem ich tools:remove="Android:maxSdkVersion"
so hinzufügte:
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" tools:remove="Android:maxSdkVersion"/>
Das gleiche Problem trat auf, weil ich den negativen Wert als REQUEST_CODE verwendete.
requestPermissions(new String[]{Android.Manifest.permission.CAMERA}, -1)
Nachdem der positive Wert verwendet wurde, zeigte das System den Dialog an. Ich hoffe, es hilft jemandem.
Ich hatte gerade das gleiche Problem . Mein Problem war, dass ich die Erlaubnis an der falschen Stelle im Manifest geschrieben habe.
<?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">
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 usw.
In unserem Code war es ein einfacher Schreibfehler.
Wir hatten:
<uses-permission Android:name="Android.permission.ACCESS_COURSE_LOCATION" />
Es sollte sein:
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION" />
Ich habe das gleiche Problem und das Problem ist nach dem Hinzufügen der shouldShowRequestPermissionRationale wie folgt behoben:
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)) {
} else {
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
}
Ich bin auch auf eine Situation gestoßen, in der das Berechtigungsdialogfeld nicht angezeigt wird oder die Anwendung bei Verwendung des Elements <uses-permission-sdk23>
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
Crash-Ausnahme:
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
In meinem Fall war die von mir angeforderte Erlaubnis (WRITE_SETTINGS) spezieller und erforderte die Einstellung der Aktivitätsaktivitäten. Der Dialog wurde also nicht angezeigt.
Ich musste die Erlaubnis mit folgendem Code einholen:
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse("package:" + context.getPackageName()));
startActivityForResult(intent, CODE_WRITE_SETTINGS_PERMISSION);
Um @ shanraisshans Antwort hinzuzufügen, muss der REQUEST_CODE
tatsächlich größer als 0 sein, nicht nur nicht negativ.
Die Berechtigungen sind in Kategorien unterteilt, sodass nicht kritische Berechtigungen erteilt werden, ohne dass das Dialogfeld angezeigt wird.
Ich habe das mit der Internet-Erlaubnis auf die harte Tour gefunden. Wenn Sie dieses Problem haben, können Sie durch einen Wechsel zu einer kritischen Berechtigung wie read_contacts Ihren Fluss testen und feststellen, ob das Problem nicht kritisch ist oder etwas anderes.
Normaler Schutz Berechtigungen werden aufgelistet hier
Ich tat alle Dinge, die in den obigen Antworten erwähnt wurden, aber der Dialog wurde immer noch nicht angezeigt und dann änderte ich targetSdkVersion
in 23
in gradle und es erschien. Hoffe das hilft jemandem
In meinem Fall hatte ich "ACCESS_COARSE_LOCATION" in meiner Manifestdatei angefordert und dann die Berechtigung "ACCESS_FINE_LOCATION" im Code angefordert. Deshalb wurde der Berechtigungsdialog nicht geöffnet.
hatte das gleiche (ich schätze) Problem und die Lösung wurde entfernt
import <app package>.Manifest;
von Android Studio am Anfang der Datei automatisch importiert und durch ersetzt
import Android.Manifest;
und fing an zu arbeiten
In meinem Fall ist die Lösung die Zeichenfolge selbst
Android.permission.READ_CONTACTS
Ich habe Manifest.permission.READ_CONTACTS durchgeführt, was zu einem Stummschaltfehler führte (Hinweis wird auf dem Bildschirm angezeigt).
Stellen Sie sicher, dass dies richtig ist
Ein weiterer Grund, warum der Berechtigungsdialog nicht angezeigt wird, wenn eine gefährliche Berechtigung angefordert wird ...
Ich musste Build -> Clean Project und dann Build -> Project neu erstellen erstellen. Ich vermute, Android Studio hat meine Änderungen im Manifest nicht aufgegriffen.
Wenn einer von Ihnen eine Anwendung hat, die WRITE_SETTINGS
ändert/ändert und mit diesem Problem konfrontiert wird. Check out CommonsWares Antwort auf WRITE_SETTINGS Mehrdeutigkeit
Ich war zwei Wochen mit diesem Problem konfrontiert, und später wurde mir klar, dass dieses Problem auf die Tatsache zurückzuführen ist, dass requestPermissions
nicht funktioniert, wenn er WRITE_SETTINGS
die Erlaubnis beantragt
Ich hatte ein ähnliches Problem, das durch den falschen Fall der Berechtigungskonstante im Manifest verursacht wurde. Ich verwendete read_contacts
in Kleinbuchstaben:
<uses-permission Android:name="Android.permission.read_contacts" />
Nachdem read_contacts
in Großbuchstaben geändert wurde, funktionierte es wie erwartet
<uses-permission Android:name="Android.permission.READ_CONTACTS" />
Setzen Sie Ihre targetSdkVersion auf 22 .
@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");
}
}
Fügen Sie auch die Berechtigung in der Manifestdatei hinzu.
Ich führte zwei Aufrufe von requestPermissions () aus, eine nach der anderen. Diese Fehlermeldung wurde in Logcat angezeigt (beachten Sie den Rechtschreibfehler bei "Anfrage"):
Can reqeust only one set of permissions at a time
requestPermissions () ist eigentlich für die gleichzeitige Aufnahme mehrerer Anfragen konzipiert. Dafür gibt es das String-Array.
Nach einer Weile scheint es, als müsste der Wert compileSdkVersion auf "Android-MNC" oder ab heute auf 23 gesetzt werden. Das erfordert das Gradle-Build-System, das dann Android Studio zu benötigen scheint finden Sie ein einziges Handbuch zum Einstellen außerhalb der Gradle-Dateien.
Hatte das gleiche Problem. Später wurde mir klar, dass wir jede Erlaubnis in Manifest erklären müssen (selbst wenn 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 eine grobe Berechtigung im Manifest hinzugefügt wurde.
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION"/>
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.