要解决Android 11(SDK 30)自定义文件选择器库的问题,可以按照以下步骤进行:
dependencies {
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'androidx.core:core-ktx:1.6.0'
implementation 'androidx.documentfile:documentfile:1.0.1'
}
FilePicker.kt
,并添加以下代码:import android.app.Activity
import android.content.Intent
import android.net.Uri
import android.os.Build
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.documentfile.provider.DocumentFile
class FilePicker(private val activity: Activity) {
private val filePickerLauncher: ActivityResultLauncher
init {
filePickerLauncher = activity.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == AppCompatActivity.RESULT_OK) {
result.data?.data?.let { uri ->
val documentFile = DocumentFile.fromSingleUri(activity, uri)
// 处理选中的文件
handleSelectedFile(documentFile)
}
}
}
}
fun pickFile() {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
intent.addCategory(Intent.CATEGORY_OPENABLE)
intent.type = "*/*"
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false)
intent.putExtra(Intent.EXTRA_MIME_TYPES, arrayOf("*/*"))
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true)
}
filePickerLauncher.launch(intent)
}
private fun handleSelectedFile(documentFile: DocumentFile?) {
// 在这里处理选中的文件
documentFile?.let { file ->
val fileName = file.name
val fileUri = file.uri
// 处理文件的Uri和名称
}
}
}
FilePicker
类来选择文件。例如,在MainActivity.kt
中添加以下代码:import android.Manifest
import android.content.pm.PackageManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.core.app.ActivityCompat
class MainActivity : AppCompatActivity() {
private val filePicker: FilePicker by lazy { FilePicker(this) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 检查并请求读取外部存储权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), 1)
}
// 点击按钮选择文件
findViewById
activity_main.xml
中添加一个按钮,例如:
现在,当用户点击“选择文件”按钮时,将启动自定义文件选择器,并在选择文件后执行handleSelectedFile()
方法来处理选中的文件。