2011-11-01 38 views
1

我已經實現了SyncAdapter以在應用程序中執行項目的同步。當以編程方式或自動請求同步時,Android適配器會正確調用此適配器。權限在取消同步時被拒絕

當我嘗試通過取消選中帳戶和同步設置> {myappccount}>數據和同步> {應用程序項目}下的複選框來手動取消同步操作時,我的同步適配器onSyncCanceled也會被正確調用。

但是當我的應用程序嘗試通過內容提供者查詢讀取一些內部設置時,它會收到「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) 

是否需要爲我的內部提供商添加任何權限?

回答

2

看起來從你的堆棧跟蹤,你已經在ContentProvider宣佈readPermission。當您的應用程序調用onSyncCanceled(..)時,它是來自同步管理器的RPC調用(通常是) - 同步管理器不太可能持有readPermission

請嘗試以下的#onCancelSync(..)運行沒有呼叫者PID/UID涉及您的取消代碼:

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

BR, 延

+0

雖然我不會在我的內部內容提供商設置的權限,但在此代碼中包含我的取消代碼使權限錯誤消失。 謝謝 – Tushar

+0

啊,所以它可能不是android:exported =「true」呢?這也可能導致它。 – Jens