当从外部应用程序接收文件时,我遇到了问题。我一直在学习关于https://developer.android.com/training/sharing/receive.html的教程,它可以正常工作,直到我想要处理代码中的图像为止。
我遇到的问题是,如果我只选择一个文件并将其发送到我的应用程序,那么在将它从URI转换为文件对象之后,我无法读取它。但是,如果我发送两个或多个图像(之前选择的相同图像加上来自同一个目录的另一个图像),那么我实际上可以读取文件(所有文件)。为什么会这样呢?即使将文件设置为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文件资源管理器“中选择两个文件并将它们发送到我的应用程序: 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文件资源管理器“中选择一个文件,并将其发送到我的应用程序:内容://media/external/images/media/33675
canRead() = FALSE
实际上,文件内容://media/外部/映像/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/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
谢谢你提前提供帮助。
发布于 2017-03-19 04:13:49
在openInputStream()上使用getContentResolver(Uri)。不需要文件类。
https://stackoverflow.com/questions/42885156
复制