1

ContentProviderアプリの内部使用のみを目的として、ストリームを使用して URI に応答するように をセットアップしました。これにより、zip ファイルを作成して提供します。

は、送信するために( ) に追加の ( )Uriとして渡されます。ただし、そうすると、次の例外で断続的に失敗します。Intent.EXTRA_STREAMIntentIntent.ACTION_SEND

E/DatabaseUtils(26058): java.lang.SecurityException: Permission Denial: reading MyContentProvider uri content://spinner.myapp.db/file/stream/zip/1 from pid=26141, uid=10038 requires the provider be exported, or grantUriPermission()

を通じてアクセス許可を付与しようとしましたが、うまくいきませintent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);んでした。にアクセスしているのは自分のアプリだけなので、なぜアクセス許可を付与する必要があるのか​​ もわかりませんContentProvider

アップデート:

も使用してみましたがsetClipData()、成功しませんでした。Gmail は明らかに Uri を無視し、Dropbox がクラッシュします。

String[] mimeTypes = { "application/x-compressed" };
ClipData clip = new ClipData("zip data", mimeTypes, new ClipData.Item(uri));
intent.setClipData(clip);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
4

1 に答える 1

0

ああ、なるほど、送信アプリは、呼び出しアプリのインテントによって暗黙的に提供されるのではなく、Uri ごとに付与された独自のアクセス許可を持っている必要がありますか?

私はあなたの用語に混乱しているので、このアプローチを試してみましょう:

を実装するには、次の 4 つの基本的な方法がありますContentProvider

  1. エクスポートして、権限によって保護されないようにします。これはばかげています。こんなことしないで。

  2. エクスポートされますが、アクセス許可 (android:readPermissionおよびandroid:writePermission属性など) によって保護されます。これはうまく機能しますが、ContentProvider. サポート活動のほとんどの実装者のように、アプリについてアプリオリな知識を持たないアプリでは機能しません。ContentProviderACTION_SEND

  3. エクスポートするのではなくUri、特定のリクエストに対してアクセス許可を付与する必要があります。通常、これは、使用される に追加されたなどのアクティビティ フラグFLAG_GRANT_READ_URI_PERMISSIONを介して行われますが、自分自身を呼び出すなどの他の方法もあります。これは、.IntentstartActivity()grantUriPermission()ACTION_SEND Intent

  4. エクスポートせず、 に対するアクセス許可を付与しないでUriください。この場合、は自分のアプリ内でのみ利用可能であり、たとえあなたが要求したとしても (たとえば、あなたの要求) ContentProvider、第三者がアクセスすることはまったくできません。ACTION_SEND

送信を実行するために最終的に選択されたアプリにアクセス許可を付与するにはどうすればよいですか? または、考えられるすべてのアプリにアクセス許可を付与する必要がありますか?

これは、私の 1 つのコメントに誤りがあり、お詫び申し上げます。

FLAG_GRANT_READ_URI_PERMISSION最近では、それがその「データ」であるか、余分なものであるかにかかわらず、Uriあなたのへの読み取りアクセスを許可します。これは、のエンド コンシューマーに付与されます。つまり、チューザーは何らかの理由でパーミッションを消費せず、選択されたアクティビティにはパーミッションがありません。しかし、以前は「データ」に対してのみ機能し、エクストラの値に対しては機能していませんでした。頭のてっぺんから、その欠陥がいつ修正されたかを正確に忘れています。IntentUriIntentIntentFLAG_GRANT_READ_URI_PERMISSIONUri

grantUriPermission()つまり、独自の「チューザー」をロールバックする必要があるため、ユーザーが提案された要求Intentを処理したい実際のアプリを見つけることができます。ACTION_SEND

FWIW、これは、によって提供される PDF を表示するための の使用を示すサンプル アプリですFLAG_GRANT_READ_URI_PERMISSIONFileProvider

于 2014-09-26T18:06:14.363 に答える