2016-07-20 14 views
2

Nach gewährt android.permission.RECEIVE_SMS von Benutzer, meine App liest Benutzer SMS,
aber einige Benutzer werden abstürzen (ich kann es nicht passieren).

Berechtigungsgruppe funktioniert nicht

Beide android.permission.RECEIVE_SMS und android.permission.READ_SMS sind in AndroidManifest.xml erklärt, und sie sind die gleichen Berechtigungsgruppe (https://developer.android.com/guide/topics/security/permissions.html)

Das Detail Absturzbericht:

java.lang.RuntimeException: An error occurred while executing doInBackground() 
    at android.os.AsyncTask$3.done(AsyncTask.java:309) 
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) 
    at java.util.concurrent.FutureTask.setException(FutureTask.java:223) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
    at java.lang.Thread.run(Thread.java:818) 
Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.telephony.SmsProvider uri content://sms/ from pid=24160, uid=10244 requires android.permission.READ_SMS, or grantUriPermission() 
    at android.os.Parcel.readException(Parcel.java:1620) 
    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183) 
    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135) 
    at android.content.ContentProviderProxy.query(ContentProviderNative.java:421) 
    at android.content.ContentResolver.query(ContentResolver.java:502) 
    at android.content.CursorLoader.loadInBackground(CursorLoader.java:64) 
    at android.content.CursorLoader.loadInBackground(CursorLoader.java:42) 
    at android.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:312) 
    at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:69) 
    at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:57) 
    at android.os.AsyncTask$2.call(AsyncTask.java:295) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
    ... 3 more 
java.lang.SecurityException: Permission Denial: reading com.android.providers.telephony.SmsProvider uri content://sms/ from pid=24160, uid=10244 requires android.permission.READ_SMS, or grantUriPermission() 
    at android.os.Parcel.readException(Parcel.java:1620) 
    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183) 
    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135) 
    at android.content.ContentProviderProxy.query(ContentProviderNative.java:421) 
    at android.content.ContentResolver.query(ContentResolver.java:502) 
    at android.content.CursorLoader.loadInBackground(CursorLoader.java:64) 
    at android.content.CursorLoader.loadInBackground(CursorLoader.java:42) 
    at android.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:312) 
    at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:69) 
    at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:57) 
    at android.os.AsyncTask$2.call(AsyncTask.java:295) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
    at java.lang.Thread.run(Thread.java:818) 

Ich brauche Hilfe, Danke

+1

"__Hinweis: __ Ihre App muss immer noch explizit jede erforderliche Berechtigung anfordern, auch wenn der Benutzer in derselben Gruppe bereits eine andere Berechtigung erteilt hat." - [Referenz] (https://developer.android.com/training/permissions/requesting.html#perm-request) –

+0

Mike M, ich sehe es jetzt ..., danke, was für eine gute Anmerkung .... – HenryChuang

+0

Kein Problem. Ich werde eine etwas bessere Erklärung in einer Antwort zusammenstellen, wenn ich eine Minute hier bin. –

Antwort

2

Das ist nicht ganz so, wie Berechtigungsgruppen funktionieren. Gruppen dienen hauptsächlich dazu, wie Berechtigungsanfragen dem Benutzer angezeigt werden.

Wenn Sie eine bestimmte Berechtigung anfordern, wird die Gruppenbeschreibung dem Benutzer angezeigt, nicht die spezifische Berechtigungsbeschreibung. Wenn der Benutzer in einer Gruppe bereits eine bestimmte Berechtigung erteilt hat, wird automatisch eine weitere Anforderung für eine andere Berechtigung in dieser Gruppe erteilt, ohne dass der Benutzer erneut dazu aufgefordert werden muss.

Ihre App muss jedoch immer noch jede spezifische Berechtigung anfordern, die sie benötigt. In Ihrem Fall gewährt die Berechtigung RECEIVE_SMS Ihrer App nicht automatisch die Berechtigung READ_SMS, bis Sie sie ausdrücklich anfordern.

Wie auf der Entwicklerseite bedeckt Requesting Permissions at Run Time:

Hinweis: Ihre App muss noch explizit jede Erlaubnis ersuchen, sie braucht, auch wenn der Benutzer bereits eine andere Berechtigung in der gleichen Gruppe gewährt hat. Darüber hinaus kann sich die Gruppierung von Berechtigungen in Gruppen in zukünftigen Android-Versionen ändern. Ihr Code sollte nicht auf der Annahme beruhen, dass bestimmte Berechtigungen sich in derselben Gruppe befinden oder nicht.

0

Sind Sie sicher, dass die Erlaubnis noch erteilt wird? Auf Marshmallow kann der Benutzer die Erlaubnis jederzeit ablehnen.