权限组不工作

Permission Group not working

在用户授予 android.permission.RECEIVE_SMS 后,我的应用程序将读取用户的短信,
但有些用户会崩溃(我无法让它发生)。

android.permission.RECEIVE_SMS和android.permission.READ_SMS都在AndroidManifest.xml中声明,并且它们是相同的权限组(https://developer.android.com/guide/topics/security/permissions.html)

详细的崩溃报告:

java.lang.RuntimeException: An error occurred while executing doInBackground()
    at android.os.AsyncTask.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.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.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)

我需要帮助,谢谢

您确定权限仍然被授予吗?在 Marshmallow 上,用户可以随时拒绝该权限。

这不是权限组的工作方式。组主要用于权限请求如何显示给用户。

请求特定权限时,组描述是呈现给用户的内容,而不是特定权限描述。此外,如果用户已经在组中授予了特定权限,则后续对该组中其他权限的请求将自动授予,而无需再次提示用户。

但是,您的应用仍然需要请求它需要的每个特定权限。在您的情况下,拥有 RECEIVE_SMS 权限不会自动授予您的应用程序 READ_SMS 权限,除非您明确请求它。

如开发者页面所述 Requesting Permissions at Run Time:

Note: Your app still needs to explicitly request every permission it needs, even if the user has already granted another permission in the same group. In addition, the grouping of permissions into groups may change in future Android releases. Your code should not rely on the assumption that particular permissions are or are not in the same group.