【问题标题】:Android 10 File info from scoped storage (get file extension from Uri)来自范围存储的 Android 10 文件信息(从 Uri 获取文件扩展名)
【发布时间】: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”

实际问题 所以主要我有两个问题:

  1. 有没有办法从 Uri 获取准确的文件扩展名(没有来回的 mime 类型转换)?
  2. 我能说从 29 api 级别开始我可以从 uri 解析文件扩展名的可靠性有多高?

【问题讨论】:

  • 您可以在内容解析器中查询 DISPLAY_NAME。获得显示名称后,提取扩展名。
  • 你的意图很混乱,使用两个动作。
  • 哈哈是的。我同时尝试了几个选项。 @blackapps 我会试试的。
  • @blackapps 是的,这是有效的。也许你知道我在哪里可以获得 contentResolver 可能查询的完整文档?
  • 您可以阅读带有类似标签的 stackiverflow 页面或带有标签的 mediastore。

标签: android uri scoped-storage


【解决方案1】:

尝试下面的代码来获取所选文件的 MIME 类型。它将返回为 pdf jpeg png` 传递用户选择文件的uri

  private fun getFileMimeType(uri: Uri): String? {
    return if (uri.scheme == ContentResolver.SCHEME_CONTENT) {
        val mime = MimeTypeMap.getSingleton()
        mime.getExtensionFromMimeType(context.contentResolver.getType(uri))
    } else {
        MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(File(uri.path)).toString())
    }
}

【讨论】:

  • 您的解决方案的第一部分永远不会与未知扩展一起使用(它们被标识为 application/octet-stream) 您能解释一下第二部分吗?我知道MimeTypeMap.getFileExtensionFromUrl 不适用于我第一次展示的 Uri,但是所有看起来多余的构造函数是怎么回事?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-29
  • 2013-07-21
  • 2018-06-22
  • 2019-05-21
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
相关资源
最近更新 更多