优化扫描时间

This commit is contained in:
ocean 2025-10-28 11:46:49 +08:00
parent 3cbb01c651
commit 89ec1b8f5c

View File

@ -4,6 +4,7 @@ import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.graphics.pdf.PdfRenderer import android.graphics.pdf.PdfRenderer
import android.net.Uri import android.net.Uri
import android.os.Environment
import android.os.ParcelFileDescriptor import android.os.ParcelFileDescriptor
import android.provider.MediaStore import android.provider.MediaStore
import android.provider.OpenableColumns import android.provider.OpenableColumns
@ -37,23 +38,34 @@ object FileUtils {
if (StoragePermissionHelper.hasBasicStoragePermission(context)) { if (StoragePermissionHelper.hasBasicStoragePermission(context)) {
Log.d("ocean", "📂 扫描外部存储目录...") Log.d("ocean", "📂 扫描外部存储目录...")
// 扫描常见的PDF存储目录 // 扫描常见的PDF存储目录
val externalStorage = android.os.Environment.getExternalStorageDirectory() val externalStorage = Environment.getExternalStorageDirectory()
scanCommonDirectories(externalStorage, pdfFiles) scanCommonDirectories(externalStorage, pdfFiles)
// 扫描Download目录 // 扫描Download目录
android.os.Environment.getExternalStoragePublicDirectory(android.os.Environment.DIRECTORY_DOWNLOADS) Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
?.let { scanDirectory(it, pdfFiles) } ?.let { scanDirectory(it, pdfFiles) }
// 扫描Documents目录 // 扫描Documents目录
android.os.Environment.getExternalStoragePublicDirectory(android.os.Environment.DIRECTORY_DOCUMENTS) Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)
?.let { scanDirectory(it, pdfFiles) } ?.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)
}
} }
val result = pdfFiles.distinct()
Log.d("ocean", "📊 文件扫描完成,共找到 ${pdfFiles.size} 个PDF文件") return result
return pdfFiles.distinct()
} }
private fun scanDirectory(directory: File, result: MutableList<File>) { private fun scanDirectory(directory: File, result: MutableList<File>) {
@ -171,7 +183,7 @@ object FileUtils {
} }
// 额外的文件扩展名搜索作为MediaStore的补充 // 额外的文件扩展名搜索作为MediaStore的补充
scanByExtension(context, pdfFiles) scanByExtension(pdfFiles)
} catch (e: SecurityException) { } catch (e: SecurityException) {
Log.d("ocean", "⚠️ MediaStore扫描权限不足") Log.d("ocean", "⚠️ MediaStore扫描权限不足")
@ -182,43 +194,44 @@ object FileUtils {
return pdfFiles return pdfFiles
} }
private fun scanByExtension(context: Context, result: MutableList<File>) { private fun scanByExtension(result: MutableList<File>) {
// 通过文件扩展名搜索PDF文件作为MediaStore的补充 // 只扫描自定义目录,避免重复扫描 Downloads/Docs
val directories = listOf( val customDirs = listOf(
android.os.Environment.getExternalStorageDirectory(), File(Environment.getExternalStorageDirectory(), "Books"),
android.os.Environment.getExternalStoragePublicDirectory(android.os.Environment.DIRECTORY_DOWNLOADS), File(Environment.getExternalStorageDirectory(), "PDF"),
android.os.Environment.getExternalStoragePublicDirectory(android.os.Environment.DIRECTORY_DOCUMENTS), File(Environment.getExternalStorageDirectory(), "Ebooks")
File(android.os.Environment.getExternalStorageDirectory(), "Books"),
File(android.os.Environment.getExternalStorageDirectory(), "PDF"),
File(android.os.Environment.getExternalStorageDirectory(), "Ebooks")
) )
directories.forEach { dir -> val seen = HashSet<String>() // 去重,用绝对路径
// 先把已有的文件路径加入去重集合
result.forEach { seen.add(it.absolutePath) }
customDirs.forEach { dir ->
if (dir.exists() && dir.canRead()) { if (dir.exists() && dir.canRead()) {
findPdfFilesByExtension(dir, result) findPdfFilesByExtension(dir, result, seen)
} }
} }
} }
private fun findPdfFilesByExtension(directory: File, result: MutableList<File>) { private fun findPdfFilesByExtension(directory: File, result: MutableList<File>, seen: HashSet<String>) {
if (!directory.exists() || !directory.canRead()) return if (!directory.exists() || !directory.canRead()) return
try { try {
directory.listFiles()?.forEach { file -> directory.listFiles()?.forEach { file ->
when { when {
file.isDirectory && !isSystemDirectory(file) -> findPdfFilesByExtension( file.isDirectory && !isSystemDirectory(file) -> findPdfFilesByExtension(file, result, seen)
file, result
)
file.isFile && file.extension.equals("pdf", ignoreCase = true) -> { file.isFile && file.extension.equals("pdf", ignoreCase = true) -> {
if (!result.contains(file)) { if (seen.add(file.absolutePath)) { // HashSet.add 返回 true 表示是新文件
result.add(file) result.add(file)
Log.d("ocean", " 📂 扫描到: ${file.name}")
} }
} }
} }
} }
} catch (e: SecurityException) { } catch (e: SecurityException) {
Log.d("ocean", "⚠️ 跳过扩展名扫描目录:${directory.path}") Log.d("ocean", "⚠️ 跳过目录:${directory.path}")
} }
} }