如何从 URI 获取完整的文件路径

新手上路,请多包涵

我想从 URI 获取完整的文件路径。 URI 不是图像,而是音乐文件,但如果我像 MediaStore 解决方案那样做,如果应用程序用户选择例如 Astro 作为浏览器,而不是音乐播放器,它将不起作用。我该如何解决这个问题?

原文由 tim687 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

利用:

 String path = yourAndroidURI.uri.getPath() // "/mnt/sdcard/FileName.mp3"
File file = new File(new URI(path));

或者

String path = yourAndroidURI.uri.toString() // "file:///mnt/sdcard/FileName.mp3"
File file = new File(new URI(path));

原文由 Dmytro Danylyk 发布,翻译遵循 CC BY-SA 3.0 许可协议

由于此处的大多数解决方案不适用于 API 30+,其中 Environment.getExternalStorageDirectory() 已弃用,或者解析作为系统内部信息的文档 id,因此值得一问:您真的 需要 路径吗?

如果您只需要一种访问项目数据的方法,那么在所有平台上都有一种直接的方法:

 fun getInputStream(context: Context, uri: Uri): InputStream? {
    return context.contentResolver.openInputStream(uri)
}

如果需要显示名称(如 test.jpg ),也可以使用内容解析器:

 fun getDisplayName(context: Context, uri: Uri): String? {
    context.contentResolver.query(uri, arrayOf(OpenableColumns.DISPLAY_NAME), null, null, null)
        .use {
            if (it == null || !it.moveToFirst()) {
                return null
            }

            val columnIndex = it.getColumnIndex(OpenableColumns.DISPLAY_NAME)
            if (columnIndex == -1) {
                return null
            }

            return it.getString(columnIndex)
        }
}

只是想我会提到它,因为它会帮助我。

对于 Java:

 InputStream getInputStream(Context context, Uri uri)
{
    return context.getContentResolver().openInputStream(uri)
}

对于那些需要知道流长度的人:

 InputStream is = getInputStream(context, uri);
int length = is.available();

原文由 Sebastian 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题