69

メールを送信するインテントを起動しようとしています。これらはすべて機能しますが、実際にメールを送信しようとすると、いくつかの「奇妙な」ことが起こります。

ここにコードがあります

Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.setType("image/jpeg");
sendIntent.putExtra(Intent.EXTRA_SUBJECT, "Photo");
sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://sdcard/dcim/Camera/filename.jpg"));
sendIntent.putExtra(Intent.EXTRA_TEXT, "Enjoy the photo");
startActivity(Intent.createChooser(sendIntent, "Email:"));

Gmail メニュー コンテキストを使用して起動すると、添付ファイルが表示され、メールの宛先を入力し、本文と件名を編集できます。大きな問題ではない。送信を押すと、送信されます。唯一のことは、添付ファイルが送信されないことです。

そう。私は、メールメニューコンテキストで試してみませんか(私の電話のバックアップメールアカウント用)と考えました。添付ファイルが表示されますが、本文または件名にテキストはまったくありません。送信すると、添付ファイルが正しく送信されます。それは、何かがかなり間違っていると私に信じさせるでしょう。添付ファイル付きの電子メールを送信するインテントを起動するマニフェストで新しいアクセス許可が必要ですか? 私は何を間違っていますか?

4

13 に答える 13

96

また、同じ問題が発生します

コード:

Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); 
    emailIntent.setType("image/jpeg");
    emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] 
    {"me@gmail.com"}); 
    emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, 
    "Test Subject"); 
    emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, 
    "go on read the emails"); 
    Log.v(getClass().getSimpleName(), "sPhotoUri=" + Uri.parse("file:/"+ sPhotoFileName));
    emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:/"+ sPhotoFileName));
    startActivity(Intent.createChooser(emailIntent, "Send mail..."));

adb logcat から:

V/DumbDumpersMain( 3972):   sPhotoUri=file://sdcard/DumbDumpers/DumbDumper.jpg
I/ActivityManager(   56):   Starting activity: Intent { action=android.intent.action.CHOOSER comp={android/com.android.internal.app.ChooserActivity} (has extras) }
I/ActivityManager(   56):   Starting activity: Intent { action=android.intent.action.SEND type=jpeg/image flags=0x3000000 comp={com.google.android.gm/com.google.android.gm.ComposeActivityGmail} (has extras) }
I/ActivityManager(   56):   Starting activity: Intent { action=android.intent.action.SEND type=jpeg/image flags=0x2800000 comp={com.google.android.gm/com.google.android.gm.ComposeActivity} (has extras) }
D/gmail-ls(  120):      MailProvider.query: content://gmail-ls/labels/me@gmail.com(null, null)
D/Gmail   ( 2507):      URI FOUND:file://sdcard/DumbDumpers/DumbDumper.jpg

メール プロバイダーが長さ 0 のファイルを添付しているようです。ファイルシステムを確認すると、ファイルはそこにあり、正しいです。画像ファイルを作成するコードは、電子メールで送信する前に十分に完成しています。

魔法の再起動なしでこれを修正した人はいますか(私はすでに試しました)?

よろしく、
フィン

アップデート

私にとってのパスはこうあるべきだった

file:///sdcard/DumbDumpers/DumbDumper.jpg

/これはルートディレクトリを指しているため、追加が必要です。つまり、次のようになります。

file:// + /sdcard/DumbDumpers/DumbDumper.jpg

として結合

file:///sdcard/DumbDumpers/DumbDumper.jpg

上記のスニペットでは、次のものが必要です。

emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://"+ sPhotoFileName));

これが役立つことを願っています。デバッグするのに何年もかかりました。

よろしく、
フィンレイ

于 2009-08-14T18:57:32.117 に答える
21

私の側からのちょっとした発言。Gmailでも同じ問題が発生していますが、問題のファイルを最初にSDカードに保存し、アセットからではなく、そこから取得すると、どういうわけかうまくいくようです。したがって、私のコードは次のとおりです。

Intent i = new Intent(Intent.ACTION_SEND);
i.putExtra(Intent.EXTRA_SUBJECT, "Title");
i.putExtra(Intent.EXTRA_TEXT, "Content");
i.putExtra(Intent.EXTRA_STREAM, uri);
i.setType("text/plain");
startActivity(Intent.createChooser(i, "Send mail"));

そしてここ、

uri = Uri.fromFile(new File(context.getFilesDir(), FILENAME));

動作しませが、

uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), FILENAME));

します。

よろしく、マイケル

于 2010-07-20T12:54:47.373 に答える
7

「Uri.parse」の代わりに「Uri.fromFile(new File(Environment.getExternalStorageDirectory(),"ファイル名"))」を使用します

Environment.getExternalStorageDirectory() - SDcard またはその他の外部ストレージへのパス

于 2010-07-07T13:09:58.703 に答える
4

これは実際には正しいようで、何が起こっているのかわかりませんが、再起動後に機能し始めました:/

于 2009-02-25T23:10:25.227 に答える
3

RFC 1738セクション 3.10から:

ファイル URL の形式は次のとおりです。

   file://<host>/<path>

ここで、hostはパスにアクセスできるシステムの完全修飾ドメイン名で、 path はdirectory /directory/.../nameの形式の階層ディレクトリ パスです。

つまり、2 番目と 3 番目のスラッシュの間に暗黙の「localhost」があるため、http://host/path/from /root と同じように file:///path/from/root になります。ただし、前述のように、Uri.FromFile() を使用してビルドします。

于 2012-01-17T12:30:44.730 に答える
3

私は同じ問題を抱えていて、どこでも解決策を探しました。最後に、すぐに使えるオープンソース アプリを見つけて、その方法を調べて解決しました。コードはかなり長いので、ここでは引用しませんが、リンクを投稿します。449 行目の sendEmail 関数を見てください。

http://rehearsalassist.svn.sourceforge.net/viewvc/rehearsalassist/android/trunk/src/urbanstew/RehearsalAssistant/SessionPlayback.java?revision=94&view=markup

コードを同様にリファクタリングしたところ、動作するようになりました。これが同じ状況の他の人に役立つことを願っています。

于 2010-11-26T21:54:36.337 に答える
0

同じ症状がありました。私の場合は、最初にアクセス許可を付けて添付ファイルを保存していたためMODE_PRIVATEです。に変更するとすぐに、MODE_WORLD_READABLEGMailはファイルにアクセスして、添付ファイルを適切に送信できたようです。

続きを見る

于 2013-03-02T22:47:09.807 に答える
0

添付ファイル付きのメールを送信: (ドキュメントによる)

インテント emailIntent = new Intent(Intent.ACTION_SEND); emailIntent.setType(HTTP.PLAIN_TEXT_TYPE);

emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"jon@example.com"});

emailIntent.putExtra(Intent.EXTRA_SUBJECT, "メールの件名"); emailIntent.putExtra(Intent.EXTRA_TEXT, "メール本文"); emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment"));

// Uris の ArrayList を渡すことで、複数のアイテムをアタッチすることもできます

于 2016-11-07T06:34:47.710 に答える
0

Intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); も追加してみてください。これは私の問題に役立ちました。

于 2015-01-01T19:39:15.367 に答える
0

私は 4 日後にこれに関する解決策を得ました。

1) 内部ストレージのパスを使用 String path="/storage/sdcard0/myfile.txt";

2) パス="/storage/sdcard1/myfile.txt";

3) マニフェスト ファイルに権限を記載します。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

4) 確認のため、最初にファイルの長さをチェックします。

5) sdcard0 & sdcard1 に関する ES File Explorer のパスがこれと同じかどうかを確認します......

例えば

File file=new File(path); 
long=file.length();//in Bytes
于 2016-09-12T07:11:06.997 に答える
0
public void sendMail(String path) {
        Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
        emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL,
        new String[] {AppConstant.server_mail});
        emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,
        "IBPS ERROR Mail");
        emailIntent.putExtra(android.content.Intent.EXTRA_TEXT,
        "This is an autogenerated mail from IBPS app");
        emailIntent.setType("image/png");
        Uri myUri = Uri.parse("file://" + path);
        emailIntent.putExtra(Intent.EXTRA_STREAM, myUri);
        startActivity(Intent.createChooser(emailIntent, "Send mail..."));
        }
于 2014-12-19T14:03:32.980 に答える
0

それは私にとって完璧に機能します:このソリューションでは、ニコラスはキャッシュフォルダー内にコピーを1つ作成し、ここでgmailインテントがアクセスできます! http://stephendnicholas.com/archives/974

于 2013-06-01T03:39:30.107 に答える