From 89ec1b8f5c93d602b3ac52ea7a20ced737748f87 Mon Sep 17 00:00:00 2001 From: ocean <503259349@qq.com> Date: Tue, 28 Oct 2025 11:46:49 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=89=AB=E6=8F=8F=E6=97=B6?= =?UTF-8?q?=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../all/pdfreader/pro/app/util/FileUtils.kt | 63 +++++++++++-------- 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/com/all/pdfreader/pro/app/util/FileUtils.kt b/app/src/main/java/com/all/pdfreader/pro/app/util/FileUtils.kt index b72eb6c..82225ad 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/util/FileUtils.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/util/FileUtils.kt @@ -4,6 +4,7 @@ import android.annotation.SuppressLint import android.content.Context import android.graphics.pdf.PdfRenderer import android.net.Uri +import android.os.Environment import android.os.ParcelFileDescriptor import android.provider.MediaStore import android.provider.OpenableColumns @@ -37,23 +38,34 @@ object FileUtils { if (StoragePermissionHelper.hasBasicStoragePermission(context)) { Log.d("ocean", "📂 扫描外部存储目录...") // 扫描常见的PDF存储目录 - val externalStorage = android.os.Environment.getExternalStorageDirectory() + val externalStorage = Environment.getExternalStorageDirectory() scanCommonDirectories(externalStorage, pdfFiles) // 扫描Download目录 - android.os.Environment.getExternalStoragePublicDirectory(android.os.Environment.DIRECTORY_DOWNLOADS) + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) ?.let { scanDirectory(it, pdfFiles) } // 扫描Documents目录 - android.os.Environment.getExternalStoragePublicDirectory(android.os.Environment.DIRECTORY_DOCUMENTS) + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS) ?.let { scanDirectory(it, pdfFiles) } // 扫描内部存储根目录 - scanDirectoryRecursively(externalStorage, pdfFiles) + val root = Environment.getExternalStorageDirectory() + try { + root.listFiles()?.forEach { dir -> + if (dir.isDirectory && !isSystemDirectory(dir)) { + val name = dir.name.lowercase() + if (name.contains("pdf")) { + scanDirectoryRecursive(dir, pdfFiles, 0, 2) + } + } + } + } catch (e: Exception) { + Log.w("ocean", "⚠️ 无法读取根目录:${root.path}", e) + } } - - Log.d("ocean", "📊 文件扫描完成,共找到 ${pdfFiles.size} 个PDF文件") - return pdfFiles.distinct() + val result = pdfFiles.distinct() + return result } private fun scanDirectory(directory: File, result: MutableList) { @@ -171,7 +183,7 @@ object FileUtils { } // 额外的文件扩展名搜索(作为MediaStore的补充) - scanByExtension(context, pdfFiles) + scanByExtension(pdfFiles) } catch (e: SecurityException) { Log.d("ocean", "⚠️ MediaStore扫描权限不足") @@ -182,43 +194,44 @@ object FileUtils { return pdfFiles } - private fun scanByExtension(context: Context, result: MutableList) { - // 通过文件扩展名搜索PDF文件,作为MediaStore的补充 - val directories = listOf( - android.os.Environment.getExternalStorageDirectory(), - android.os.Environment.getExternalStoragePublicDirectory(android.os.Environment.DIRECTORY_DOWNLOADS), - android.os.Environment.getExternalStoragePublicDirectory(android.os.Environment.DIRECTORY_DOCUMENTS), - File(android.os.Environment.getExternalStorageDirectory(), "Books"), - File(android.os.Environment.getExternalStorageDirectory(), "PDF"), - File(android.os.Environment.getExternalStorageDirectory(), "Ebooks") + private fun scanByExtension(result: MutableList) { + // 只扫描自定义目录,避免重复扫描 Downloads/Docs + val customDirs = listOf( + File(Environment.getExternalStorageDirectory(), "Books"), + File(Environment.getExternalStorageDirectory(), "PDF"), + File(Environment.getExternalStorageDirectory(), "Ebooks") ) - directories.forEach { dir -> + val seen = HashSet() // 去重,用绝对路径 + + // 先把已有的文件路径加入去重集合 + result.forEach { seen.add(it.absolutePath) } + + customDirs.forEach { dir -> if (dir.exists() && dir.canRead()) { - findPdfFilesByExtension(dir, result) + findPdfFilesByExtension(dir, result, seen) } } } - private fun findPdfFilesByExtension(directory: File, result: MutableList) { + private fun findPdfFilesByExtension(directory: File, result: MutableList, seen: HashSet) { if (!directory.exists() || !directory.canRead()) return try { directory.listFiles()?.forEach { file -> when { - file.isDirectory && !isSystemDirectory(file) -> findPdfFilesByExtension( - file, result - ) + file.isDirectory && !isSystemDirectory(file) -> findPdfFilesByExtension(file, result, seen) file.isFile && file.extension.equals("pdf", ignoreCase = true) -> { - if (!result.contains(file)) { + if (seen.add(file.absolutePath)) { // HashSet.add 返回 true 表示是新文件 result.add(file) + Log.d("ocean", " 📂 扫描到: ${file.name}") } } } } } catch (e: SecurityException) { - Log.d("ocean", "⚠️ 跳过扩展名扫描目录:${directory.path}") + Log.d("ocean", "⚠️ 跳过目录:${directory.path}") } }