优化扫描时间
This commit is contained in:
parent
3cbb01c651
commit
89ec1b8f5c
@ -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<File>) {
|
||||
@ -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<File>) {
|
||||
// 通过文件扩展名搜索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<File>) {
|
||||
// 只扫描自定义目录,避免重复扫描 Downloads/Docs
|
||||
val customDirs = listOf(
|
||||
File(Environment.getExternalStorageDirectory(), "Books"),
|
||||
File(Environment.getExternalStorageDirectory(), "PDF"),
|
||||
File(Environment.getExternalStorageDirectory(), "Ebooks")
|
||||
)
|
||||
|
||||
directories.forEach { dir ->
|
||||
val seen = HashSet<String>() // 去重,用绝对路径
|
||||
|
||||
// 先把已有的文件路径加入去重集合
|
||||
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<File>) {
|
||||
private fun findPdfFilesByExtension(directory: File, result: MutableList<File>, seen: HashSet<String>) {
|
||||
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}")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user