在 Android 中,您应该严格指定要查看的文件夹的路径。
起点可以是Environment.getExternalStorageDirectory() - 主要的共享/外部存储目录。
然后您可以使用方法dir.listFiles() 获取文件列表。如果您需要以某种方式过滤它(例如只有目录),您可以添加一个 FileFilter:dir.listFiles(FileFilter { it.isDirectory })
另一个重要的事情是您必须具有读取外部存储的权限。因此,您应该添加到您的 Manifest.xml:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
从 Android 6.0 开始,您应该另外请求此权限:
Fragment.requestPermissions(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), READ_STORAGE_RC)
并在 Fragment.onRequestPermissionsResult 方法中处理结果。
我创建了如何一起使用它的示例。
您需要创建活动并在其中添加一个片段:
目录列表片段
class DirListFragment : Fragment() {
private val adapter by lazy { DirListAdapter { dir = it } }
private var dir: File by observable(Environment.getExternalStorageDirectory()) { _, _, _ -> onNewParent() }
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View =
inflater.inflate(R.layout.fragment_dir_list, container, false)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
checkPermissionReadStorage(requireActivity())
list.adapter = adapter
up.setOnClickListener { dir = dir.parentFile }
onNewParent()
}
private fun onNewParent() {
parent.text = dir.absolutePath
adapter.items = dir.listFiles(FileFilter { it.isDirectory })?.toList() ?: emptyList()
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == READ_STORAGE_RC && permissionGranted(requireActivity())) onNewParent()
}
private fun checkPermissionReadStorage(activity: Activity) {
if (!permissionGranted(activity)) {
requestPermissions(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), READ_STORAGE_RC)
}
}
private fun permissionGranted(activity: Activity) =
ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
private companion object {
const val READ_STORAGE_RC = 123
}
}
DirListAdapter
class DirListAdapter(private val clickListener: (file: File) -> Unit) :
RecyclerView.Adapter<DirListAdapter.ViewHolder>() {
var items by Delegates.observable(listOf<File>()) { _, _, _ -> notifyDataSetChanged() }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder(parent)
override fun getItemCount() = items.size
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.caption.text = items[position].name
holder.caption.setOnClickListener { clickListener(items[position]) }
}
class ViewHolder(parent: ViewGroup) : RecyclerView.ViewHolder
(LayoutInflater.from(parent.context).inflate(android.R.layout.simple_list_item_1, parent, false)) {
val caption: TextView = itemView.findViewById(android.R.id.text1)
}
}
fragment_dir_list.xml
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto"
android:padding="8dp"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/up"
android:text="UP"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/parent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/up"
android:layout_marginBottom="8dp"
android:singleLine="true"
android:ellipsize="start"
tools:text="Parent dir"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/list"
android:layout_below="@id/parent"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"/>
</RelativeLayout>
希望这将有助于理解基础。