【问题标题】:Gallery can't open content uri image file on android 7.0图库无法在 android 7.0 上打开内容 uri 图像文件
【发布时间】:2017-07-23 22:50:08
【问题描述】:

在我的应用中,我会显示一个帖子列表,其中帖子可能有图片。当用户点击帖子图片时,创建选择器会显示可用选项,如“照片”、“画廊”。我的问题是,为什么画廊不能在 android 7.0 或 API 24 及更高版本上打开图像?我收到错误“无法打开文件”。在 API 级别 23 及以下,我提供了似乎工作正常的实际文件路径。我在发布这个问题之前确认了以下事情。有趣的部分是“照片”可以打开它。

  1. 我使用 FileProvider 获得了正确的内容 uri。我的 uri 看起来像这样:

    content://package.fileprovider/attachment/filename

  2. 我使用了正确的 mime 类型。

  3. 我正在使用正确的意图和权限标志。请参阅以下代码:

意图 myIntent = new Intent(Intent.ACTION_VIEW); myIntent.putExtra(ShareCompat.EXTRA_CALLING_PACKAGE, getActivity().getPackageName()); myIntent.putExtra(ShareCompat.EXTRA_CALLING_ACTIVITY, getActivity().getComponentName());

myIntent.setDataAndType(uri, mimeType); myIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); startActivity(Intent.createChooser(myIntent, "打开文件:"));

【问题讨论】:

  • 检查 LogCat 以查看您的图库应用在显示该消息时是否记录了任何值得注意的内容。可能是您的设备有一个错误的图库应用。
  • 感谢您的回复。我检查了 LogCat。我没有看到任何注释或消息。还有其他建议吗?
  • 所有作品都在牛轧糖上。没问题。两种不同的设备。
  • 我使用的是 LG G5,安卓 7.0。它不工作。你发现代码有什么问题吗?

标签: android


【解决方案1】:

仅适用于 Android API 24 以上 - Nougat 设备

 File file = new File(String.valueOf(path), imageName+".png"); //it is image file name.
 if(Build.VERSION.SDK_INT>=24){ 
      Intent intent = new Intent();

      intent.setAction(Intent.ACTION_VIEW);

      intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //must provide

      Uri photoUri = FileProvider.getUriForFile(YourCurrentActivity.this, 
                      android.support.v4.BuildConfig.APPLICATION_ID + 
                      ".fileprovider", finalFile);

      intent.setData(photoUri);

      YourCurrentActivity.this.startActivity(intent);
 }

【讨论】:

  • 你拯救了我的一天!真的,我很喜欢,我至少需要在一天结束之前在画廊中显示这张图片。但我现在有一个小时的库存。我做了很多回应,看到了你的 FLAG_GRANT_READ_URI_PERMISSION。它在我的代码中丢失了。非常感谢
【解决方案2】:

您可以通过将其添加到您的应用程序来打开文件 URI:

if(Build.VERSION.SDK_INT>=24){
    try{
        Method m = StrictMode.class.getMethod("disableDeathOnFileUriExposure");
        m.invoke(null);
    }catch(Exception e){
        e.printStackTrace();
    }
}

内容可能是新事物,但在我看来,与较低 API 设备相比,没有足够的 7.0 设备活动来证明不使用这种已弃用的方法是合理的。 7.0的设备还是可以用这个的,安静的好。

【讨论】:

    【解决方案3】:

    也许在 Nougat 上,您需要获得用户的读写权限。您的代码将在 N 以下工作。因此请用户授予读取权限并检查 FileProvider,您也将需要它。

    【讨论】:

    • 在android N之前需要权限,我们在谈论另一个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多