每当我的应用程序完成下载视频文件或在设置中选择的选项时,我都在使用MediaScanner从路径添加文件,虽然添加效果很好,但我没有找到有效的解决方案来仅从MeidaStore删除条目,同时保持该文件,我确实在目录中创建了 .nomedia 文件,但这些文件仍在Gallary中可见。
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) }
}
}