You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 10:05:21