我想通过应用程序在 sdcard 上创建一个目录/文件夹,并且应用程序可以读写该文件夹内的文件。
MANAGE_EXTERNAL_STORAGE需要在 Play 商店中进行人工审核,这就是为什么我需要没有此权限的 Android 11(API:30)解决方案。
我知道我们可以在 App 内存中创建一个文件夹并使用此文件夹来读取/写入不需要 Android 11 任何许可的文件。但在我的情况下,文件夹需要在 sdcard 上创建(“/storage/emulated/0/my_app_directory1/” )并且此文件夹需要读/写权限。如果写权限是不可能的,那么至少读权限。
允许:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28"/>
示例: Telegram,Whatsapp 在 SD 卡上创建一个文件夹,名称分别为 'Telegram','WhatsApp',分别直接在 sdcard 上,并将所有应用程序相关文件存储在此文件夹中。
有一个选项授予对目录内容的访问权限
我试过了,但无法访问文件夹中的所有文件。
以下代码有时会列出文件夹(screenshort 中的 dir2).png 和 .jpg 文件。有时只列出文件夹。
val mapFolder = File("/storage/emulated/0/my_app_directory1/")
checkDirectory(mapFolder)?.also {
val dirCreated = mapFolder.mkdir()
if (dirCreated){
Log.d(TAG, "created: ${mapFolder.absolutePath} ")
} else{
Log.d(TAG, "fail to create: ${mapFolder.absolutePath} ")
}
checkDirectory(mapFolder)
}
private fun checkDirectory(mapFolder:File):Boolean{
Log.d(TAG, "Name: $mapFolder")
var retrunValue = false
if (mapFolder == null) {
Log.d(TAG, "$mapFolder folder null")
} else if (mapFolder.exists()){
Log.d(TAG, "$mapFolder folder exists1:${mapFolder.exists()}")
if (mapFolder.isDirectory){
Log.d(TAG, "$mapFolder folder exists and is a directory}")
Log.d(TAG, "List:: ${mapFolder.list().size}")
mapFolder.listFiles().forEach {
Log.d(TAG, "[${it.absolutePath}]")
}
mapFolder.list().forEach {
Log.d(TAG, "[[$it]]")
}
retrunValue = true
} else {
Log.d(TAG, "$mapFolder folder exists and is not a directory}")
}
} else if (!mapFolder.exists()){
Log.d(TAG, "$mapFolder folder exists2:${mapFolder.exists()}")
}
return retrunValue
}
输出:
MainActivity: Name: /storage/emulated/0/my_app_directory1
MainActivity: /storage/emulated/0/my_app_directory1 folder exists1:true
MainActivity: /storage/emulated/0/my_app_directory1 folder exists and is a directory}
MainActivity: List:: 1
MainActivity: [/storage/emulated/0/my_app_directory1/dir2]
MainActivity: [[dir2]]
我的应用程序的要求:
-> 第一次检查时,如果文件夹(比如:my_app_directory1)不在 sdcard 上,那么它会创建。“/storage/emulated/0/my_app_directory1/”
-> 第二次之后,它使用此文件夹读取/写入自定义文件(不是图像、视频、音频、pdf 文件)。
截图目录结构: