获取URI的路径始终为空?

时间:2017-05-23 22:27:56

标签: android file uri retrofit android-gallery

所以我正在使用改造将图像上传到我们的服务器,并使用图库选择器来选择图像。我试图获取图像的路径,因为uri.getPath()返回文件未找到异常。我几乎看到了关于这个主题的几乎所有stackoverflow文章,但仍然没有答案。我拥有的以下代码与我在网上看到的所有内容类似,它总是返回null,我不知道为什么。请帮助

        @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {
        try {
            android.net.Uri selectedImage = data.getData();

            Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), selectedImage);
            // Log.d(TAG, String.valueOf(bitmap));
            ImageView imageView = (ImageView) findViewById(R.id.expandedProfilePic);
            imageView.setImageBitmap(bitmap);

            String[] filePathColumn = {MediaStore.Images.Media.DATA};
            android.database.Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
            if (cursor == null)
                return;

            cursor.moveToFirst();

            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String filePath = cursor.getString(columnIndex);
            cursor.close();

            // is always null
            System.out.println("FILE PATH " + filePath);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

1 个答案:

答案 0 :(得分:3)

  

我正在尝试获取图像的路径,因为uri.getPath()返回文件未找到异常

假设“gallery chooser”是指ACTION_GET_CONTENT或可能是ACTION_PICK,则没有路径,因为Uri不是文件。

  

我几乎看到了关于这个主题的每篇stackoverflow文章

不,你没有。具体来说,您尚未阅读我所贡献的任何数据,例如this onethis onethis onethis onethis one或{{ 3}}或this onethis onethis onethis onethis onethis onethis one。这些都是从2017年开始的。

  

以下代码与我在网上看到的所有内容相似

该代码不适用于大多数Uri值。

使用ContentResolveropenInputStream()获取InputStream标识的内容Uri。理想情况下,您只需使用InputStream。在Retrofit的情况下,虽然我还没有尝试使用它上传内容,但我的猜测是它坚持使用文件。在这种情况下,请在您控制的某个文件上使用InputStreamFileOutputStream来制作内容的副本。然后,上传副本,完成后将其删除。