我已经实现了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);
}
,
詹斯