Mediastore удалить запись видео только не файл - PullRequest
0 голосов
/ 20 апреля 2019

Я использую 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) }
    }
}
...