如何使用Android

时间:2016-08-21 14:12:54

标签: android file android-external-storage

我在使用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从外部存储转换为文件?

enter image description here

1 个答案:

答案 0 :(得分:1)

  

我在Android中使用文件选择器从外部存储中选择图像文件时遇到问题

如果您指的是this question中使用的代码,则表示您不是“使用文件选择器”。您正在使用ACTION_GET_CONTENT,它从未成为“文件选择器”,也不会成为“文件选择器”。

  

我想将结果URI转换为文件。

通常,这不是必需的。但是,如果这就是你想要做的事情:

  • 使用ContentResolveropenInputStream()获取InputStream

    所代表内容的Uri
  • 在所需文件上创建FileOutputStream

  • 使用Java I / O将InputStream中的字节复制到FileOutputStream

  

以上代码效果很好。它正在发挥作用。

适用于您测试的少量设备,用于用户选择处理ACTION_GET_CONTENT请求的特定活动。它不适用于大多数Android设备,在大多数情况下都无法使用。代码唯一有效的时间是Urifile方案。大多数时候,它不会。相反,它将采用content方案,表示由ContentProvider提供的内容。

  

请问如何从外部存储中正确打开图像文件?

如果您希望继续使用ACTION_GET_CONTENT,请明白这与外部存储无关。您没有在外部存储或其他地方获取文件。你得到一个Uri。这类似于URL,例如此Web页面的URL。正如URL不一定指向硬盘驱动器上的文件一样,Uri并不一定指向文件系统上的文件。使用ContentResolverDocumentFile来处理Uri及其标识的内容。

如果您希望始终获取外部存储空间(以及其他地方)的文件,请使用an actual file picker library