从外部应用程序接收文件时出现问题。我一直在关注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
提前感谢您的帮助。
答案 0 :(得分:0)
在getContentResolver()上使用openInputStream(uri)。不需要File类。