Я использую MediaScanner для добавления файлов по пути всякий раз, когда мое приложение заканчивает загрузку видеофайла или параметр, выбранный в настройках, при добавлении работает отлично, но я не нашел рабочего решения, чтобы удалить запись только из MeidaStore, сохраняяфайл, я создаю .nomedia файл в каталоге, но файлы все еще видны в галлерее.
contentResolver.delete ()
context.contentResolver.delete(uri, null, null)
используя его, удаляет запись, но также удаляет файл, который я хочу сохранить.
здесь код для добавления файлов.
class MediaScanner {
fun trigger(ctx: Context, path: String, callback: (isExecuted: Boolean) -> Unit) {
runCatching {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
val files = FileUtils().listFiles(File(path), null, true)
val mList: MutableList<String> = arrayListOf()
files.forEach {
mList.add(it.absolutePath)
}
MediaScannerConnection.scanFile(ctx, mList.toTypedArray(), null, null)
} else {
ctx.sendBroadcast(Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://${File(path).absolutePath}")))
}
}.onSuccess { callback(true) }.onFailure { callback(false) }
}
}
РЕДАКТИРОВАТЬ :я использую хакерский код, чтобы contentResolver.delete () тоже не удалял файл, переименовывая файл перед вызовом delete и восстанавливая имя, хотя это не очень хороший способ для большого количества файлов, надеюсь, есть лучший способ, сейчас я собираюсь использовать этот метод, и я буду продолжать искать лучшее решение.
class MediaScanner {
fun trigger(ctx: Context, path: String, remove: Boolean, callback: (isExecuted: Boolean) -> Unit) {
runCatching {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
val files = FileUtils().listFiles(File(path), null, true)
val arr: MutableList<String> = arrayListOf()
files.forEach {
arr.add(it.absolutePath)
}
if(remove) {
MediaScannerConnection.scanFile(ctx, arr.toTypedArray(), null) { p, u ->
val file = File(p)
val restore = File("$p.keep")
if(file.exists() && file.isFile) {
if(file.renameTo(restore)) {
ctx.contentResolver.delete(u, null, null)
}
} else {
ctx.contentResolver.delete(u, null, null)
}
if(restore.exists()) {
restore.renameTo(file)
}
}
} else {
MediaScannerConnection.scanFile(ctx, arr.toTypedArray(), null, null)
}
} else {
ctx.sendBroadcast(Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://${File(path).absolutePath}")))
}
}.onSuccess { callback(true) }.onFailure { callback(false) }
}
}