通过 Intent 发送电子邮件:SecurityException
Posted
技术标签:
【中文标题】通过 Intent 发送电子邮件:SecurityException【英文标题】:Send email through Intent : SecurityException 【发布时间】:2017-03-30 08:53:05 【问题描述】:这是我通过 Gmail 应用程序发送电子邮件的方式。
Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.setClassName("com.google.android.gm", "com.google.android.gm.ComposeActivityGmail");
emailIntent.setType("text/html");
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Puzzle");
emailIntent.putExtra(Intent.EXTRA_TEXT, someTextHere));
emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(attachmentFile));
try
startActivityForResult(emailIntent, SHARE_PUZZLE_REQUEST_CODE);
catch (ActivityNotFoundException e)
showToast("No application found on this device to perform share action");
catch (Exception e)
showToast(e.getMessage());
e.printStackTrace();
它没有启动 Gmail 应用程序,而是显示以下消息。
java.lang.SecurityException: Permission Denial: starting Intent act=android.intent.action.SEND typ=text/html cmp=com.google.android.gm/.ComposeActivityGmail (has extras) from ProcessRecord8293c64 26854:com.xxx.puzzleapp/u0a383 (pid=26854, uid=10383) not exported from uid 10083
关于 SOF 的问题很少,建议使用 exported = true。但我无法使用此解决方案,因为我正在启动另一个应用程序的活动。你能指导我吗?
【问题讨论】:
ClassName(com.google.android.gm.ComposeActivityGmail) 最近已更改。请检查并给出适当的类名。否则您可以直接给出 emailIntent.setPackage("com.google.android.gm") 而不是 emailIntent.setClassName; @Rajasekhar 获取 android.content.ActivityNotFoundException:未找到处理 Intent act=android.intent.action.VIEW typ=text/plain pkg=com.google.android.gm 的活动(有附加功能) 【参考方案1】:试试这个
Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.setType("text/html");
final PackageManager pm = this.getPackageManager();
final List<ResolveInfo> matches = pm.queryIntentActivities(emailIntent, 0);
String className = null;
for (final ResolveInfo info : matches)
if (info.activityInfo.packageName.equals("com.google.android.gm"))
className = info.activityInfo.name;
if(className != null && !className.isEmpty())
break;
emailIntent.setClassName("com.google.android.gm", className);
【讨论】:
【参考方案2】:我猜拉贾塞卡是对的。在我的情况下,与旧版应用程序有相同的问题,我查看了 G 站点中的参考代码,并使用了类似的内容:
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);
它没有任何问题。
PS:就我而言,将应用选择器提供给用户没有问题。它适用于每个 gmail 版本,与您的代码相同,破坏了 gmail v6.10.23 的应用程序
【讨论】:
以上是关于通过 Intent 发送电子邮件:SecurityException的主要内容,如果未能解决你的问题,请参考以下文章
使用 Android Intent.ACTION_SEND 发送电子邮件