Отказ в разрешении при отмене синхронизации - PullRequest
1 голос
/ 01 ноября 2011

Я реализовал SyncAdapter для выполнения синхронизации элементов в приложении. Этот адаптер корректно вызывается Android, когда синхронизация запрашивается программно или автоматически.

Когда я пытаюсь отменить операцию синхронизации вручную, сняв флажок в разделе «Учетные записи и настройки синхронизации»> {myappccount}> Данные и синхронизация> {app app}, мои адаптеры синхронизации 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)

Нужно ли добавлять какие-либо разрешения для моего внутреннего провайдера контента?

1 Ответ

2 голосов
/ 01 ноября 2011

Это выглядит из вашей трассировки стека, которую вы объявили 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, Jens

...