2016-06-16 12 views
1

Wir haben die Direct Share-Unterstützung von Android M in unserer App implementiert, erhalten aber SecurityException, wenn wir versuchen, in unserer ChooserTargetService-Implementierung auf den Inhaltsanbieter zuzugreifen. Wir wollen "export = true" nicht für content provider setzen ... .so scheint es, als müssten wir grantUriPermission() aufrufen. Was nicht klar ist, wenn dies der richtige Ansatz ist, ist der Paketname, der an diesen übergeben wird (habe verschiedene erfolglos versucht).Berechtigungen für den ChoosserTargetService und den Inhaltsanbieter

Es folgt Ausnahme erhalten wir:

W Binder : Caught a RuntimeException from the binder stub implementation. 
W Binder : java.lang.SecurityException: Permission Denial: reading <my content provider> uri  <content provider uri> from pid=0, uid=1000 requires the provider be exported, or grantUriPermission() 
W Binder :  at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:605) 
W Binder :  at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:480) 
W Binder :  at android.content.ContentProvider$Transport.query(ContentProvider.java:211) 
W Binder :  at android.content.ContentResolver.query(ContentResolver.java:491) 
W Binder :  at android.content.ContentResolver.query(ContentResolver.java:434) 
W Binder :  at <my package>.MyChooserTargetService.onGetChooserTargets(MyChooserTargetService.java:66) 
W Binder :  at android.service.chooser.ChooserTargetService$IChooserTargetServiceWrapper.getChooserTargets(ChooserTargetService.java:147) 
W Binder :  at android.service.chooser.IChooserTargetService$Stub.onTransact(IChooserTargetService.java:67) 
W Binder :  at android.os.Binder.execTransact(Binder.java:453) 
+0

Können Sie eine [mcve], oder zumindest die Stack-Trace bereitstellen? – CommonsWare

Antwort

0

So Lösung gefunden in folgenden .... insbesondere: „Wenn ein Thema von einer Komponente der Anwendung gestartet wird, der den Anbieter hat, dann können Sie Zugriff auf den ContentProvider ohne eine SecurityException. "

How would a thread created by an app be considered a different app from the app's ContentProvider?

+0

Hallo John, könntest du bitte ein wenig auf diese Antwort eingehen, vielleicht einen Beispielcode? Ich habe grundsätzlich genau das gleiche Problem wie Sie, aber ich kann nicht über den Link, den Sie gepostet haben, zu einer Lösung kommen. Ich verstehe den Grund für die "SecurityException", aber ich weiß nicht, wie ich dem Binder-Prozess die Erlaubnis erteilen darf, auf meinen 'ContentProvider' zuzugreifen. TIA! – aoemerson

+1

@aoemerson Ich habe Thread (t) erstellt, in dem ich den Aufruf von getContentResolver(). Query() gemacht habe und dann lief t.start(); t.join(); –

1

Ich hatte das gleiche Problem (siehe my comment) und habe da eine Lösung für dieses besondere Problem gefunden.

TL; DR

Stellen Sie Ihren Provider exported=true und die folgende Zeile in seinem Manifest Abschnitt hinzufügen:

android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE" 

so sieht es ein bisschen wie:

<provider 
    android:name=".db.MyContentProvider" 
    android:authorities="@string/authority" 
    android:exported="true" 
    android:readPermission="android.permission.BIND_CHOOSER_TARGET_SERVICE"/> 

Längere Version

Sie können Ihre ContentProvider zu exported=true ohne sich Gedanken über andere Apps Zugriff auf Ihre Daten so lange gesetzt, wie Sie auch eine permission (oder readPermission oder writePermission) gesetzt für Ihren Provider 1 haben.

Die Schwierigkeit ist natürlich zu wissen, wie Sie Ihre ChooserTargetService eine Erlaubnis geben, da Sie nicht kontrollieren, welche Berechtigungen es fordert, während es auf dem Binder-Thread des Android-Systems ausgeführt wird.

Es gibt jedoch eine Erlaubnis, die nur die Direkt Share-Auswahl des Android-Systems erreichen kann: android.permission.BIND_CHOOSER_TARGET_SERVICE. Diese permission ist durch Unterschrift gesichert, so dass sie durch nichts anderes als einen Systemprozess erhalten werden kann.

Das einzige, was ich frage mich ist, was hält eine andere App seine eigenen ChooserTargetService implementieren, um die Erlaubnis zu erhalten und Ihre ContentProvider verwenden? Nun, ich habe das überprüft, aber es scheint, dass das System es nicht über eine SecurityException erlaubt ... was gut ist, aber immer noch rätselhaft für mich!

Verwandte Themen