Android获取文件名的方法

Seb*_*iuk 1 android kotlin

所以基本上我有这个应用程序,我可以在其中打开文件选择器,并且我想将文件名放入特定的框中。

但结果我得到这个字符串文档:39

我想使用的文件是 pdf,它被称为TestBook,这就是我想要显示的内容

我是这样启动文件选择器的:

fun showFileChooser(activity: Activity)
{
        val filesIntent = Intent(Intent.ACTION_GET_CONTENT, MediaStore.Downloads.EXTERNAL_CONTENT_URI)

        activity.startActivityForResult(filesIntent, PICK_PDF_REQUEST_CODE)
}
Run Code Online (Sandbox Code Playgroud)

然后单击按钮

R.id.iv_add_file ->{
          if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)  == PackageManager.PERMISSION_GRANTED)
          {
            showFileChooser(this@AddBookActivity)
          }
          else
          {
            ActivityCompat.requestPermissions(this,arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
                            Constants.READ_STORAGE_PERMISSION_CODE)
          }
}
Run Code Online (Sandbox Code Playgroud)

和最后一个 onActivityResult

if (requestCode == Constants.PICK_PDF_REQUEST_CODE)
{
   if (data != null)
   {
      mSelectedFileUri = data.data!!

      val filename = File(mSelectedFileUri!!.path).name
      et_book_file.setText(filename)

   }
}
Run Code Online (Sandbox Code Playgroud)

Et_book_file 是一个 EditText,正如我在开头提到的,它显示字符串document:39

我尝试使用 jpg 等其他文件,但它只显示字符串image:40

对此有什么明显的解决方案吗?任何帮助将不胜感激。

Pra*_*een 7

您无法直接从内容 Uris 访问文件名,您必须使用它contentResolver来获取文件名。使用此函数从 Uri 中获取文件名

fun getFileNameFromUri(context: Context, uri: Uri): String? {
    val fileName: String?
    val cursor = context.contentResolver.query(uri, null, null, null, null)
    cursor?.moveToFirst()
    fileName = cursor?.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME))
    cursor?.close()
    return fileName
}
Run Code Online (Sandbox Code Playgroud)

现在您可以调用getFileNameFromUri方法来获取文件名

mSelectedFileUri?.let { uri ->
    val filename = getFileNameFromUri(this, uri)
    et_book_file.setText(filename)
}
Run Code Online (Sandbox Code Playgroud)