以前有人问过这个问题,但我找不到一个适合我的答案。
我有一个应用程序,在第一次运行时,我需要在这些目录中创建一些目录和文件。
到目前为止,我所做的在Android5到9上运行得很好。令我惊讶的是,它在Android 10+上不起作用,因为getExternalStorageDirectory()已经被弃用了。
这就是我到目前为止所做的:
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+代码,它可以工作,但我只能在环境中的一个目录中创建一个目录(在本例中,是图片目录)。有什么方法可以绕过吗?我不想因为这个而改变整个应用程序结构。
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清单文件中有以下内容:
<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>发布于 2021-06-28 20:28:54
尝试使用以下代码,它将帮助您在文档目录中创建一个测试目录。
//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()
}
}
}
}https://stackoverflow.com/questions/68163238
复制相似问题