我正在开发一个填充电子邮件模板并添加图片的应用。我想按照以下方式使用该应用:从图库中,我通过ACTION_SEND与我的应用共享图像。我的应用程序进行了一些处理,然后与附件共享电子邮件。
现在我正在尝试简单地获取图像Uri并将其传递,然后我得到一个SecurityException。
protected void onCreate(Bundle savedInstanceState) {
// Read the incoming intent
Intent intent = getIntent();
String action = intent.getAction();
String type = intent.getType();
Uri imageUri;
if (Intent.ACTION_SEND.equals(action) && type != null) {
if (type.startsWith("image/")) {
imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);
}
}
// Create the outgoing intent
Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.setType("message/rfc822");
if(imageUri != null){
emailIntent.putExtra(Intent.EXTRA_STREAM, imageUri);
}
startActivity(Intent.createChooser(emailIntent, getString(R.string.chooserText)));
}
日志记录:
02-12 14:07:11.196 10241-10241/? E/ResolverActivity: Unable to launch as uid 10156 package ***, while running in android:ui
java.lang.SecurityException: Uid 10156 does not have permission to uri 0 @ content://com.google.android.apps.photos.contentprovider/0/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F19546/FORMAT_JPEG/778368258
这样做的正确方法是什么?我已经尝试过设置标志和权限,但我找不到如何准确地执行此操作。
答案 0 :(得分:1)
来自图片库,我与我的应用分享图片
你没有解释这意味着什么。我将此解释为您在应用中添加了ACTION_SEND
个活动,并且您正在使用某些"分享"图像库应用中的选项可将图像发送到您的应用。
这样做的正确方法是什么?
在某种程度上,没有正确的方法来做到这一点。您的选择是:
将图像复制到您的应用中(例如,复制到内部存储空间中),然后共享本地副本(例如,通过FileProvider
)
请勿使用ACTION_SEND
来接收图片。相反,使用MediaStore
查找图像并使用这些图像显示您自己的UI。然后,通过Uri
发送所选图像的ACTION_SEND
。这可能有用,虽然我不像其他两个选项那样自信。
不要使用ACTION_SEND
发送电子邮件,而是使用JavaMail或一些等效的库(要求用户给你很多蠢事,比如电子邮件密码),或使用你的Web服务器发送它(要求您将图像上传到服务器)。
不要写这个应用程序,因为用户可以通过电子邮件自己发送图像来自同一个"分享" "图像库中的菜单"他们用来触发你的应用的应用。
问题是你在这里有三个应用程序:A,B和C:
A是图片库
B是您的应用
C是您尝试通过ACTION_SEND
当A使用ACTION_SEND
来调用B时,A授予B使用该图像的权限。但是,B无法转身并授予C使用A&#39的图像的权利。
答案 1 :(得分:0)
从API 16开始,将FLAG_GRANT_READ_URI_PERMISSION
添加到共享意图就足够了。这将授予接收应用程序读取content://
URI的权限。它也是可传递的,即权限被授予您的应用程序,您可以将其授予接收应用程序。
emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
在API 16之前的版本上,由于content://
URI存储在EXTRA_STREAM
中,并且URI权限仅适用于使用setData(Uri)
设置的URI,因此无法正常工作。要解决该限制,您可以添加以下行。
emailIntent.setData(imageUri);
旁注:使用" message / rfc822"不会将选择列表限制为电子邮件应用程序。我所知道的没有电子邮件客户端具有专门匹配" message / rfc822"的意图过滤器。它只能起作用,因为大多数电子邮件客户端都支持附加任意文件,即" * / *"。但是,例如文件管理器,因此它们也出现在该列表中。您也可以为图像使用正确的MIME类型。