转发图像URI意图

时间:2016-02-12 13:09:50

标签: android android-intent

我正在开发一个填充电子邮件模板并添加图片的应用。我想按照以下方式使用该应用:从图库中,我通过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

这样做的正确方法是什么?我已经尝试过设置标志和权限,但我找不到如何准确地执行此操作。

2 个答案:

答案 0 :(得分:1)

  

来自图片库,我与我的应用分享图片

你没有解释这意味着什么。我将此解释为您在应用中添加了ACTION_SEND个活动,并且您正在使用某些"分享"图像库应用中的选项可将图像发送到您的应用。

  

这样做的正确方法是什么?

在某种程度上,没有正确的方法来做到这一点。您的选择是:

  1. 将图像复制到您的应用中(例如,复制到内部存储空间中),然后共享本地副本(例如,通过FileProvider

  2. 请勿使用ACTION_SEND来接收图片。相反,使用MediaStore查找图像并使用这些图像显示您自己的UI。然后,通过Uri发送所选图像的ACTION_SEND。这可能有用,虽然我不像其他两个选项那样自信。

  3. 不要使用ACTION_SEND发送电子邮件,而是使用JavaMail或一些等效的库(要求用户给你很多蠢事,比如电子邮件密码),或使用你的Web服务器发送它(要求您将图像上传到服务器)。

  4. 不要写这个应用程序,因为用户可以通过电子邮件自己发送图像来自同一个"分享" "图像库中的菜单"他们用来触发你的应用的应用。

  5. 问题是你在这里有三个应用程序: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类型。