1

问题

我正在使用此代码从设备中选择单个文件(主要是下载文件夹)。

        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-streamtype.

示例:SHP又名 Esri Shape 文件。

在诺基亚 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 它自己解析文件扩展名而不会失败?
4

1 回答 1

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())
    }
}
于 2020-04-20T17:52:03.310 回答