一、使用Intent
Android提供了一个标准的文件选择器,我们可以使用Intent来实现文件选择功能。我们可以通过调用ACTION_GET_CONTENT或ACTION_OPEN_DOCUMENT Intent来打开文件选择器。ACTION_GET_CONTENT 引导用户选择任何类型的文件(例如,图片、音频、视频等),该Intent会返回一个指向所选文件的Uri。ACTION_OPEN_DOCUMENT 将引导用户选择文档,并确保应用程序对其读取和写入权限正确。这个Intent会返回一个指向所选文件的Uri。
val intent = Intent(Intent.ACTION_GET_CONTENT).apply {
type = "*/*"
}
startActivityForResult(intent, REQUEST_CODE)
在Activity的onActivityResult方法中获取Uri:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) {
val selectedFile = data?.data
// TODO: Do something with the selected file
}
}
二、使用第三方库
除了使用Android提供的Intent,我们还可以使用第三方库来实现文件选择功能。其中比较好用和流行的库是Material File Picker和FilePicker。这两个库集成简单,支持自定义UI,而且能够满足大多数的需求。
dependencies {
implementation 'com.nbsp:library:filepicker:2.2.0'
}
val filePicker = FilePicker(this)
filePicker.setFileType("any")
filePicker.setMultiSelect(false)
filePicker.setFileListener { file ->
// TODO: Do something with the selected file
}
filePicker.show()
三、自定义文件选择器
如果需要实现高度自定义的文件选择器,我们可以自己编写代码来实现。通常这种自定义的文件选择器可以实现复杂的需求,但是需要投入一定的工作量。
我们可以通过使用RecyclerView和ContentProvider来快速构建自己的文件选择器。下面是一个非常简单的实现示例:
class CustomFilePickerActivity : AppCompatActivity() {
private lateinit var recyclerView: RecyclerView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_custom_file_picker)
recyclerView = findViewById(R.id.recyclerView)
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = FileAdapter(getFiles())
// TODO: Handle item click events
}
private fun getFiles(): List
{
return Environment.getExternalStorageDirectory().listFiles().toList()
}
private inner class FileAdapter(private val files: List
) : RecyclerView.Adapter
() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FileViewHolder {
val view = layoutInflater.inflate(android.R.layout.simple_list_item_1, parent, false)
return FileViewHolder(view)
}
override fun onBindViewHolder(holder: FileViewHolder, position: Int) {
val file = files[position]
holder.bind(file.name)
}
override fun getItemCount() = files.size
}
private inner class FileViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(name: String) {
val text: TextView = itemView.findViewById(android.R.id.text1)
text.text = name
}
}
}
以上示例展示了如何通过RecyclerView和ContentProvider来实现一个非常简单的文件选择器。