Mediastore仅删除视频条目,而不删除文件

时间:2019-04-20 18:25:10

标签: java android kotlin mediastore android-mediascanner

每当我的应用程序完成下载视频文件或在设置中选择的选项时,我都在使用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) }
    }
}

0 个答案:

没有答案