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

时间:2017-03-19 09:52:07

标签: android android-file android-sharing

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

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

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

旁注:如果我从Google相册应用程序(一个或多个)发送任意数量的图像,我永远无法读取该文件。从“ES文件资源管理器”应用程序发送的图像在代码中是可读的,但如果我只将一个文件发送到我的应用程序,则无法读取。

以下是我有问题的部分的代码片段:

// 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文件资源管理器”中选择两个文件并将它们发送到我的应用程序: 文件:///storage/emulated/0/Pictures/Adobe%C2%AE%20Photoshop%C2%AE%20Touch/1452348875289.jpg 文件:///storage/emulated/0/Pictures/Adobe%C2%AE%20Photoshop%C2%AE%20Touch/1455733673513.jpg

两个canRead()= TRUE

从“ES文件资源管理器”中选择一个文件并将其发送到我的应用: 内容://媒体/外部/图像/媒体/ 33675 ​​

canRead()= FALSE

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

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

两个canRead()= FALSE

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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