【问题标题】:Gallery can't display image from internal storage图库无法显示来自内部存储的图像
【发布时间】:2015-07-18 06:51:15
【问题描述】:

我将图像存储在应用程序的内部存储器中。我可以抓取路径,并且可以成功地将其设置为图像视图。但是当我试图让用户使用图库(意图)打开它时,它会显示黑屏。

myIntent.setDataAndType(Uri.fromFile(file), mimetype);
intent = Intent.createChooser(myIntent, "Choose a viewer");
startActivity(intent);

我很确定这与画廊出于某种原因无法访问我的应用程序的私人存储的权限有关。但是有没有办法做到这一点“除了将文件移动到外部存储”

谢谢

【问题讨论】:

  • 你可以试试:File file = new File(filePath); Uri uri = Uri.fromFile(file); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(uri, fileType); context.startActivity(intent);

标签: android


【解决方案1】:

Use FileProvider 提供来自internal storage 的文件。引用文档:

FileProvider 是 ContentProvider 的一个特殊子类,它通过为文件创建 content:// Uri 而不是 file:/// Uri 来促进与应用关联的文件的安全共享。

内容 URI 允许您使用临时访问权限授予读写访问权限。当您创建包含内容 URI 的 Intent 时,为了将内容 URI 发送到客户端应用程序,您还可以调用 Intent.setFlags() 来添加权限。只要接收 Activity 的堆栈处于活动状态,客户端应用程序就可以使用这些权限。

【讨论】:

    【解决方案2】:

    这是一个简单的“基于单个文件的解决方案”

    当您添加文件时,让 Media Store Content Provider 知道它使用

    sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,  
                                           Uri.fromFile(imageAdded)));
    

    【讨论】:

      【解决方案3】:

      我已经做了一些类似的事情来显示画廊中的图像。

      private void pickFromGallery() {
          Crop.pickImage(this);
      }    
      

      作物是一个android类。

      这是crop类中的一个函数。

      public static void pickImage(Activity activity) {
          Intent intent = (new Intent("android.intent.action.GET_CONTENT")).setType("image/*");
      
          try {
              activity.startActivityForResult(intent, 9162);
          } catch (ActivityNotFoundException var3) {
              Toast.makeText(activity, string.crop__pick_error, 0).show();
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2016-09-28
        • 1970-01-01
        • 1970-01-01
        • 2021-09-05
        • 2020-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多