2012-03-14 23 views
6

さまざまなAndroidアプリケーションでは、次のコードを使用して電子メールのアプリケーションチューザを表示し、ユーザーがアプリケーションの1つを決定した後、プリセットテキストの改行を無視する電子メールの意図

for-loopでは、オブジェクトの文字列出力が一時的な文字列 "contentStr"と連結されます。オブジェクトごとに、改行( "\ n")が必要です。

私の電話でこのコードをテストすると、うまく動作し、すべての単一のオブジェクトに独自の行があります。

しかし、ユーザーは電子メールアプリケーション(Android標準も同様)がすべてを1行に置き、改行を無視すると報告しています。

何か間違っていますか?または、このバグレポートを開発者が解決できる問題ではなく無視することはできますか?

+2

'plain/text'の代わりに' text/plain'を試してみることができます。さらに、すべての連結を行うのではなく、 'StringBuilder'を使用しなければなりません。私はいずれかあなたの問題に役立つだろう、しかし懐疑的です。 – CommonsWare

+0

ありがとうございます!しかし、「テキスト/プレーン」の欠点を見るために私のコメントを見てください。 – caw

+1

Marco W.が指摘しているように、「message/rfc822」は電子メールの正しいMIMEタイプです – njzk2

答えて

3

2可能性がつながる:

  • \ rのか、\ nを\ rのトライの代わりに、単純に、\ nは、あるいは2改行を。
  • 使用HTML形式の改行(<br>

これは意図には何も入れていません。また、ここではあなたのコードで何か間違っ

String contentStr = ""; 
for (Object o : mArrayList) { // mArrayList: ArrayList<Object> 
    content = contentStr+o.toString()+"\n"; 
} 
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, backupStr); 

があり、contentStrは空であり、かつコンテンツ最後のオブジェクトのみが含まれます。

これは、より良い、より短く、より効率的な方法である:あなたも、あなたがEXTRA_TEXTを置く<br/>\nを置き換える必要

contentStr = TextUtils.join("\n", mArrayList); 
+3

'TextUtils.join()'の代わりにありがとうございます。これはLinux(と他のもの)と '\ n ' WikipediaはJavaの改行に 'System.getProperty(" line.separator ")'を使うことを提案しています。これは良い解決策ですか? – caw

+0

私はそうだと思います。しかし、アンドロイドはLinuxベースであるため、常に '\ n'でなければなりません。問題を再現できましたか? – njzk2

0

使用:

emailIntent.setType("text/plain"); 

ACTION_SEND

final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); 
emailIntent.setType("text/plain"); 
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] { "[email protected]" }); 
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Sample subject"); 
String contentStr = ""; 
for (Object o : mArrayList) { // mArrayList: ArrayList<Object> 
    content = contentStr+o.toString()+"\n"; 
} 
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, backupStr); 
startActivity(Intent.createChooser(emailIntent, "Choose application")); 
+0

ありがとう! 「text/plain」を使用すると、アプリケーションチューザーにはテキストメッセージ(SMS、Facebookなど)を処理できるすべてのアプリケーションが表示されます。しかし、私が古い "プレーン/テキスト"を使用すると、電子メールアプリケーションだけが表示されます。なぜこれはそうですか?私は電子メールアプリケーションだけを必要とします。 – caw

+1

@MarcoW: 'plain/text'は電子メールアプリケーションを提供するだけではありません。無効なMIMEタイプを処理するユーザーがインストールしたものをすべて提供します。メールに制限する場合は、 'ACTION_SENDTO'と' mailto: '' Uri'を使います。 – CommonsWare

+1

ありがとう! "ACTION_SENDTO"は私のためには機能しません。しかし、私はMIMEタイプとして "メッセージ/ rfc822"を使用することがわかりました。これは電子メールを送信するのに適していますか? – caw

0

私はそこにSMS /ツイッター/ Facebookアプリを取得しないようにしてくださいするには、以下のようなものを使用します。

Intent emailIntent = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:[email protected]")); 
       emailIntent.setType("text/plain"); 
       emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"[email protected]"}); 
       emailIntent.putExtra(Intent.EXTRA_TEXT, msg); 
       emailIntent.putExtra(Intent.EXTRA_SUBJECT, "This is my Error Report"); 

そして、ここでString msgStringBuilderを使用して作成され、\ n休憩。 基本的には、あなたのMIMEタイプを変更するだけで、あなたは設定されると思います。

+0

ありがとうございます! StringBuilderは良いヒントです。 Jorgesysの答えに対する私のコメントを見てください。あなたの追加のUri.parse()もうまくいきません:( – caw

0

。私のコードがあります:

final Intent intent = new Intent(Intent.ACTION_SEND_MULTIPLE); 
intent.setType("message/rfc822"); 
intent.putExtra(Intent.EXTRA_EMAIL, "[email protected]"); 
intent.putExtra(Intent.EXTRA_SUBJECT, "subject"); 
intent.putExtra(Intent.EXTRA_TEXT, "This\nis\na\ntest!".replace("\n", "<br/>");); 
関連する問題