我有一个应用程序,当通过ContentObserver
通知ContentProvider
更改时,尝试在后台线程上查询提供程序。这将导致抛出SecurityException
:
8-10 15:54:29.577 3057-3200/com.xxxx.mobile.android.xxx W/Binder﹕ Caught a RuntimeException from the binder stub implementation. java.lang.SecurityException: Permission Denial: reading com.xxx.mobile.android.mdk.model.customer.ContentProvider uri content://com.xxx.mobile.android.consumer.xxx/vehicle from pid=0, uid=1000 requires the provider be exported, or grantUriPermission() at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:539) at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:452) at android.content.ContentProvider$Transport.query(ContentProvider.java:205) at android.content.ContentResolver.query(ContentResolver.java:478) at android.content.ContentResolver.query(ContentResolver.java:422)
那么一个应用程序创建的线程怎么会和应用程序的ContentProvider
具有不同的UID呢?
通过在android.content.ContentProvider
中放置一个异常断点,我发现UserHandle.isSameApp(uid, mMyUid)
是false
,而UserHandle.isSameUser(uid, mMyUid)
是true
。 我还看到提供程序的UID为10087。
UserHandle.isSameUser
返回true
。 - Julian A.UserHandle.isSameApp
返回false,即使线程是由应用程序创建的。 - Julian A.Thread
还是AsyncTask
,或者其他什么? - Henry