2016-06-01 4 views
1

Intentで複数のURIを提供することをアプリごとにFileProviderの助けを借りて行っています。FileProviderを使用してインテント経由で複数のURIを提供するアクセス許可を付与する方法

次のように一つだけのURIを送信するとき、私はそれは、働いて得た:私はonActivityResultで、このように継続することができ、私の「受信」アプリで

resultIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
resultIntent.setDataAndType(contentUri,getContentResolver().getType(contentUri)); 

setResult(RESULT_OK, resultIntent); 

Uri returnUri = data.getData(); 
ParcelFileDescriptor mInputPFD = getContext().getContentResolver().openFileDescriptor(returnUri, "r"); 

は、今私は、送信しようとしましたURIのArrayListは、

resultIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uriList); 
resultIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
setResult(RESULT_OK, resultIntent); 

ですが、許可された許可フラグonl yはsetData()に設定されたURIに適用されるため、受信アプリではArrayListからURIにアクセスできません。私は解決策としてClipDataについて読んますが、私はunfortunatleyミンSDKと一緒に行くことを余儀なくよ15.

だから私の質問は、それは

ようなもので、私の受信アプリでアクセス権を手動で設定することをお勧めしています
context.grantUriPermission("com.example.provider", returnUri, Intent.FLAG_GRANT_READ_URI_PERMISSION); 

"ArrayList"オプションを選択して後で取り消すと、すべてのURIが取得できますか?私はこれをまったく行うことができますか?他のすべてのアプリがそのようなプロバイダーアプリのプライベートファイルにアクセスすることはできませんでしたか?

ここではどのパッケージを指定する必要がありますか?私のプロバイダのアプリケーションまたは受信者のアプリケーションパッケージ、私はこれを動作させるつもりはないので、唯一の行方不明のアクセス許可の例外を取得します。

すべてのヘルプやヒントが高く評価されて

+0

"他のすべてのアプリケーションが、そのようなプロバイダアプリのプライベートファイルにアクセスすることはできませんか?あなたは 'grantUriPermission()'呼び出しであなたが名前をつけたアプリケーションにのみ許可を与えているからです。 「ここではどのようなパッケージを指定する必要がありますか?」 - 受信機。 「受け取りアプリで手動でアクセス許可を設定することをお勧めします」 - APIレベル21より前には、AFAIKの選択肢がほとんどありません。 – CommonsWare

+0

@CommonsWareの回答に感謝します。 'Permission Denial:エクスポートプロバイダ[...]がエクスポートされない[...]'という次の例外が発生します。しかし、 'android:exported'は' false'でしょうか?プロバイダまたはレシーバで 'grantUriPermission'を呼び出さなければなりませんか? – daco

+0

"しかし、アンドロイド:エクスポートされた私は推測されるfalseにする必要がありますか?" - はい、それは 'FileProvider'の要件です。 「プロバイダまたはレシーバでgrantUriPermissionを呼び出す必要がありますか?」 - IMHO、あなたの 'Activity'で呼び出す前に' startActivity() 'を呼び出して、あなたの' Uri'値を使うサードパーティのアプリを起動してください。あなたと同様のシナリオについては、私が 'EXTRA_OUTPUT'値に' grantUriPermission() 'を使う場合は、[このサンプルプロジェクト](https://github.com/commonsguy/cw-omnibus/tree/master/Camera/FileProvider)を参照してください'ACTION_IMAGE_CAPTURE''' Intent'で指定します。 – CommonsWare

答えて

4

はそれを解決しました。

私の問題は、それがあるべきように私は私のレシーバアプリプロバイダアプリないでgrantUriPermission()と呼ばれることとなりました。したがって、次のようにアクセス許可の例外を修正してください:

getApplicationContext().grantUriPermission(getCallingPackage(), fileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION); 
関連する問題