it-swarm.com.de

Android M-Berechtigungsdialogfeld wird nicht angezeigt

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?

57
Jens

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.

9
Jens

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.

97
Tamás Cseh

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"/>
22
Khang .NT

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.

13
shanraisshan

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">
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 usw.

9
Vinil Chandran

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" />
2
user3663026

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

}
2

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
2
TheIT

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);
1
M. Usman Khan

Um @ shanraisshans Antwort hinzuzufügen, muss der REQUEST_CODE tatsächlich größer als 0 sein, nicht nur nicht negativ.

1
joakim

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

1
Nick Cardoso

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

1
Naveen Rao

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.

0
Akash Bisariya

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

0

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 

0
Kadir Erturk

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.

0
Magnus W

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

0
Irfan S

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" />
0
Roberto

Setzen Sie Ihre targetSdkVersion auf 22 .

0
Iman Marashi
@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");
        }
    }
0
Ahmad Aghazadeh

Fügen Sie auch die Berechtigung in der Manifestdatei hinzu.

0
Phani varma

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.

0
paperduck

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.

0
Jens

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"/>
0
shahrukhamd

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.

0
mogile_oli