0

クラウド ストレージ サービスに接続するファイル ピッカーを作成しようとしています。他のアプリケーションにファイルを添付するのに問題はありません。Gmail でさえ、Activity の結果を正常に取得し、設定した URI / クリップデータに基づいて適切なサムネイルを表示します。

問題は、実際にメールを送信しようとすると、Gmail がユーザーに「添付ファイルを送信できませんでした」と通知し、添付ファイルなしでメールを送信することです。

何が間違っているのかわかりません。URI を Intent.setData() として設定するだけでなく、URI を使用して Intent.setClipData() を設定しようとしました。さらに、FLAG_GRANT_READ_URI_PERMISSION のフラグを明示的に含めてみました。これらのどれも問題を解決しません。

何がうまくいかないのか知っている人は、声をかけてください。他のクラウド プロバイダーは、このフローでコンテンツを添付する際に問題がないように見えるので、自分が何を間違っているのかわかりません。

現在、私のコードは大まかに次のようになっていますが、Gmail ではまだ動作しません。

Intent result = new Intent();
result.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
result.setData(uri);

if (getActivity().getIntent().getBooleanExtra(Intent.EXTRA_ALLOW_MULTIPLE, false)) {
    String mime = Utils.getMimeType(document);
    result.setClipData(new ClipData(document.getSimpleName(), new String[]{mime}, new ClipData.Item(uri)));
    result.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
    result.putExtra(Intent.EXTRA_STREAM, uri);
}

getActivity().setResult(Activity.RESULT_OK, result);
getActivity().finish();
4

1 に答える 1

0

問題は、file-uri がストレージ ディレクトリ /storage/emulated/0/folder_name にあることでした (new File(Environment.getExternalStorageDirectory(), "folder_name") は機能しませんでした)。Context.getExternalCacheDir() (/sdcard/Android/data/packageName/) に切り替えることで、Gmail は添付ファイルを正常に取得できました。

どうやら Gmail は、アクセス権を与えられたファイルへのアクセスに関して、他のアプリケーションよりも厳しい権限を持っているようです (変更前は問題なく動作していました)。残念なことに、エラー メッセージは表示されませんでしたが、Gmail がこの状況で事後的に失敗したため、機能しなかった理由を簡単に発見することはできませんでした。

于 2014-10-18T05:11:28.743 に答える