26

私のアプリは、ユーザーがアプリから直接バグレポートやフィードバックなどを送信できる電子メールを統合しています。インテントのSetTypeとしてapplication/octet-streamを使用しています。電子メールを送信すると、コンテンツチューザーが表示され、Evernote、Facebook、電子メールなどのさまざまなアイテムが表示されます。

コンテンツチューザーのタイプに適合する他のすべてのアイテムとユーザーを混同しないように、このチューザーに電子メールのみを表示させるにはどうすればよいですか?

ありがとうございました。

4

10 に答える 10

39

この問題を解決するには、公式ドキュメントに従ってください。最も重要な考慮事項は次のとおりです。

  1. フラグはACTION_SENDTOであり、ではありませんACTION_SEND

  2. インテントのメソッドのsetData、

    intent.setData(Uri.parse( "mailto:")); //メールアプリのみがこれを処理する必要があります

空を送信するExtraif()、最後のが機能せず、アプリはメールクライアントを起動しません。

これは私のために働きます。Androidのドキュメントによると。インテントが電子メールアプリ(他のテキストメッセージングやソーシャルアプリではなく)によってのみ処理されるようにする場合は、ACTION_SENDTOアクションを使用し、「mailto:」データスキームを含めます。例えば:

public void composeEmail(String[] addresses, String subject) {
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setData(Uri.parse("mailto:")); // only email apps should handle this
    intent.putExtra(Intent.EXTRA_EMAIL, addresses);
    intent.putExtra(Intent.EXTRA_SUBJECT, subject);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

https://developer.android.com/guide/components/intents-common.html#Email

于 2015-07-21T18:57:08.067 に答える
14

ACTION_SEND Intent実際に何を使用しているのかをわざわざ述べなかったので、アクションを使用していると思いますが、@Aleadamのコメントに同意しました。

インテントのSetTypeとしてapplication/octet-streamを使用しています。

その文には、物事を電子メールに限定するものはありません。

ACTION_SENDは、必要なIntentすべてのアプリケーションでサポートできる一般的なアクションです。共有しているデータとそのデータのMIMEタイプを指定するだけです。そこから、使用可能なアクティビティから選択するのはユーザー次第です。

message/rfc822@Jasoonが示すように、MIMEタイプとして試すことができます。ただし、これは「電子メールクライアントのみを提供する」という意味ではなく、「message/rfc822データをサポートするものをすべて提供する」という意味です。これには、電子メールクライアントではないアプリケーションが含まれる可能性があります。

特にメールで何かを送信したい場合は、JavaMailをアプリに統合するか、Webサーバーでメール転送スクリプトを記述してそれを呼び出します。を使用する場合ACTION_SENDは、ユーザーが重要なのはそれであり、ユーザーが選択した方法でそのようなデータを送信できるようにすることを暗黙的に示しています。

于 2011-06-06T19:48:33.843 に答える
11

インストールされているすべてのメールアプリのチューザーインテントであるMagicLink機能を実装しているときに、この問題に苦労しました。

セレクターインテントのスクリーンショット

private void openEmailApp() {
  List<Intent> emailAppLauncherIntents = new ArrayList<>();

  //Intent that only email apps can handle:
  Intent emailAppIntent = new Intent(Intent.ACTION_SENDTO);
  emailAppIntent.setData(Uri.parse("mailto:"));
  emailAppIntent.putExtra(Intent.EXTRA_EMAIL, "");
  emailAppIntent.putExtra(Intent.EXTRA_SUBJECT, "");

  PackageManager packageManager = getPackageManager();

  //All installed apps that can handle email intent:
  List<ResolveInfo> emailApps = packageManager.queryIntentActivities(emailAppIntent, PackageManager.MATCH_ALL);

  for (ResolveInfo resolveInfo : emailApps) {
    String packageName = resolveInfo.activityInfo.packageName;
    Intent launchIntent = packageManager.getLaunchIntentForPackage(packageName);
    emailAppLauncherIntents.add(launchIntent);
  }

  //Create chooser
  Intent chooserIntent = Intent.createChooser(new Intent(), "Select email app:");
  chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, emailAppLauncherIntents.toArray(new Parcelable[emailAppLauncherIntents.size()]));
  startActivity(chooserIntent);
}
于 2017-03-01T13:11:32.223 に答える
2

これを行うためのより一般的な方法があり、任意のMIMEタイプで動作します。

この投稿を参照してください:Androidで共有インテントをカスタマイズする方法は?

于 2012-02-27T02:36:40.367 に答える
0

インテントチューザーの選択肢をいくつかのオプションに制限することができます。この質問への回答のコードは良い例です。基本的に、インテントチューザに提供するLabeledIntentsのリストを作成する必要があります。これにより、そのリストに含まれます。このソリューションは除外では機能しないことに注意してください(特定のアプリは除外され、残りは残ります)が、代わりに表示するアプリを選択する必要があります。それが役に立てば幸い!

于 2015-05-02T02:21:16.260 に答える
0

すべてのデバイスで動作します。メールアプリのみが表示されます

public static void shareViaMail(Activity activity, String title, String body, String filePath) {

    Uri URI = Uri.parse("file://" + filePath);
    final Intent emailIntent = new Intent(Intent.ACTION_VIEW);

    emailIntent.setData(Uri.parse("mailto:"));

    emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{"contact@brightsociety.com"});

    if (URI != null) {
        emailIntent.putExtra(Intent.EXTRA_STREAM, URI);
    }
    try {
        activity.startActivity(emailIntent);
    } catch (Exception e) {
        ((BaseActivity) activity).showToast("Gmail App is not installed");
        e.printStackTrace();
    }
}
于 2017-07-25T11:38:53.830 に答える
0

Kotlin Answer

メールアプリのみを表示する必要があり、受信トレイのみを開きたい(新しいメール書き込みを開かない)場合は、AとBを実行する必要があります。

A) Android 11のパッケージの可視性が更新されたため、Android11のAndroidManifest.xmlファイルに以下のコードを追加します。

<queries>
    <intent>
        <action android:name="android.intent.action.SENDTO" />
        <data android:scheme="mailto" />
    </intent>
    <intent>
        <action android:name="android.intent.action.CHOOSER" />
    </intent>
</queries>

B)以下の機能を使用して、電子メールチューザーを表示します。

// Show email app list.
fun showEmailAppList() {

    // Email app list.
    val emailAppLauncherIntents: MutableList<Intent?> = ArrayList()

    // Create intent which can handle only by email apps.
    val emailAppIntent = Intent(Intent.ACTION_SENDTO)
    emailAppIntent.data = Uri.parse("mailto:")

    // Find from all installed apps that can handle email intent and check version. 
    val emailApps = packageManager.queryIntentActivities(
        emailAppIntent,
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) 0 else PackageManager.MATCH_ALL
    )

    // Collect email apps and put in intent list.
    for (resolveInfo in emailApps) {
        val packageName = resolveInfo.activityInfo.packageName
        val launchIntent = packageManager.getLaunchIntentForPackage(packageName)
        emailAppLauncherIntents.add(launchIntent)
    }

    // Create chooser with created intent list to show email apps of device.
    val chooserIntent = Intent.createChooser(Intent(), "OPEN EMAIL APP")
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, emailAppLauncherIntents.toTypedArray())
    startActivity(chooserIntent)
}

結果:

メールアプリのみを表示

于 2021-12-21T20:03:35.597 に答える
-1

すべてのデバイスで動作します。メールアプリのみが表示されます

public static void shareViaMail(Activity activity, String title, String body, String filePath) {
        Uri URI = Uri.parse("file://" + filePath);
        final Intent emailIntent = new Intent(Intent.ACTION_VIEW);
        emailIntent.setData(Uri.parse("mailto:"));
        emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{"xyz@gmail.com"});
        /*if you want to attach something*/
        if (URI != null) {
            emailIntent.putExtra(Intent.EXTRA_STREAM, URI);
        }
        try {
            activity.startActivity(emailIntent);
        } catch (Exception e) {
            ((BaseActivity) activity).showToast("Gmail App is not installed");
            e.printStackTrace();
        }
}
于 2017-07-25T11:47:37.140 に答える
-1

解決策は非常に簡単です:

Intent testIntent = new Intent(Intent.ACTION_VIEW);  
Uri data = Uri.parse("mailto:?subject=" + "blah blah subject" + "&body=" + "blah blah body" + "&to=" + "sendme@me.com");  
testIntent.setData(data);  
startActivity(testIntent);  

参照:http ://www.gaanza.com/blog/email-client-intent-android/

于 2018-04-15T21:38:09.643 に答える
-1

多くの検索とテストを行った後、私はついに完璧な解決策を見つけました。オープンソース開発者のおかげで、彼/彼女の簡潔できちんとした解決策を共有してくれたcketti 。

String mailto = "mailto:bob@example.org" +
    "?cc=" + "alice@example.com" +
    "&subject=" + Uri.encode(subject) +
    "&body=" + Uri.encode(bodyText);

Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
emailIntent.setData(Uri.parse(mailto));

try {
  startActivity(emailIntent);
} catch (ActivityNotFoundException e) {
  //TODO: Handle case where no email app is available
}

そして、これは彼/彼女の要点へのリンクです。

于 2020-01-16T09:18:49.200 に答える