【发布时间】:2010-10-14 15:44:48
【问题描述】:
我正在尝试在我的 Android 应用程序中单击按钮时打开 Gmail 撰写屏幕。 我需要谷歌的一些 API 密钥吗?或者我需要在我的按钮 onClickListener 中做什么?
非常感谢任何形式的见解。
【问题讨论】:
我正在尝试在我的 Android 应用程序中单击按钮时打开 Gmail 撰写屏幕。 我需要谷歌的一些 API 密钥吗?或者我需要在我的按钮 onClickListener 中做什么?
非常感谢任何形式的见解。
【问题讨论】:
正如 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);
}
}
【讨论】:
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
}
【讨论】:
我不知道你可以专门启动 gmail。你有没有在你的 onClickListener 中尝试过这个
Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.setType("text/plain");
startActivity(emailIntent);
您可以在此处找到更多详细信息:Email android intent
【讨论】:
您只需将以下代码放入您的点击事件中。将直接打开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"));
输出:
【讨论】:
只需将这组代码放在您的点击事件/触发事件中,它就会直接将您导航到预先填写所有详细信息的本机 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
【讨论】:
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);
}
【讨论】:
<TextView
android:id="@+id/EmailId"
android:linksClickable="true"
android:autoLink="email"
android:text="info@stackoverflow.com"
/>
这是点击 textView 发送电子邮件的最佳方法。
【讨论】:
此代码将直接启动 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);
【讨论】:
您可以使用简单的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);
}
【讨论】:
如果你在这一行没有得到任何东西
final List<ResolveInfo> matches = pm.queryIntentActivities(intent, 0);
然后将这一行替换为
final List<ResolveInfo> matches = pm.queryIntentActivities(intent, 1);
【讨论】:
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);
【讨论】: