web-dev-qa-db-ja.com

Android GMAILにファイルを添付-空のファイルを添付できません

常に同じファイルをGMAILに添付するプログラムがありました([作成]> [ファイルを添付]> [開く]> [マイプログラム])。常に同じファイルが選択されます。

それがしていたことは:

String path = Environment.getExternalStorageDirectory() + "/file.3gp";
File f = new File(path);
Uri data = Uri.fromFile(f);
Intent i = new Intent();
i.setData(data);
setResult(Activity.RESULT_OK, i);
finish();

これはAndroid 6.0まで正常に機能していました。現在、使用しようとすると次のエラーが表示されます。

空のファイルを添付できません

Astro File Sharingでも同じエラーが発生します(古いビルドの可能性があります)。

ただし、ES File Explorerをインストールし、同じルーチンを実行してファイルを選択すると、次のようなダイアログが表示されます。

ファイルをピックアップ

  • 通常Android Way(MMS、Gmail、...の場合)
  • File Way(上記が失敗した場合はこれを試してください)

「File Way」は、私のプログラムと同様に失敗します。 「通常Android Way」は正常に機能します。

誰がそれが何をするのか考えているので、複製できますか?

前もって感謝します!

OBS:すでに何度もputExtra(STREAM、path)を試しましたが、成功しませんでした。

20
GuiFGDeo

さて、多くの調査といくつかのインテントの傍受の後、すぐに動作するようになりました。

File:///をcontent://に変更する必要がありました。

Androidからの次の情報に従ってこれを行いました。 https://developer.Android.com/reference/Android/support/v4/content/FileProvider.html

唯一の大きな変更は、/ sdcard/file.extへのハードコードされたパスを使用したことです。また、行

getUriForFile(getContext(), "com.mydomain.fileprovider", newFile);

に変更されました

Uri contentUri = FileProvider.getUriForFile(this, "com.mydomain.fileprovider", newFile);

以下も含める必要がありました。

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
i.setData(contentUri);

FileからContentに変更しなければならなかった理由はよくわかりませんが、この後、ファイルは再び添付されます!この問題に直面した場合はリンクを参照してください。作成する必要がある新しい.xmlを忘れないでください。

18
GuiFGDeo

次の質問を参照してください。

Android-6-cannot-share-files-anymore

この動作はAndroid 6.0およびGmailで発生します。次のスレッドを参照してください。

問題3141-Android-developer-preview

[設定]-> [アプリ]-> [Gmail]-> [許可]に移動し、「ストレージ」許可を手動で有効にすると、共有が機能します。

このシナリオでは、Gmailが「ストレージ」権限を要求する必要があります。これは、過去のすべてのバージョンのAndroidと同じように機能します。

他のメールアプリは添付ファイルを正しく処理する必要があります。

15
mkabatek

修正方法は次のとおりです。

[設定]-> [アプリ]-> [Gmail]-> [許可]に移動します。[ストレージ]の許可をオンにします。これにより、問題は解決しました。

2
Dan Brooker

明確な答えが見つかりませんでした(SDカードを使用せずにGmailに添付ファイルを送信)。葉巻ではなく別のファイル名にコピーしようとしました。動作させる方法は、ダウンロードフォルダーにコピーしてそこから移動することでした。

これでダウンロードのパスを取得しますEnvironment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)

downlaodsフォルダーへのフルパスを取得し、そこにattachemntをコピーします。 20M以上のファイルは移動しません

0
becker