首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin -在Android 10+上的Environment.getExternalStorageDirectory().getAbsolutePath()中创建目录

Kotlin -在Android 10+上的Environment.getExternalStorageDirectory().getAbsolutePath()中创建目录
EN

Stack Overflow用户
提问于 2021-06-28 20:17:54
回答 1查看 113关注 0票数 0

以前有人问过这个问题,但我找不到一个适合我的答案。

我有一个应用程序,在第一次运行时,我需要在这些目录中创建一些目录和文件。

到目前为止,我所做的在Android5到9上运行得很好。令我惊讶的是,它在Android 10+上不起作用,因为getExternalStorageDirectory()已经被弃用了。

这就是我到目前为止所做的:

代码语言:javascript
复制
if(isFirstRun)
{
    Log.i("MyApp","ServerWizardActivity > createNecesaryFoldersFiles > isFirstRun")

    val absoluteExternalStorageDirectory = Environment.getExternalStorageDirectory().getAbsolutePath()
    val appDirectory = File("${absoluteExternalStorageDirectory}/MyApp/")
    val picturesDirectory = File("${absoluteExternalStorageDirectory}/Pictures/")

    val fullPath: String? = "${absoluteExternalStorageDirectory}/MyApp/${jsonFileName}"
    var dataFile = File(fullPath)

    if (!appDirectory .exists())
    {
        Log.i("MyApp","ServerWizardActivity > createNecesaryFoldersFiles > appDirectory")

        appDirectory .mkdir()
    }

    if (!picturesDirectory.exists())
    {
        Log.i("MyApp","ServerWizardActivity > createNecesaryFoldersFiles > picturesDirectory")

        picturesDirectory.mkdir()
    }

    if(!dataFile.exists())
    {
        Log.i("MyApp","ServerWizardActivity > createNecesaryFoldersFiles > dataFile")

        dataFile.createNewFile()
    }
}
else
{
    Log.i("MyApp","ServerWizardActivity > createNecesaryFoldersFiles > isNotFirstRun")
}

到目前一切尚好。然而,我需要直接在设备存储上创建一个目录,与DCIM,图片,文档和下载在同一级别,以便我可以使它与安卓5-9版本和应用程序的iOS版本一致。

我尝试了下面的Android 10+代码,它可以工作,但我只能在环境中的一个目录中创建一个目录(在本例中,是图片目录)。有什么方法可以绕过吗?我不想因为这个而改变整个应用程序结构。

代码语言:javascript
复制
if(isFirstRun)
    {
        val resolver = contentResolver
        val contentValues = ContentValues()
        contentValues.put(
            MediaStore.MediaColumns.RELATIVE_PATH,
            Environment.DIRECTORY_PICTURES + "/MyApp"
        )
        val path = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues).toString()
        val folder = File(path)
        val isCreated = folder.exists()

        if (!isCreated)
        {
            folder.mkdirs()
        }
    }

哦,到目前为止,我的Android清单文件中有以下内容:

代码语言:javascript
复制
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

<application
    android:requestLegacyExternalStorage="true"
</application>
EN

回答 1

Stack Overflow用户

发布于 2021-06-28 20:28:54

尝试使用以下代码,它将帮助您在文档目录中创建一个测试目录。

代码语言:javascript
复制
//Make sure don't forget to ask runtime permission of read/write file
private fun writeFile(fileData: String, fileName: String) {
val dir = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    File(
        Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)
            .toString() + "/" + "test"
    )
} else {
    File(
        Environment.getExternalStorageDirectory()
            .toString() + "/${Environment.DIRECTORY_DOCUMENTS}/" + "test"
    )
}
dir.apply {
    if (!this.exists()) this.mkdir()
    File(this, "$fileName.txt").apply {
        if (!this.exists()) this.createNewFile()
        FileOutputStream(this).apply {
            write(fileData.toByteArray())
            close()
        }
    }
}
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68163238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档