Ho un'app che, quando viene notificata da un ContentObserver
di una modifica a ContentProvider
, tenta di interrogare il provider su un thread in background. Questo provoca un SecurityException
per essere gettato:In che modo un thread creato da un'app può essere considerato un'app diversa da ContentProvider dell'app?
8-10 15:54:29.577 3057-3200/com.xxxx.mobile.android.xxx W/Binder﹕ Caught a RuntimeException from the binder stub implementation. java.lang.SecurityException: Permission Denial: reading com.xxx.mobile.android.mdk.model.customer.ContentProvider uri content://com.xxx.mobile.android.consumer.xxx/vehicle from pid=0, uid=1000 requires the provider be exported, or grantUriPermission() at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:539) at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:452) at android.content.ContentProvider$Transport.query(ContentProvider.java:205) at android.content.ContentResolver.query(ContentResolver.java:478) at android.content.ContentResolver.query(ContentResolver.java:422)
Come sarebbe un filo creato da un app finire con un UID diverso da ContentProvider della app?
Effettuando un punto di interruzione un'eccezione in android.content.ContentProvider
vedo che UserHandle.isSameApp(uid, mMyUid)
è false
e UserHandle.isSameUser(uid, mMyUid)
è true
. Vedo anche che il provider UID è 10087.
Stai chiedendo di uid = 1000: è l'id utente del sistema Android. È probabile che la richiesta venga inoltrata internamente al sistema per l'elaborazione. – adelphus
@adelphus Sì. Ho pensato che fosse la causa dell'eccezione di sicurezza, ma ora non sono sicuro perché 'UserHandle.isSameUser' restituisce' true'. –
Gli utenti Android non sono correlati ai valori di app uid. Non confonderli! I valori di app uid vengono utilizzati per applicare il sandboxing tra le app, la sicurezza degli utenti è implementata in modo diverso. – adelphus