2016-06-16 6 views
1

私たちは、アプリケーションでAndroid MのDirect Shareサポートを実装しましたが、ChooserTargetService実装でコンテンツプロバイダにアクセスしようとするとSecurityExceptionを取得しました。コンテンツプロバイダに "exported = true"を設定したくないのですが、grantUriPermission()を呼び出す必要があるようです。明らかなことはありませんが、これが正しいアプローチであれば、どのパッケージ名がこれに渡されるのでしょうか(さまざまなパッケージ名がうまくいきませんでした)。ChooserTargetServiceとコンテンツプロバイダのアクセス許可

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

[mcve]、または少なくともスタックトレースを提供できますか? – CommonsWare

答えて

0

だから、特に....以下で解決策を見つけた:「スレッドは、プロバイダを持っているアプリケーションのいずれかのコンポーネントによって開始された場合は、次のことができ

以下は、私たちが得る例外でSecurityExceptionなしでContentProviderにアクセスしてください。

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

+0

こんにちはJohnさん、この回答を少し拡大していただけますか、多分サンプルコードですか?私は基本的に**あなたと同じ問題を**正確に**持っていますが、あなたが投稿したリンクからは解決策には出られません。私は 'SecurityException'の背後にある理由を理解していますが、バインダープロセスに' ContentProvider'アクセスを許可する方法がわかりません。 TIA! – aoemerson

+1

@aoemerson私はgetContentResolver()。query()を呼び出し、次に実行したThread(t)を作成しました t.start(); t.join(); –

1

私は同じ問題を抱えていた(my commentを参照)、それ以来、この特定の問題への解決策を発見しました。

TL; DR

exported=trueにプロバイダを設定し、そのマニフェストセクションに次の行を追加します。

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

android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE" 

ので、それは少しのように見えますより長いバージョン

あなたはあまりにも長い間、あなたもあなたのプロバイダ1に設定しpermission(またはreadPermissionまたはwritePermission)を持っているとして、あなたのデータにアクセスして他のアプリを心配することなく、あなたのContentProviderexported=trueに設定することができます。

もちろん、あなたがにアクセス許可を与える方法を知ることは難しいです。なぜなら、アンドロイドシステムのバインダースレッド上で実行されているアクセス許可を制御しないからです。

ただし、アンドロイドシステムのダイレクトシェアを選択できるのは、android.permission.BIND_CHOOSER_TARGET_SERVICEのみです。このpermissionは署名で保護されているため、システムプロセス以外では取得できません。

唯一のことは、自分のChooserTargetServiceを実装している別のアプリケーションを停止し、許可を得て、ContentProviderを使用していますか?まあ、私はそれを確認したが、それはシステムがSecurityExceptionを介して許可していないようだ...良いですが、まだ私に困惑!

関連する問題