【问题标题】:How to open Gmail Compose when a button is clicked in Android App?在Android App中单击按钮时如何打开Gmail Compose?
【发布时间】:2010-10-14 15:44:48
【问题描述】:

我正在尝试在我的 Android 应用程序中单击按钮时打开 Gmail 撰写屏幕。 我需要谷歌的一些 API 密钥吗?或者我需要在我的按钮 onClickListener 中做什么?

非常感谢任何形式的见解。

【问题讨论】:

    标签: android gmail


    【解决方案1】:

    正如 JeffC 所指出的,很容易告诉 Android 您想要发送类似电子邮件的内容,并让 Android 为用户提供一个选择列表,其中可能包括 GMail。如果你特别想要 GMail,你必须更聪明一点。 (请注意,正确的 MIME 类型实际上是“text/plain”,而不是“plain/text”。对于一个奇怪的实现,GMail 似乎是唯一响应后者的活动,但这不是我想要的行为指望。)

    以下 App 展示了您可以遵循的原则:实际检查所有声称可以处理您的 SEND 意图的活动,并查看它们是否看起来像 GMail。

    package com.stackoverflow.beekeeper;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.content.pm.ResolveInfo;
    import android.os.Bundle;
    
    import java.util.List;
    
    public class StackOverflowTest extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(final Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            final Intent intent = new Intent(android.content.Intent.ACTION_SEND);
            intent.setType("text/plain");
            final PackageManager pm = getPackageManager();
            final List<ResolveInfo> matches = pm.queryIntentActivities(intent, 0);
            ResolveInfo best = null;
            for (final ResolveInfo info : matches)
               if (info.activityInfo.packageName.endsWith(".gm") ||
            info.activityInfo.name.toLowerCase().contains("gmail")) best = info;
            if (best != null)
               intent.setClassName(best.activityInfo.packageName, best.activityInfo.name);
            startActivity(intent);
        }
     }
    

    【讨论】:

    • 感谢您提供信息和代码养蜂人。就此而言,打开任何其他邮件程序并让用户选择是完全可以的。它不必是gmail。只有那个程序应该能够发送一封电子邮件,我认为这是通过 final Intent intent = new Intent(android.content.Intent.ACTION_SEND);
    • 如何像 Gmail 一样以编程方式打开 Yahoo 邮件??
    • 也许这个答案会对你有所帮助:stackoverflow.com/questions/9516334/…
    • StackOverflow 上的最佳答案!
    • 你让我开心,谢谢!如果有人想添加主题和文字,请使用它! intent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{ mail.getText().toString() }); intent.putExtra(android.content.Intent.EXTRA_SUBJECT, "查询"); intent.putExtra(android.content.Intent.EXTRA_TEXT, "");
    【解决方案2】:
    try {    
        Intent intent = new Intent (Intent.ACTION_VIEW , Uri.parse("mailto:" + "your_email"));
        intent.putExtra(Intent.EXTRA_SUBJECT, "your_subject");
        intent.putExtra(Intent.EXTRA_TEXT, "your_text");
        startActivity(intent);
    } catch (ActivityNotFoundException e){
        //TODO smth
    }
    

    【讨论】:

    • 有帮助,用 ActivityNotFoundException 包装一下。
    • @Rasi 谢谢。我在答案中添加了 try-catch。
    • 嗨@valerybodak。主题行和正文未出现在 Gmail 应用程序中。你能帮忙吗??
    【解决方案3】:

    我不知道你可以专门启动 gmail。你有没有在你的 onClickListener 中尝试过这个

    Intent emailIntent = new Intent(Intent.ACTION_SEND);
    emailIntent.setType("text/plain");
    startActivity(emailIntent);  
    

    您可以在此处找到更多详细信息:Email android intent

    【讨论】:

    • 不,我还没有尝试过。但我一定会的。感谢杰夫的帮助。
    • 如果没有安装电子邮件应用程序将会崩溃。请像这样包裹在意图选择器中:Intent.createChooser(intent, "Send email")
    【解决方案4】:

    您只需将以下代码放入您的点击事件中。将直接打开gmail作为撰写模式,下面附上输出截图。

    编码愉快:-)

    代码:

    Intent intent=new Intent(Intent.ACTION_SEND);
    String[] recipients={"mailto@gmail.com"};
    intent.putExtra(Intent.EXTRA_EMAIL, recipients);
    intent.putExtra(Intent.EXTRA_SUBJECT,"Subject text here...");
    intent.putExtra(Intent.EXTRA_TEXT,"Body of the content here...");
    intent.putExtra(Intent.EXTRA_CC,"mailcc@gmail.com");
    intent.setType("text/html");
    intent.setPackage("com.google.android.gm");
    startActivity(Intent.createChooser(intent, "Send mail"));
    

    输出:

    【讨论】:

      【解决方案5】:

      只需将这组代码放在您的点击事件/触发事件中,它就会直接将您导航到预先填写所有详细信息的本机 gmail 应用程序。

      所有电子邮件属性/详细信息都在下面的代码集中(添加了评论)。

      Intent intent = new Intent(Intent.ACTION_SEND);
              String[] recipients = {"recipient@gmail.com"};//Add multiple recipients here
              intent.putExtra(Intent.EXTRA_EMAIL, recipients);
              intent.putExtra(Intent.EXTRA_SUBJECT, "Mail Subject"); //Add Mail Subject
              intent.putExtra(Intent.EXTRA_TEXT, "Enter your mail body here...");//Add mail body
              intent.putExtra(Intent.EXTRA_CC, "mailcc@gmail.com");//Add CC emailid's if any
              intent.putExtra(Intent.EXTRA_BCC, "mailbcc@gmail.com");//Add BCC email id if any
              intent.setType("text/html");
              intent.setPackage("com.google.android.gm");//Added Gmail Package to forcefully open Gmail App
              startActivity(Intent.createChooser(intent, "Send mail"));
      

      #HAPPY_CODING

      【讨论】:

      • 虽然这可能会回答问题,但您应该 edit 您的回答包括有关此代码如何回答问题的一些其他详细信息,以便为未来的读者提供上下文。代码块本身并不会立即对以后遇到相同问题的人有用。
      • 嗨@Hoppeduppeanut,注意。感谢您的建议。
      【解决方案6】:
      public static void openGmail(Activity activity,String[] email, String subject, String content) {
          Intent emailIntent = new Intent(Intent.ACTION_SEND);
          emailIntent.putExtra(Intent.EXTRA_EMAIL, email);
          emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
          emailIntent.setType("text/plain");
          emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, content);
          final PackageManager pm = activity.getPackageManager();
          final List<ResolveInfo> matches = pm.queryIntentActivities(emailIntent, 0);
          ResolveInfo best = null;
          for(final ResolveInfo info : matches)
              if (info.activityInfo.packageName.endsWith(".gm") || info.activityInfo.name.toLowerCase().contains("gmail"))
                  best = info;
          if (best != null)
              emailIntent.setClassName(best.activityInfo.packageName, best.activityInfo.name);
      
          activity.startActivity(emailIntent);
      }
      

      【讨论】:

      • 它会打开 gmail 应用程序,但一旦发送电子邮件,它就不会发送给收件人
      【解决方案7】:
      <TextView
       android:id="@+id/EmailId"
       android:linksClickable="true"
       android:autoLink="email"
       android:text="info@stackoverflow.com"
       />
      

      这是点击 textView 发送电子邮件的最佳方法。

      【讨论】:

        【解决方案8】:

        此代码将直接启动 gmail 应用程序以发送电子邮件。

        我使用this post 发现这里的重要部分是找到“packageName”和“activityInfo.name”

        我只想使用没有选择器的 gmail。请注意,包名称是硬编码的,因此如果 Gmail 更改其包名称,它将不再起作用。

        其中的关键是 setComponent,其中第一个参数是包名称,第二个参数是 activityInfo 名称。

        但是就像我说的谨慎使用一样,我重复一遍;如果用户没有安装 gmail 应用程序或 gmail 更改其包名称或 Activty 名称以发送电子邮件,则此(硬)代码将中断。你已经被警告了;)

        这是我的代码

        Intent myIntent = new Intent(Intent.ACTION_SEND);
        
        PackageManager pm = getPackageManager();
        Intent tempIntent = new Intent(Intent.ACTION_SEND);
        tempIntent.setType("*/*");
        List<ResolveInfo> resInfo = pm.queryIntentActivities(tempIntent, 0);
        for (int i = 0; i < resInfo.size(); i++) {
            ResolveInfo ri = resInfo.get(i);
            if (ri.activityInfo.packageName.contains("android.gm")) {
                myIntent.setComponent(new ComponentName(ri.activityInfo.packageName, ri.activityInfo.name));
                myIntent.setAction(Intent.ACTION_SEND);
                myIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{"exampleto@gmail.com"});
                myIntent.setType("message/rfc822");
                myIntent.putExtra(Intent.EXTRA_TEXT, "extra text");
                myIntent.putExtra(Intent.EXTRA_SUBJECT, "Extra subject");
                myIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("uri://your/uri/string");
            }
        }
        startActivity(myIntent);
        

        【讨论】:

          【解决方案9】:

          您可以使用简单的Intent.ACTION_SEND 意图 为电子邮件数组设置Intent.EXTRA_EMAIL 在电子邮件编辑器中为主题行设置 Intent.EXTRA_SUBJECT 在此处探索更多可用的额外选项 -> https://developer.android.com/guide/components/intents-common#Email

          这是一个快速的代码 sn-p

          Intent intent = new Intent(Intent.ACTION_SEND);
                          intent.setType("*/*");
                          intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"test@gmail.com"});
                          intent.putExtra(Intent.EXTRA_SUBJECT, "Feedback");
                          if (intent.resolveActivity(ctx.getPackageManager()) != null) {
                              startActivity(intent);
                          }
          

          【讨论】:

          • 本网站上通常不赞成仅使用代码的答案。您能否编辑您的答案以包含一些 cmets 或对您的代码的解释?解释应回答以下问题:它有什么作用?它是如何做到的?它去哪儿了?它是如何解决OP的问题的?
          【解决方案10】:

          如果你在这一行没有得到任何东西

          final List&lt;ResolveInfo&gt; matches = pm.queryIntentActivities(intent, 0);

          然后将这一行替换为

          final List&lt;ResolveInfo&gt; matches = pm.queryIntentActivities(intent, 1);

          【讨论】:

            【解决方案11】:
            Intent intent = new Intent(Intent.ACTION_SEND).setType("text/plain")
                                    .putExtra(Intent.EXTRA_EMAIL, new String[]{emails});
                            List<ResolveInfo> matches = activity.getPackageManager().queryIntentActivities(intent, 0);
                            ResolveInfo best = null;
                            for (ResolveInfo info : matches) {
                                if (info.activityInfo.packageName.endsWith(".gm") || info.activityInfo.name.toLowerCase().contains("gmail")) {
                                    best = info;
                                }
                            }
                            if (best != null) {
                                intent.setClassName(best.activityInfo.packageName,best.activityInfo.name);
                            }
                            activity.startActivity(intent);
            

            【讨论】:

            • 请添加一些附加信息说明为什么会这样
            • @ plaidDK ,在 List 中,我们正在获取设备上已安装应用程序的所有包。之后,通过将条件放入 for 循环来检查 gmail 的包。如果 List 包含 gmail 包,则通过 intent.setClassName() 设置 gmail 包,它将直接打开 gmail 应用程序,否则将打开多个选项意图..
            猜你喜欢
            • 2022-06-23
            • 1970-01-01
            • 2011-12-26
            • 1970-01-01
            • 2015-10-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多