web-dev-qa-db-ja.com

SDカードのファイルをメールに添付しようとしています

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

ここにコードがあります

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

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

69
Chrispix

また、同じ問題を取得

コード:

Intent emailIntent = new Intent(Android.content.Intent.ACTION_SEND); 
    emailIntent.setType("image/jpeg");
    emailIntent.putExtra(Android.content.Intent.EXTRA_EMAIL, new String[] 
    {"[email protected]"}); 
    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/[email protected](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));

これがお役に立てば幸いです。デバッグには何年もかかりました。

よろしく、
フィンレイ

96
Finlay

私の側からのちょっとした発言。 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));

notは動作しますが、

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

します。

よろしく、マイケル

21
Michael F

「Uri.parse」の代わりに「Uri.fromFile(new File(Environment.getExternalStorageDirectory()、 "file name"))」を使用します

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

7
Snigdha

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

4
Chrispix
    Intent i = new Intent(Intent.ACTION_SEND);
    i.setType("message/rfc822");
    i.putExtra(Intent.EXTRA_EMAIL  , new String[]{"[email protected]"});
    i.putExtra(Intent.EXTRA_SUBJECT, "Data from app");
    i.putExtra(Intent.EXTRA_TEXT   , "experience number x");
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

    Uri uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "filename.txt"));
    i.putExtra(Intent.EXTRA_STREAM, uri);
    startActivity(Intent.createChooser(i, "Send email..."));
4
Eduardo Matos

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()を使用してビルドします。

3
android.weasel

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

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

コードをリファクタリングして類似するようにしましたが、現在は機能します。これが同じ状況の他の人の助けになることを願っています。

3
Railsdev

4日後にこれに関する解決策があります。Android(Java)のFileクラスへのパスを与える際には、次の点に注意してください:

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

2)path = "/ 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
0
Mahadev Mane

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

もっと見る

0
CasualCoder
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..."));
        }
0
Jotiram Chavan

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

Intent emailIntent = new Intent(Intent.ACTION_SEND); emailIntent.setType(HTTP.PLAIN_TEXT_TYPE);

emailIntent.putExtra(Intent.EXTRA_EMAIL、new String [] {"[email protected]"});

emailIntent.putExtra(Intent.EXTRA_SUBJECT、 "メールの件名"); emailIntent.putExtra(Intent.EXTRA_TEXT、 "電子メールメッセージテキスト"); emailIntent.putExtra(Intent.EXTRA_STREAM、Uri.parse( "content:// path/to/email/attachment"));

// UrisのArrayListを渡すことで複数のアイテムを添付することもできます

0
shaiban

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

0
lucasddaniel

また、Intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)を追加してみてください。これは私の問題を助けました。

0
James Jones