从外部应用程序接收单个文件是不可读的,但在多个时可读

Receiving single file from external app is unreadable, but readable when multiple

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

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

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

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

这是我的问题部分的代码片段:

// 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" 中选择了一个文件并将其发送到我的应用程序: 内容://media/external/images/media/33675

canRead() = 假

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

从 "Google Photos" 中选择了两个文件并将它们发送到我的应用程序: content://com.google.android.apps.photos.contentprovider/0/1/shared%3A%2Flocal%253A4541959b-3222-4ee0-b838-67049141b864%2FV2xDV01jNWhWVDRCQXRMY202YTh3NFNES1N4M01R/REQUIRE_ORIGINAL/NONE/1290260075 content://com.google.android.apps.photos.contentprovider/0/1/shared%3A%2Flocal%253A20e65034-795f-4300-9472-64a598afc4c1%2FV2xDV01jNWhWVDRCQXRMY202YTh3NFNES1N4M01R/REQUIRE_ORIGINAL/NONE/1096770166

两者都 canRead() = FALSE

提前感谢您的帮助。

在 getContentResolver() 上使用 openInputStream(uri)。不需要文件 class.