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?
WRITE_EXTERNAL_STORAGE
wurdedangerous
und musste nicht manuell angefordert werden. Das hat sich in v2 geändert, wo es wie anderedangerous
Berechtigungen wie funktioniertCAMERA
. Beachten Sie, dass diesRECEIVE_BOOT_COMPLETED
keinedangerous
Erlaubnis ist. Sie müssen es nicht zur Laufzeit anfordern.<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.Antworten:
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.
quelle
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"/>
quelle
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.
quelle
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.
quelle
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">
quelle
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.
quelle
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
quelle
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); }
quelle
Um @ shanraisshans Antwort zu ergänzen, muss die
REQUEST_CODE
tatsächlich größer als 0 sein, nicht nur nicht negativ.quelle
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" />
quelle
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);
quelle
WRITE_SETTINGS
wird als spezielle Erlaubnis behandelt und erfordert eine besondere Behandlung: developer.android.com/guide/topics/permissions/…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.
quelle
Ich hatte ein ähnliches Problem, das durch den falschen Fall der Berechtigungskonstante im Manifest verursacht wurde, den ich
read_contacts
in Kleinbuchstaben verwendete:<uses-permission android:name="android.permission.read_contacts" />
Nach dem Wechsel
read_contacts
in Großbuchstaben funktionierte es wie erwartet<uses-permission android:name="android.permission.READ_CONTACTS" />
quelle
Ich habe all die Dinge , die in den Antworten oben , aber noch wurde Dialog nicht angezeigt wird und dann wechselte ich
targetSdkVersion
zu23
in gradle und es schien. Hoffe das hilft jemandemquelle
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
quelle
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.
quelle
Fügen Sie der Manifestdatei ebenfalls Berechtigungen hinzu.
quelle
Wenn jemand von euch eine Anwendung hat, die sich ändert / modifiziert
WRITE_SETTINGS
und mit diesem Problem konfrontiert ist. Auschecken CommonsWare Antwort auf WRITE_SETTINGS MehrdeutigkeitIch war 2 Wochen lang mit diesem Problem konfrontiert und stellte später fest, dass dieses Problem auf die Tatsache zurückzuführen ist, dass
requestPermissions
es nicht funktioniert, um eineWRITE_SETTINGS
Erlaubnis anzufordern . Hoffe das hilft: D.quelle
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.
quelle
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.
quelle
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.
quelle
@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"); } }
quelle
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"/>
quelle
Setzen Sie Ihre targetSdkVersion auf 22 .
quelle
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
quelle
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
quelle
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);
quelle
Ich bat um Erlaubnis durch Code, hatte aber das Hinzufügen des
<uses-permission ..>
Tags im Manifest verpasst !quelle
Ä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);
quelle