У меня есть личная папка, содержащая вложенные папки с изображениями и видео, мне нужно скопировать эту папку в Environment.DIRECTORY_PICTURES для общего доступа.
val fodler = getExternalFilesDir(Folder) // содержит подпапки с изображениями и видео
val DESTINATION = Environment.getExternalStorageDirectory().toString() + File.separator + Environment.DIRECTORY_PICTURES
copyFileOrDirectory(fodler.absolutePath, DESTINATION)
private fun copyFileOrDirectory(srcDir: String, dstDir: String) {
try {
val src: File = File(srcDir)
val dst: File = File(dstDir, src.name)
if (src.isDirectory) {
val files = src.list()
val filesLength = files.size
for (i in 0 until filesLength) {
val src1 = File(src, files[i]).path
val dst1 = dst.path
copyFileOrDirectory(src1, dst1)
}
} else {
copyFile(src, dst)
}
} catch (e: Exception) {
e.printStackTrace()
}
}
private fun copyFile(sourceFile: File, destFile: File) {
if (!destFile.getParentFile().exists()) destFile.getParentFile().mkdirs()
if (!destFile.exists()) {
destFile.createNewFile()
}
var source: FileChannel? = null
var destination: FileChannel? = null
try {
source = FileInputStream(sourceFile).getChannel()
destination = FileOutputStream(destFile).getChannel()
destination.transferFrom(source, 0, source.size())
} finally {
if (source != null) {
source.close()
}
if (destination != null) {
destination.close()
}
}
}
теперь я получаю папку с файлами (со всем ее содержимым) в каталоге изображений, видимую всем и общедоступную, именно то, что мне нужно.
Это решение работает для уровней API 23-29 (android:requestLegacyExternalStorage=true для уровня API 29 в манифесте), но оно не работает на уровне API 30, поскольку getExternalStorageDirectory() устарело, а android:requestLegacyExternalStorage=true в манифесте не работает для апи уровня 30
какое будет решение для уровня API 30?
targetSdkVersion
ниже 30. Однако Play Store потребует 30 позже в этом году. какое будет решение для уровня API 30? -- либо используйтеACTION_OPEN_DOCUMENT_TREE
и позвольте пользователю выбирать, куда копировать содержимое, либо используйтеMediaStore
. - person CommonsWare   schedule 11.04.2021