【发布时间】: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