0

我想通过应用程序在 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 文件)。

截图目录结构:

在此处输入图像描述

4

0 回答 0