Android如何查找设备中所有重复文件并在RecyclerView展示
问题:无法识别设备中的重复文件,无法完成RecyclerView展示重复列表功能
我需要实现查找设备中所有重复数据文件并在RecyclerView中展示重复文件列表的功能,目前仅能获取设备中的所有文件,但无法识别重复文件。以下是我的代码:
数据类定义
// 创建Duplicate类 class Duplicate( var duplicateFiles: ArrayList<DuplicateFile> ) : Serializable // 创建DuplicateFile类 class DuplicateFile( var file: File, var isSelect: Boolean )
MainActivity代码
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 不知道下面方法的括号里该传什么参数,暂时写了??? getDuplicateFiles(???) } fun getDuplicateFiles(files: List<File?>): List<Duplicate?>? { val hashmap: HashMap<String, Duplicate> = HashMap() val duplicateHashSet: HashMap<String, Duplicate> = HashMap() for (file in files) { val md5: String = getFileMD5ToString(file) if (hashmap.containsKey(md5)) { val original = hashmap[md5] if (duplicateHashSet.containsKey(md5)) { var fileList= arrayListOf<DuplicateFile>() if (original != null) { fileList = original.duplicateFiles fileList.add( DuplicateFile(original.duplicateFiles[0].file, false) ) } else { fileList = ArrayList() fileList.add(DuplicateFile(file!!, false)) } } else { val fileList= arrayListOf<DuplicateFile>() if (original!!.duplicateFiles == null) { original.duplicateFiles = ArrayList() } fileList.add(DuplicateFile(original.duplicateFiles[0].file, false)) fileList.add(DuplicateFile(file!!, false)) duplicateHashSet[md5] = Duplicate(fileList) } } else { val fileList= arrayListOf<DuplicateFile>() fileList.add(DuplicateFile(file!!, false)) hashmap[md5] = Duplicate(fileList) } } var list: List<Duplicate?>? = null if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { list = ArrayList(duplicateHashSet.values) } Log.d("kkkkaa",list?.size.toString()) return list } fun getAllFiles(context: Context): List<File>? { return try { val files: MutableList<File> = ArrayList() val pdf = MimeTypeMap.getSingleton().getMimeTypeFromExtension("pdf") val doc = MimeTypeMap.getSingleton().getMimeTypeFromExtension("doc") val docx = MimeTypeMap.getSingleton().getMimeTypeFromExtension("docx") val xlsx = MimeTypeMap.getSingleton().getMimeTypeFromExtension("xlsx") val txt = MimeTypeMap.getSingleton().getMimeTypeFromExtension("txt") val ppt = MimeTypeMap.getSingleton().getMimeTypeFromExtension("ppt") val pptx = MimeTypeMap.getSingleton().getMimeTypeFromExtension("pptx") val png = MimeTypeMap.getSingleton().getMimeTypeFromExtension("png") val jpg = MimeTypeMap.getSingleton().getMimeTypeFromExtension("jpg") val jpeg = MimeTypeMap.getSingleton().getMimeTypeFromExtension("jpeg") val gif = MimeTypeMap.getSingleton().getMimeTypeFromExtension("gif") val mp4 = MimeTypeMap.getSingleton().getMimeTypeFromExtension("mp4") val mkv = MimeTypeMap.getSingleton().getMimeTypeFromExtension("mkv") val avi = MimeTypeMap.getSingleton().getMimeTypeFromExtension("avi") val apk = MimeTypeMap.getSingleton().getMimeTypeFromExtension("apk") val mp3 = MimeTypeMap.getSingleton().getMimeTypeFromExtension("mp3") val table = MediaStore.Files.getContentUri("external") val data = arrayOf(MediaStore.Files.FileColumns.DATA) val where = (MediaStore.Files.FileColumns.MIME_TYPE + "=?" + " OR " + MediaStore.Files.FileColumns.MIME_TYPE + "=?" + " OR " + MediaStore.Files.FileColumns.MIME_TYPE + "=?" + " OR " + MediaStore.Files.FileColumns.MIME_TYPE + "=?" + " OR " + MediaStore.Files.FileColumns.MIME_TYPE + "=?" + " OR " + MediaStore.Files.FileColumns.MIME_TYPE + "=?" + " OR " + MediaStore.Files.FileColumns.MIME_TYPE + "=?" + " OR " + MediaStore.Files.FileColumns.MIME_TYPE + "=?" + " OR " + MediaStore.Files.FileColumns.MIME_TYPE + "=?" + " OR " + MediaStore.Files.FileColumns.MIME_TYPE + "=?" + " OR " + MediaStore.Files.FileColumns.MIME_TYPE + "=?" + " OR " + MediaStore.Files.FileColumns.MIME_TYPE + "=?" + " OR " + MediaStore.Files.FileColumns.MIME_TYPE + "=?" + " OR " + MediaStore.Files.FileColumns.MIME_TYPE + "=?" + " OR " + MediaStore.Files.FileColumns.MIME_TYPE + "=?" + " OR " + MediaStore.Files.FileColumns.MIME_TYPE + "=?") val args = arrayOf( pdf, doc, docx, xlsx, txt, ppt, pptx, png, jpg, jpeg, gif, mp4, mkv, avi, apk, mp3 ) val cursor = context.contentResolver.query(table, data, where, args, null) if (cursor != null) { while (cursor.moveToNext()) { val file = File(cursor.getString(cursor.getColumnIndex(data[0]))) files.add(file) } cursor.close() } files } catch (e: Exception) { ArrayList() } } }
遇到的问题
- 不清楚
getDuplicateFiles方法的参数应该传入什么值 - 当前的重复文件识别逻辑无法正常工作,无法获取到重复文件列表
内容的提问来源于stack exchange,提问作者Xuân Đức Nguyễn
相关产品推荐
相关产品推荐

