2011-11-01 6 views
1

SyncAdapter를 구현하여 응용 프로그램에서 항목 동기화를 수행했습니다. 이 어댑터는 프로그래밍 방식 또는 자동으로 동기화가 요청되면 Android에서 올바르게 호출됩니다.동기화가 취소 될 때 사용 권한이 거부됩니다.

계정 및 동기화 설정> {myappccount}> 데이터 및 동기화> {app item} 아래의 확인란 선택을 취소하여 동기화 작업을 수동으로 취소하려고하면 동기화 어댑터 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

ContentProviderreadPermission이라고 표시된 스택 추적에서으로 보입니다. 앱에서 onSyncCanceled(..)이 호출되면 동기화 관리자 (일반적으로)는 RPC 호출이며 동기화 관리자는 readPermission을 보유하지 않습니다.

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

브롬, 옌스

+0

내 내부 콘텐츠 공급자에 권한을 설정하고 있지 않다 있지만, 그러나 :

관련된 호출자의 PID/UID없이 코드를 취소하여 실행 #onCancelSync(..)에서 다음을 시도하십시오 이 코드에 내 취소 코드를 포함하면 사용 권한 오류가 사라졌습니다. 감사합니다 – Tushar

+0

아, 그렇게 아마 안드로이드 : 내 보낸 = "사실"? 그럴 수도 있습니다. – Jens

관련 문제