2

ユーザーによって android.permission.RECEIVE_SMS が付与された後、私のアプリはユーザーの 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$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)

助けが必要です、ありがとう

4

2 に答える 2

2

これはパーミッション グループの仕組みとは異なります。グループは主に、許可要求がユーザーにどのように表示されるかを示します。

特定のアクセス許可を要求する場合、特定のアクセス許可の説明ではなく、グループの説明がユーザーに提示されます。さらに、ユーザーがグループ内の特定の権限を既に付与している場合、そのグループ内の別の権限に対する後続の要求は、ユーザーに再度プロンプトを表示することなく自動的に付与されます。

ただし、アプリは必要な特定のパーミッションをそれぞれリクエストする必要があります。あなたの場合、権限を持っていても、具体的にリクエストするまでRECEIVE_SMS、アプリに権限が自動的に付与されることはありません。READ_SMS

Requesting Permissions at Run Timeをカバーする開発者ページに記載されているように:

注:ユーザーが同じグループで別の権限を既に付与している場合でも、アプリは必要なすべての権限を明示的に要求する必要があります。さらに、グループへのアクセス許可のグループ化は、今後の Android リリースで変更される可能性があります。特定のパーミッションが同じグループに属している、または属していないという前提に基づいてコードを作成しないでください。

于 2016-07-20T04:08:03.137 に答える
0

許可がまだ付与されていますか? Marshmallow では、ユーザーはいつでも許可を拒否できます。

于 2016-07-20T03:32:45.167 に答える