web-dev-qa-db-ja.com

Android Intent.ACTION_SENDを使用してメールを送信する

Intent.ACTION_SENDを使用してメールを送信しています。ただし、intentを呼び出すと、メッセージの送信、電子メールの送信、およびBluetooth経由の送信の選択肢が表示されます。メールを送信する選択肢のみを表示するようにします。これどうやってするの?

27
Ganapathy C
Intent email = new Intent(Android.content.Intent.ACTION_SEND);  
                    email.setType("application/octet-stream");    

編集:
タイプを"message/rfc822" 同様に。

これを試して....

23
N-JOY

私はこの答えを信用していませんが、この投稿に最も良い答えを与えると信じています。

Text/plainまたはtext/htmlを使用するのはよくある誤解です。これにより、Googleドライブ、Dropbox、Evernote、Skypeなど、コンテキストなしでプレーンテキストまたはHTMLテキストファイルを処理できるアプリケーションがトリガーされます。

代わりにACTION_SENDTOを使用して、mailto: Uriを提供します

intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"));

その後、他の回答で提案されているように、セレクタを使用して続行できます。

ここで@PaulLammertsmaが回答 Android email chooser

21
toobsco42

@Ganapathy:表示Gmailのためにこのコードを試してください

Intent gmail = new Intent(Intent.ACTION_VIEW);
                gmail.setClassName("com.google.Android.gm","com.google.Android.gm.ComposeActivityGmail");
                gmail.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" });
                gmail.setData(Uri.parse("[email protected]"));
                gmail.putExtra(Intent.EXTRA_SUBJECT, "enter something");
                gmail.setType("plain/text");
                gmail.putExtra(Intent.EXTRA_TEXT, "hi Android jack!");
                startActivity(gmail);
19
Jack Dsilva

[APIレベルの解決策> = 15]

私は最終的に電子メールの送信に成功しました電子メールクライアントのみへの添付ファイル付き。それは私に多くの時間がかかり、他の人に役立つかもしれないので、ここに書いています。

問題は:

  • Intent.ACTION_SENDTOはデータURIを取ります(「mailto:」スキーマを指定できます)が、Intent:EXTRA_STREAMは受け入れません。

  • Intent.ACTION_SENDはIntent:EXTRA_STREAMを受け入れます(添付ファイルを追加できます)が、Typeのみを取ります(データURIではないため、「mailto:」スキーマを指定できません)。

そのため、Intent.ACTION_SENDを使用すると、ユーザーはsetType( "message/rfc822")であっても複数のアクティビティから選択できます。これは、App/Activitiesがすべてのファイルタイプ(通常はGDrive/Dropboxアプリ)を管理し、メッセージファイルをメールで管理できるためです。

ソリューションはsetSelectorメソッドにあります。このメソッドでは、Intent.ACTION_SENDTOを使用してアクティビティを選択し、その後Intent.ACTION_SENDインテントを送信できます。

ここで私のソリューションコード(添付ファイルはFileProviderから取得されましたが、任意のファイルを使用できます):

{
    Intent emailSelectorIntent = new Intent(Intent.ACTION_SENDTO);
    emailSelectorIntent.setData(Uri.parse("mailto:"));

    final Intent emailIntent = new Intent(Intent.ACTION_SEND);
    emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"});
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
    emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    emailIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
    emailIntent.setSelector( emailSelectorIntent );

    Uri attachment = FileProvider.getUriForFile(this, "my_fileprovider", myFile);
    emailIntent.putExtra(Intent.EXTRA_STREAM, attachment);

    if( emailIntent.resolveActivity(getPackageManager()) != null )
        startActivity(emailIntent);
}
17
ARLabs

これはあなたを助けます。

On your button click : 

Intent email = new Intent(Intent.ACTION_SEND);
email.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"});          
email.putExtra(Intent.EXTRA_SUBJECT, "subject");
email.putExtra(Intent.EXTRA_TEXT, "message");
email.setType("message/rfc822");
startActivity(Intent.createChooser(email, "Choose an Email client :"));
14

ここで指摘されているmessage/rfc822タイプを使用すると、 ACTION_SEND強制的に電子メールで送信 が問題を解決します。

7
Gawcio

アプリでも同様の問題が発生しました。最近、このリンクが公式のAndroid本当に役立つ開発者向けサイトです! Common Intents:Email

TL; DR:

Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:"));

これで、メールクライアントのみが表示されます!

これを行うことにより、件名と本文を追加できます。

intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
intent.putExtra(Intent.EXTRA_TEXT, "Body" );
6
Avi Parshan

これはかなり古い質問ですが、「メールの送信」ソリューションを検索するときの最初の結果であり、すべての回答に共通の問題があることに気付きました。

_Intent.ACTION_SEND_およびintent.setType("message/rfc822")を使用すると、メールアプリだけでなく、処理可能なすべてのアプリanyが表示されますmessage/rfc822によるMIMEタイプのサポート、例えば_.mhtml_、_.mht_、_.mime_。メールアプリのほかに、これはGoogleドライブ、Dropbox、Evernoteなどです。

セレクタをメールアプリのみに制限することがわかった唯一の解決策は、代わりにIntent.ACTION_SENDTOを使用することです。

_Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto","[email protected]", null));
intent.putExtra(Intent.EXTRA_SUBJECT, "My Mail");
intent.putExtra(Intent.EXTRA_TEXT   , "My Message");

try {
    startActivity(Intent.createChooser(i, "Send mail..."));
} catch (Android.content.ActivityNotFoundException ex) {
    Toast.makeText(MainActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
}
_
3
Andrei Herford

最初の解決策:Intentパラメーターをより具体的にするようにしてください。インスタンスのメッセージ受信者を追加する

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

2番目の解決策: パッケージマネージャー を使用して、メッセージを送信できるすべてのアプリケーションを検索し、使用するアプリケーションのみを選択します。

2
Jcs

これは、Jack DsilvaとJignesh Mayaniのソリューションの組み合わせです。

    try
    {
        Intent gmailIntent = new Intent(Intent.ACTION_SEND);
        gmailIntent.setType("text/html");

        final PackageManager pm = _activity.getPackageManager();
        final List<ResolveInfo> matches = pm.queryIntentActivities(gmailIntent, 0);
        String gmailActivityClass = null;

        for (final ResolveInfo info : matches)
        {
            if (info.activityInfo.packageName.equals("com.google.Android.gm"))
            {
                gmailActivityClass = info.activityInfo.name;

                if (gmailActivityClass != null && !gmailActivityClass.isEmpty())
                {
                    break;
                }
            }
        }

        gmailIntent.setClassName("com.google.Android.gm", gmailActivityClass);
        gmailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" });
        gmailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
        gmailIntent.putExtra(Intent.EXTRA_CC, "[email protected]"); // if necessary
        gmailIntent.putExtra(Intent.EXTRA_TEXT, "Email message");
        gmailIntent.setData(Uri.parse("[email protected]"));
        this._activity.startActivity(gmailIntent);
    }

    catch (Exception e)
    {
        Intent i = new Intent(Intent.ACTION_SEND);
        i.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" });
        i.putExtra(Intent.EXTRA_SUBJECT, "Subject");
        i.putExtra(Intent.EXTRA_CC, "[email protected]"); // if necessary
        i.putExtra(Intent.EXTRA_TEXT, "Email message");
        i.setType("plain/text");
        this._activity.startActivity(i);
    }

そのため、最初はGmailアプリを開こうとしますが、ユーザーが持っていない場合は2番目のアプローチが実装されます。

0
Ayaz Alifov

電子メールのみを送信するように制限する最適なコード。電子メールのみを送信するようにこのタイプを設定します。 i.setType("message/rfc822");

        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, "subject of email");
        i.putExtra(Intent.EXTRA_TEXT   , "body of email");
        try {
            startActivity(Intent.createChooser(i, "Send mail..."));
        } catch (Android.content.ActivityNotFoundException ex) {
            Toast.makeText(Firstclass.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
        }
0
Xar E Ahmer

これは私の一日を救った。作成されたテキストメッセージをGmailアプリに直接送信します。

Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
                        "mailto","togmail.com", null));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Report message");
emailIntent.putExtra(Intent.EXTRA_TEXT, edt_msg.getText().toString());
startActivity(Intent.createChooser(emailIntent, "Send email..."));
0
Kristene