【问题标题】:Getting path to URI is always null?获取 URI 的路径始终为空?
【发布时间】:2017-05-23 22:27:56
【问题描述】:

所以我正在使用改造将图像上传到我们的服务器,并使用图库选择器来选择图像。我正在尝试获取图像的路径,因为 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();
        }
    }
}

【问题讨论】:

    标签: android file uri retrofit android-gallery


    【解决方案1】:

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

    假设“画廊选择器”是指ACTION_GET_CONTENTACTION_PICK,则没有路径,因为Uri 不是文件。

    我几乎看过所有关于这个主题的 stackoverflow 文章

    不,你没有。具体来说,你还没有读过我投稿的几十篇文章,例如this onethis onethis onethis onethis onethis onethis onethis onethis onethis onethis onethis onethis one。这些都是 2017 年的。

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

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

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

    【讨论】:

    • 我正在使用 ACTION_GET_CONTENT,我也确实经历了你的其他堆栈溢出,但我仍然不明白使用 inputstream 将如何为我提供照片的路径。我需要路径才能通过改造上传。
    • @thatsnifty: "我还是不明白如何使用 inputstream 来给我照片的路径" -- 那是因为没有照片的路径,至少在您复制该内容之前,正如我在答案的最后一段中所述。是什么让您认为照片将始终是本地文件系统上的文件?操作是ACTION_GET_CONTENT,而不是ACTION_GET_FILE。如果您无法处理ACTION_GET_CONTENT 可能返回非文件的事实,请停止使用ACTION_GET_CONTENT
    • 好的,所以花了几天时间,但我终于明白了!我最终使用了 ACTION_PICK、inputstream 和 contentresolver。你的回答真的很有帮助!无论谁遇到同样的问题,这也是一个很好的例子:[链接]inducesmile.com/android/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 2011-12-31
    • 2022-11-26
    • 2018-03-20
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多