我在使用Android中的文件选择器从外部存储中选择图像文件时遇到问题。这个问题是这个问题的结果 - No such file or diectory error in image file upload using Retrofit in Android。我的问题是在活动结果上打开并从外部存储器读取文件。我想将结果URI转换为文件。
我从活动结果的下载文件夹中读取了一个pdf文件
Uri bookUri = data.getData();
if(bookUri!=null)
{
String filePath = bookUri.toString();//bookUri.toString()
String mime = app.getMimeType(filePath);
if(mime!=null && !mime.isEmpty() && (mime.toLowerCase()=="application/pdf" || mime.toLowerCase()=="application/txt" || mime.toLowerCase()=="application/text"))
{
bookFile = new File(bookUri.getPath());
ivBookFile.setImageResource(R.drawable.book_selected);
}
else{
Toast.makeText(getBaseContext(),"Unable to process file you have chosen.",Toast.LENGTH_SHORT).show();
}
}
如您所见,我使用了新文件(bookUri.getPath());转换为文件。上面的代码效果很好。这是工作。现在的问题是我试图在活动结果的DCIM / Camera文件夹中打开一个图像文件。
这是我使用的代码
Uri selectedImageUri = data.getData();
if(selectedImageUri!=null)
{
try{
bmpCoverImage = MediaStore.Images.Media.getBitmap(getContentResolver(), selectedImageUri);
imageFile = new File(selectedImageUri.getPath());
if(bmpCoverImage!=null)
{
ivCoverImage.setImageBitmap(bmpCoverImage);
}
}
catch (IOException e)
{
Toast.makeText(getBaseContext(),"An error occurred with the file selected",Toast.LENGTH_SHORT).show();
}
}
如您所见,我使用了新文件(selectedImageUri.getPath());就像我在阅读pdf文件时所做的那样。这次代码不起作用。当我像上一个问题一样对文件进行操作时,它会给我错误。
我也用这种方式
imageFile = new File(Environment.getExternalStorageDirectory(),selectedImageUri.getPath());
我得到了同样的错误。请问如何从外部存储中正确打开图像文件?如何将所选文件URI从外部存储转换为文件?
答案 0 :(得分:1)
我在Android中使用文件选择器从外部存储中选择图像文件时遇到问题
如果您指的是this question中使用的代码,则表示您不是“使用文件选择器”。您正在使用ACTION_GET_CONTENT
,它从未成为“文件选择器”,也不会成为“文件选择器”。
我想将结果URI转换为文件。
通常,这不是必需的。但是,如果这就是你想要做的事情:
使用ContentResolver
和openInputStream()
获取InputStream
Uri
在所需文件上创建FileOutputStream
使用Java I / O将InputStream
中的字节复制到FileOutputStream
以上代码效果很好。它正在发挥作用。
适用于您测试的少量设备,用于用户选择处理ACTION_GET_CONTENT
请求的特定活动。它不适用于大多数Android设备,在大多数情况下都无法使用。代码唯一有效的时间是Uri
有file
方案。大多数时候,它不会。相反,它将采用content
方案,表示由ContentProvider
提供的内容。
请问如何从外部存储中正确打开图像文件?
如果您希望继续使用ACTION_GET_CONTENT
,请明白这与外部存储无关。您没有在外部存储或其他地方获取文件。你得到一个Uri
。这类似于URL,例如此Web页面的URL。正如URL不一定指向硬盘驱动器上的文件一样,Uri
并不一定指向文件系统上的文件。使用ContentResolver
和DocumentFile
来处理Uri
及其标识的内容。
如果您希望始终获取外部存储空间(以及其他地方)的文件,请使用an actual file picker library。