我想从 URI 获取完整的文件路径。 URI 不是图像,而是音乐文件,但如果我像 MediaStore 解决方案那样做,如果应用程序用户选择例如 Astro 作为浏览器,而不是音乐播放器,它将不起作用。我该如何解决这个问题?
原文由 tim687 发布,翻译遵循 CC BY-SA 4.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 许可协议
2 回答1.3k 阅读✓ 已解决
2 回答2.6k 阅读
1 回答2.1k 阅读
1 回答1.1k 阅读
2 回答1.7k 阅读
1 回答1.3k 阅读
1.3k 阅读
利用:
或者