【发布时间】:2020-04-20 07:35:57
【问题描述】:
问题
我正在使用此代码从设备中选择单个文件(主要是下载文件夹)。
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
intent.type = "*/*"
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false)
intent.action = Intent.ACTION_GET_CONTENT
startActivityForResult(Intent.createChooser(intent,getString(R.string.field_import_btn)), requestCode)
它运行良好,我得到了 Uri,我可以通过 contentResolver.openInputStream(uri) 读取文件
当我实际上需要知道这是什么类型的文件时,就会出现问题。 换句话说,我需要知道它的扩展名。
为此我可以轻松使用:
String type = resolver.getType(uri);
String extention = MimeTypeMap.getSingleton().getExtensionFromMimeType(type);
但问题是:如果文件的格式至少稍微少一点application/octet-stream
作为type。
示例:SHP 又名 Esri 形状文件。
其他观察 在诺基亚 8 Android Pie(28 api 级别)中时
我得到的实际 uri 是:
content://com.android.providers.downloads.documents/document/1470
在相同类型文件 (Shp) 的 Android 10 模拟器中,我得到:
content://com.android.providers.downloads.documents/document/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2FRO20.shp
我可以用它自己来获得最后一部分“.shp”
实际问题 所以主要我有两个问题:
- 有没有办法从 Uri 获取准确的文件扩展名(没有来回的 mime 类型转换)?
- 我能说从 29 api 级别开始我可以从 uri 解析文件扩展名的可靠性有多高?
【问题讨论】:
-
您可以在内容解析器中查询 DISPLAY_NAME。获得显示名称后,提取扩展名。
-
你的意图很混乱,使用两个动作。
-
哈哈是的。我同时尝试了几个选项。 @blackapps 我会试试的。
-
@blackapps 是的,这是有效的。也许你知道我在哪里可以获得 contentResolver 可能查询的完整文档?
-
您可以阅读带有类似标签的 stackiverflow 页面或带有标签的 mediastore。
标签: android uri scoped-storage