优化扫描时间
This commit is contained in:
parent
3cbb01c651
commit
89ec1b8f5c
@ -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}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user