取消同步时权限拒绝

时间:2011-11-01 14:26:45

标签: android sync android-contentprovider

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

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

但是当我的app尝试通过内容提供程序查询读取一些内部设置时,它会收到“java.lang.SecurityException:Permission Denial”。虽然相同的查询在正常执行应用程序或同步期间运行良好。

下面是堆栈跟踪。

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)

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

1 个答案:

答案 0 :(得分:2)

从您的堆栈跟踪看起来您已在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);
}

BR, 延