2015-08-07 1 views
45

ich derzeit versuche, meine Anwendung auf die neue Berechtigungsmodell von Android M.Android M Erlaubnis Dialog nicht angezeigt

Ich sammle alle Berechtigungen anzupassen ich benötige, dann laufen

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

requiredPermissions hält die Berechtigungen ich wie android.permission.WRITE_EXTERNAL_STORAGE benötigen.

Diese Routine wird auf jeden Fall ausgeführt, wie ich die Log Linie in der logcat haben:

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

Aber die Berechtigungen Dialog nie zeigt, geschweige denn ist onRequestPermissionsResult() aufgerufen.

Was mache ich falsch? Basierend auf einige Tutorials fand ich ich nichts fehlt. Ich habe nur den Emulator zum Testen, ohne physisches Gerät. Dies ist der über Bildschirm von Einstellungen: Image

Es könnte noch etwas anderes erwähnenswert sein: Wenn ich versuche, den Überblick über die installierten Apps aus dem Home-Bildschirm zu öffnen ich launcher3 has exited nur bekommen. Ich bin mir nicht sicher, ob das zusammenhängen könnte.

Hat jemand eine Idee, warum es nicht ist zeigt?

+3

Welche Version des Developer Preview M verwenden Sie? In v1 war "WRITE_EXTERNAL_STORAGE" nicht "gefährlich" und musste nicht manuell angefordert werden. Das änderte sich in v2, wo es wie andere 'gefährliche' Berechtigungen wie' CAMERA' funktioniert. Beachten Sie, dass "RECEIVE_BOOT_COMPLETED" keine "gefährliche" Erlaubnis ist; Sie müssen es zur Laufzeit nicht anfordern. – CommonsWare

+0

Ich habe v2. Zu Testzwecken habe ich Audiodatei hinzugefügt, die jetzt angefordert wird: 08-07 13: 49: 31.647: I/Permissions (1540): Erfordern von Berechtigungen: android.permission.RECEIVE_BOOT_COMPLETED; android.permission.WRITE_EXTERNAL_STORAGE; android.permission.RECORD_AUDIO Die von meinem Manifest: Und das ist aus der project.properties Datei: targetSdkVersion = MNC compileSdkVersion = android-MNC Vermische ich etwas, das für andere offensichtlich sein könnte? – Jens

+1

Haben Sie die '' - Elemente in Ihrem Manifest? Das neue Laufzeitberechtigungsmodell beseitigt nicht die Notwendigkeit von '- Elementen. Es fügt nur zusätzliche Anforderungen zum Anfordern von Berechtigungen zur Laufzeit für ausgewählte Berechtigungsgruppen hinzu. – CommonsWare

Antwort

4

Basierend auf den Kommentar von Hilal korrekt ist (vielen Dank!): In meinem Fall meine app in der Tat TabHost Verwendung und die Berechtigungen wurden von einer Aktivität innerhalb des TabHost angefordert. Nach dem Start einer separaten Aktivität, die die erforderlichen Berechtigungen anfordert.

0

Nach einer Weile scheint es erforderlich, den Wert compileSdkVersion auf "android-MNC" oder ab heute auf 23 zu setzen. Das erfordert das Gradle-Build-System, das dann Android Studio zu benötigen scheint. Wenigstens konnte ich kein einziges Handbuch finden, wie es außerhalb der gradle Dateien einzustellen.

+0

Ich habe das gleiche Problem und habe es noch nicht geschafft, es zu lösen. Deine Antwort zu lesen hilft mir nicht wirklich, es zu lösen? Könnten Sie bitte ein bisschen mehr klären? Meine compileSdkVersion war und ist immer noch 23 und ich erhalte immer noch diesen Fehler. – SudoPlz

+0

ich auch. Deine Antwort ist nichts wert, denn unter 23 gab es keine Runtime Permissions. –

+0

Warum ist es nichts wert? Ich habe nur gesagt, es scheint nicht zu funktionieren, um dies zu erreichen, wenn man Eclipse verwendet. – Jens

1

ich auch auf eine Situation gekommen sind, wo die Erlaubnis Dialog angezeigt oder die Abstürze nicht Anwendung, wenn das <uses-permission-sdk23> Element verwendet, jedoch ist die Ursache ein System Fehler auf aktuelle 6.0-Geräte zu sein scheint:

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

Absturz 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 
77

erlebte ich das gleiche Problem, aber ich später erkannte ich die Erlaubnis der Manifest-Datei hinzufügen vergessen. den uses-permission-Tages, zeigte das System den Dialog nach dem Hinzufügen. Vielleicht hilft jemand.

+0

thanx funktioniert für mich :) –

+10

pfff.wasted fast 2 Stunden bis zu diesem Post (in manifest war grob_location in code fine_location) .... –

+0

Das gleiche hier ... Danke! – Silas

11

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

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

Nachdem der positive Wert verwendet wurde, zeigte das System den Dialog an. Hoffe es hilft jemandem.

+0

Das war die Lösung. Absolut bizarr, dass negative Zahlen dazu führen, dass Android auf solch subtile und ärgerliche Weise versagt. – aroth

+0

Danke !, das war mein Fall, da ich nicht an dem Rückruf teilnehmen wollte – jevora

+0

Du hast mein Leben gerettet – Yon

8

hinzufügen

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

in AndroidManifest.xml

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

+0

Das war mein Problem. Lassen Sie sich nicht vom offiziellen Dokument täuschen, dass Sie einen maxSdk-Wert festlegen sollen. :( – althaus

1

Ich habe alle oben genannten Dinge in den oben genannten Antworten, aber immer noch Dialog nicht angezeigt und dann habe ich targetSdkVersion in 23 in Großbuchstaben geändert und es erschien.Hoffe, dass dies jemand

+2

Noch nicht angezeigt. –

2

hilft ich das gleiche Problem haben und das Problem nach dem Hinzufügen des shouldShowRequestPermissionRationale wie folgt gelöst:

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

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

} 
+3

Immer noch nicht zeigen. –

+0

Dies würde nichts ändern –

1

Berechtigungen in Kategorien organisiert sind so unkritische diejenigen ohne den Dialog gewährt werden gezeigt.

Ich fand dies auf die harte Tour mit Internet-Erlaubnis, wenn Sie dieses Problem haben dann zu einer kritischen Erlaubnis wie read_contacts ändern können Sie Ihren Fluss testen und enthüllen, ob das Problem ist die Erlaubnis nicht kritisch oder etwas anderes.

Normal protection Berechtigungen here

7

aufgeführt Ich hatte gerade das gleiche Problem. Mein Problem war, dass ich die Erlaubnis an der falschen Stelle im Manifest schrieb. Sicherstellen, dass die Verwendungserlaubnis außerhalb der Anwendung:

<?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"> 
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"); 
     } 
    } 
0

haben das gleiche Problem. Später wurde mir klar, dass wir jede Berechtigung im Manifest deklarieren müssen (auch wenn es sich um eine Unterklasse eines anderen handelt). Ich In meinem Fall erklärte

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

in meinem Manifest und versuchten Benutzers groben Standort zuzugreifen.

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

Das Problem wurde behoben, indem grobe Fehler in Manifest hinzugefügt wurden.

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

Im Manifest, änderte ich

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

zu

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

das hilft vielleicht.

0

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

1

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

0

Stellen Sie Ihren targetSdkVersion zu .

0

hatte das gleiche (i guess) Problem und die Lösung wurde

import <app package>.Manifest; 

autoimported von Android Studio am Anfang der Datei zurück und ersetze sie

import android.Manifest; 

und begann Entfernen Arbeits

0

In meinem Fall ist die Lösung die Zeichenfolge selbst

android.permiss Ion.READ_CONTACTS

Ich habe Manifest.permission.READ_CONTACTS, die Stille Fehler verursacht (Noting Show auf dem Bildschirm).

Stellen Sie sicher, dass diese

+0

Manifest.permission.READ_CONTACTS = "android.permission.READ_CONTACTS" – usman

1

In unserem Code war es ein einfacher Schreibfehler.

Wir hatten:

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

Es sollte:

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

Wenn jemand von euch eine Anwendung hat, die/modifiziert WRITE_SETTINGS ändert und dieses Problem gegenüber. Schauen Sie sich CommonsWare's Answer to WRITE_SETTINGS Ambiguity

Ich war für 2 Wochen dieses Problem gegenüber und später erkennen, dass dieses Problem aufgrund der Tatsache war, dass requestPermissions nicht für Ihr Interesse an WRITE_SETTINGS Erlaubnis funktioniert. Hoffe, das hilft: D

0

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

0

Ich machte zwei Anrufe an purchasePermissions(), eine direkt nach der anderen. Diese Fehlermeldung erscheint in Logcat (man beachte die falsche Schreibweise auf „Anfrage“):

Can reqeust only one set of permissions at a time 

requestPermissions() ist so konzipiert, tatsächlich mehrere Anfragen auf einmal zu nehmen; Dafür ist das String-Array zuständig.

0

Ändern der letzte konstante Wert 1.

private static final int REQUEST_PERMISSION_WRITE = 1; 

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

Es dauerte meinen ganzen Tag, um herauszufinden, was das Problem verursacht. Die ursprüngliche Antwort hat mir geholfen, hier: https://stackoverflow.com/a/40775623/3040498

Ich reparierte von tools:remove="android:maxSdkVersion" wie folgt ergänzt:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:remove="android:maxSdkVersion"/> 
+0

gespeichert dir mein Leben. Dank – Ale

+0

Sie meinen Tag retten! Thank you!) –

+0

Fast sprang im 50. Stock. Du hast mir das Leben gerettet. LOL.Daumen hoch zum ursprünglichen Beitrag und dies. – ralphgabb

0

In meinem Fall die Erlaubnis Ich beantrage (WRITE_SETTINGS) war speziell und erforderlichen Einstellungen Aktivität zu starten. Also wurde der Dialog nicht angezeigt.

Ich hatte seine Erlaubnis mit dem folgenden Code zu erhalten:

Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS); 
intent.setData(Uri.parse("package:" + context.getPackageName())); 
startActivityForResult(intent, CODE_WRITE_SETTINGS_PERMISSION);