【问题标题】:Receiving single file from external app is unreadable, but readable when multiple从外部应用程序接收单个文件是不可读的,但在多个时可读
【发布时间】:2017-03-19 09:52:07
【问题描述】:

我从外部应用程序接收文件时遇到问题。我一直在关注https://developer.android.com/training/sharing/receive.html 上的教程,它工作正常,直到我想在我的代码中处理图像。

我遇到的问题是,如果我只选择一个文件并将其发送到我的应用程序,则在将其从 URI 转换为 FILE 对象后,我无法读取它。但是,如果我发送两个或更多图像(之前选择的相同图像加上同一目录中的另一个图像),那么我实际上可以读取文件(所有文件)。 这是为什么?即使将文件设置为 setReadable(true); 之后我也无法读取它。

目标 SDK 是 23,是的,我已经在 API 23+ 所需的代码中实现了权限请求。所以这不可能是问题。 我需要能够读取收到的文件,无论它是一个还是多个列表。

附带说明:如果我从 Google 相册应用发送任意数量的图像(一张或多张),我将永远无法读取该文件。从“ES File Explorer”应用程序发送的图像在代码中是可读的,但如果我只向我的应用程序发送一个文件,则不可读。

这是我有问题部分的代码sn-p:

// THIS PART WORKS. RECEIVING MULTIPLE FILES ARE READABLE IN THE CODE BELOW.
void handleSendMultipleImages(Intent intent) {
    ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
    if (imageUris != null) {
        addImagesToNewOrExistingContact(imageUris);
    }
}

// THIS PART DOES NOT WORK. I CAN NOT READ THE FILE IN THE CODE BELOW.
private void addImageToNewOrExistingContactDialog(Uri imageUri) {
    ArrayList imageUris = new ArrayList<>();
    imageUris.add(imageUri);
    addImagesToNewOrExistingContact(imageUris);
}

private void addImagesToNewOrExistingContact(final ArrayList<Uri> imageUris) {

    for (Uri uri : imageUris) {
        File f = new File(uri.getPath());
        f.setReadable(true);
        f.setWritable(true);

        boolean readd = f.canRead(); // FALSE, but why?
        boolean exec = f.canExecute(); // FALSE, but why?
    }
}

我测试过的文件:
从“ES File Explorer”中选择两个文件并将它们发送到我的应用程序: file:///storage/emulated/0/Pictures/Adobe%C2%AE%20Photoshop%C2%AE%20Touch/1452348875289.jpg file:///storage/emulated/0/Pictures/Adobe%C2%AE%20Photoshop%C2%AE%20Touch/1455733673513.jpg

canRead() = TRUE

从“ES File Explorer”中选择一个文件并将其发送到我的应用程序: 内容://媒体/外部/图像/媒体/33675

canRead() = FALSE

其实文件 content://media/external/images/media/33675 ​​和 file:///storage/emulated/0/Pictures/Adobe%C2%AE%20Photoshop%C2%AE%20Touch/1455733673513.jpg是完全相同的文件。

从“Google 相册”中选择两个文件并将它们发送到我的应用: content://com.google.android.apps.photos.contentprovider/0/1/shared%3A%2Flocal%253A4541959b-3222-4ee0-b838-67049141b864%2FV2xDV01jNWhWVDRCQXRMY202YTh3NFNES1N4M01R/REQUIRE_ORIGINAL/NONE/1290206 content://com.google.android.apps.photos.contentprovider/0/1/shared%3A%2Flocal%253A20e65034-795f-4300-9472-64a598afc4c1%2FV2xDV01jNWhWVDRCQXRMY202YTh3NFNES1N4M01R/REQUIRE_ORIGINAL/NONE/1096p70>

canRead() = FALSE

提前感谢您的帮助。

【问题讨论】:

  • 请将 imageUri.toString() 的值放入您的代码中。向我们展示您获得的路径或内容方案的外观。
  • 一般来说:您正在尝试从 uri 构造 File 对象。那大多不会成功。如果你想在 uri 后面打开一个“文件”,那么只需打开一个输入流。
  • 感谢您到目前为止的评论。我已经更新了我的问题并添加了文件路径。
  • 您对输入流的评论实际上是解决方案!我使用的 FileOutputStream 不起作用,因为该文件位于 canRead() = false 上。切换到 openInputStream(uri) 就像一个魅力!如果你想在我的问题下面写这个作为答案,我可以选择它作为接受的答案。

标签: android android-file android-sharing


【解决方案1】:

在 getContentResolver() 上使用 openInputStream(uri)。不需要 File 类。

【讨论】:

  • 谢谢!使用 openInputStream(uri) 而不是 fileInputStream(File) 确实解决/避免了 File.canRead() 问题。
猜你喜欢
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
  • 2016-06-25
  • 1970-01-01
  • 2021-10-15
  • 1970-01-01
相关资源
最近更新 更多