2016-05-18 5 views
0

Ich habe die Berechtigungen in meinem manisfest für api 22-:Warum wird die Berechtigung verweigert, nachdem der Benutzer gefragt wurde?

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission 
    android:name="android.permission.ACCESS_FINE_LOCATION" 
    android:maxSdkVersion="22" /> 
<uses-permission 
    android:name="android.permission.ACCESS_COARSE_LOCATION" 
    android:maxSdkVersion="22" /> 
<uses-permission 
    android:name="android.permission.READ_CONTACTS" 
    android:maxSdkVersion="22" /> 
<uses-permission 
    android:name="android.permission.WRITE_CONTACTS" 
    android:maxSdkVersion="22" /> 
<uses-permission 
    android:name="android.permission.READ_EXTERNAL_STORAGE" 
    android:maxSdkVersion="22" /> 

und die Laufzeitprüfung für Berechtigungen als auch für api 23+:

private void requestGpsPermission() { 
    if (ContextCompat.checkSelfPermission(this, 
      Manifest.permission.READ_CONTACTS) 
      != PackageManager.PERMISSION_GRANTED || 
      ContextCompat.checkSelfPermission(this, 
      Manifest.permission.WRITE_CONTACTS) 
      != PackageManager.PERMISSION_GRANTED) 
     ActivityCompat.requestPermissions(this, new String[]{ 
       Manifest.permission.READ_CONTACTS, 
       Manifest.permission.WRITE_CONTACTS}, 1); 

    if (ContextCompat.checkSelfPermission(this, 
      Manifest.permission.ACCESS_FINE_LOCATION) 
      != PackageManager.PERMISSION_GRANTED || 
      ContextCompat.checkSelfPermission(this, 
        Manifest.permission.ACCESS_COARSE_LOCATION) 
        != PackageManager.PERMISSION_GRANTED) 
     ActivityCompat.requestPermissions(this, new String[]{ 
       Manifest.permission.ACCESS_FINE_LOCATION, 
       Manifest.permission.ACCESS_COARSE_LOCATION}, 2); 

    if (ContextCompat.checkSelfPermission(this, 
      Manifest.permission.READ_EXTERNAL_STORAGE) 
      != PackageManager.PERMISSION_GRANTED) 
     ActivityCompat.requestPermissions(this, new String[]{ 
       Manifest.permission.READ_EXTERNAL_STORAGE}, 3); 
} 

Und ich habe immer noch die Fehler:

Writing exception to parcel 
java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/fs_id from pid=20520, uid=10089 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission() 
                 at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:605) 
                 at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:480) 
                 at android.content.ContentProvider$Transport.query(ContentProvider.java:211) 
                 at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:112) 
                 at android.os.Binder.execTransact(Binder.java:453) 

Failed to clear out contacts 
java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.ContactsProvider2 from ProcessRecord{9b0bd73 20520:com.google.android.apps.plus/u0a89} (pid=20520, uid=10089) requires android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS 
                     at android.os.Parcel.readException(Parcel.java:1620) 
                     at android.os.Parcel.readException(Parcel.java:1573) 
                     at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:3594) 
                     at android.app.ActivityThread.acquireProvider(ActivityThread.java:4799) 
                     at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2018) 
                     at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1466) 
                     at android.content.ContentResolver.query(ContentResolver.java:475) 
                     at android.content.ContentResolver.query(ContentResolver.java:434) 
                     at ddt.a(PG:447) 
                     at ddt.b(PG:1396) 
                     at ddu.run(PG:333) 
                     at java.lang.Thread.run(Thread.java:818) 

Ich versuche, die App in einem Android 6.0-Gerät auszuführen. Irgendeine Idee, wie man es löst?

+0

Ihr Berechtigungsantrag-Code ist ziemlich seltsam, da Sie versuchen, drei separate Dialoge in eine Warteschlange zu stellen. Sind Sie darüber hinaus sicher, dass Sie darauf warten, dass dieser Thread ausgeführt wird (wo Ihr Absturz auftritt), bis Sie die Berechtigung erhalten haben? Denken Sie daran, dass 'requestPermissions()' asynchron ist - wenn diese Methode zurückkehrt, wurde der Benutzer noch nicht einmal * nach der Berechtigung gefragt, geschweige denn gewährt. – CommonsWare

+0

Die in der Warteschlange befindlichen Dialoge sind kein Problem, sie erscheinen nacheinander, und ich rufe sie auf, sobald ich eine Aktivität starte, die keine Aktion ausführt, während die Dialoge angezeigt werden. Die Aktionen werden durch Klicken auf die Schaltfläche festgelegt. Und selbst wenn es ein Problem verursacht, werden die Dialoge nur einmal angezeigt, wenn ich die App neu starte, sind die Berechtigungen schon da und ich habe immer wieder den gleichen Fehler :-( – Erick

Antwort

0

Nachdem ich für 2 Tage gekämpft habe, habe ich es endlich geschafft. Mir fehlte die folgende Methode:

1 @Override 
2 public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
3  // If request is cancelled, the result arrays are empty. 
4  if (grantResults.length > 0 
5    && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
6   // permission granteed 
7  P.toast(this, "permission granteed :-)"); 
8   getHeaders(); 
9  } else { 
10  // permission denied 
11  P.toast(this, "permission denied :-("); 
12 } 
13 return; 
14} 

I als auch die Prüfungsmethode zu ändern hatte, so falls ich bereits über die Berechtigungen Es getHeaders() aufrufen, von dort:

1 private void requestGpsPermission() { 
2  if (
3    ContextCompat.checkSelfPermission(this, 
4      Manifest.permission.READ_CONTACTS) 
5      != PackageManager.PERMISSION_GRANTED || 
6      ContextCompat.checkSelfPermission(this, 
7        Manifest.permission.ACCESS_FINE_LOCATION) 
8        != PackageManager.PERMISSION_GRANTED || 
9      ContextCompat.checkSelfPermission(this, 
10       Manifest.permission.READ_EXTERNAL_STORAGE) 
11       != PackageManager.PERMISSION_GRANTED 
12   ) { 
13  ActivityCompat.requestPermissions(this, new String[]{ 
14    Manifest.permission.READ_CONTACTS, 
15    Manifest.permission.ACCESS_FINE_LOCATION, 
16    Manifest.permission.READ_EXTERNAL_STORAGE 
17  }, 1); 
18 } else { 
19  getHeaders(); 
20 } 
21} 

Beachten Sie, dass ich Rufen Sie die gleiche Methode in Zeile 8 des ersten mehotd und Zeile 19 des zweiten.

Verwandte Themen