我已经实现了SyncAdapter在应用程序中执行项目的同步。当以编程方式或自动方式请求同步时,Android会正确调用此适配器。

当我尝试通过取消选中“帐户和同步设置”>“ {myappccount}”>“数据和同步”>“ {app item}”下的复选框来手动取消同步操作时,也会正确调用我的同步适配器onSyncCanceled。

但是,当我我的应用尝试通过内容提供者查询读取一些内部设置时,它会收到“ java.lang.SecurityException:权限拒绝”。尽管在应用程序正常执行或同步期间,相同的查询效果很好。

下面是堆栈跟踪。

java.lang.SecurityException: Permission Denial: reading com.my.applications.sync.content.MySettingProvider uri content://com.my.applications.sync.provider.mysetting/currentstateid from pid=0, uid=1000 requires null
at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:307)
at android.content.ContentProvider$Transport.query(ContentProvider.java:186)
at android.content.ContentResolver.query(ContentResolver.java:262)
at com.my.applications.sync.service.MysyncService.getCurrentServiceUri(MysyncService.java:442)
at com.my.applications.sync.service.MysyncService.cancelSync(MysyncService.java:1723)
at com.my.applications.sync.syncadapter.OtherSyncAdapter.onSyncCanceled(OtherSyncAdapter.java:51)
at android.content.AbstractThreadedSyncAdapter$ISyncAdapterImpl.cancelSync(AbstractThreadedSyncAdapter.java:121)
at android.content.ISyncAdapter$Stub.onTransact(ISyncAdapter.java:78)
at android.os.Binder.execTransact(Binder.java:320)
at dalvik.system.NativeStart.run(Native Method)


我需要为内部内容提供商添加任何权限吗?

最佳答案

从堆栈跟踪中可以看出,您已在readPermission上声明了ContentProvider。在您的应用上调用onSyncCanceled(..)时,这是来自同步管理器的RPC调用(通常)-同步管理器不太可能保留readPermission

尝试在#onCancelSync(..)中执行以下操作,以在不涉及调用者pid / uid的情况下运行取消代码:

long caller = android.os.Binder.clearCallingIdentity();
try {
// Do your stuff here
} finally {
   android.os.Binder.restoreCallingIdentity(caller);
}



詹斯

10-05 17:50
查看更多