Android 11 文件选择

2,129 阅读1分钟

新版startActivityForResult过期了,采用新的启动方式,intent设置要选择的文件mime。

file_max_length是最大文件大小

private lateinit var pdfSelectLauncher: ActivityResultLauncher<Intent>
pdfSelectLauncher =
    registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        result?.let {
            if (it.resultCode == Activity.RESULT_OK) {
                it.data?.let { data ->
                    val fileUri: Uri? = data.data
                    fileUri?.let {
                
                        val path = PathUtils.getExternalAppDocumentsPath()
                        var orgFile = UriUtils.uri2File(it)
                       
                        if (orgFile.length() > file_max_length) {
                            showNormalToast(getString(R.string.file_size_error), true)
                            return@let
                        }

                        val fileName = orgFile.name

                        val targetFile = File(path, fileName)
                        if (!targetFile.exists()) {
                            val parcelFileDescriptor =
                                requireContext().contentResolver.openFileDescriptor(
                                    it,
                                    "rw"
                                )
                            val fileDescriptor = parcelFileDescriptor!!.fileDescriptor

                            val fileInputStream = FileInputStream(fileDescriptor)
                            targetFile.createNewFile()
                            targetFile.writeBytes(fileInputStream.readBytes())
                            fileInputStream.close()
                        }
                      
                        //处理文件
                    }
                }
            }
        }
    }

这里使用官方推荐选择文件的方式

val intent = Intent(Intent.ACTION_OPEN_CONTENT).apply {
    type = "application/pdf"
    flags =
        Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
    addCategory(Intent.CATEGORY_OPENABLE)
}
if (intent.resolveActivity(requireActivity().packageManager) != null) {
    pdfSelectLauncher.launch(intent)
}