diff --git a/app/src/main/java/io/legado/app/help/book/BookExtensions.kt b/app/src/main/java/io/legado/app/help/book/BookExtensions.kt index 45c441521..763fc645e 100644 --- a/app/src/main/java/io/legado/app/help/book/BookExtensions.kt +++ b/app/src/main/java/io/legado/app/help/book/BookExtensions.kt @@ -66,42 +66,65 @@ private val localUriCache by lazy { } fun Book.getLocalUri(): Uri { - if (isLocal) { - var uri = localUriCache[bookUrl] - if (uri != null) { - return uri - } - uri = if (bookUrl.isUri()) { - Uri.parse(bookUrl) + if (!isLocal) { + throw NoStackTraceException("不是本地书籍") + } + var uri = localUriCache[bookUrl] + if (uri != null) { + return uri + } + uri = if (bookUrl.isUri()) { + Uri.parse(bookUrl) + } else { + Uri.fromFile(File(bookUrl)) + } + //先检测uri是否有效,这个比较快 + uri.inputStream(appCtx).getOrNull()?.use { + localUriCache[bookUrl] = uri + }?.let { + return uri + } + //不同的设备书籍保存路径可能不一样, uri无效时尝试寻找当前保存路径下的文件 + val defaultBookDir = AppConfig.defaultBookTreeUri + val importBookDir = AppConfig.importBookPath + + // 查找书籍保存目录 + if (!defaultBookDir.isNullOrBlank()) { + val treeUri = Uri.parse(defaultBookDir) + val treeFileDoc = FileDoc.fromUri(treeUri, true) + if (!treeFileDoc.exists()) { + appCtx.toastOnUi("书籍保存目录失效,请重新设置!") } else { - Uri.fromFile(File(bookUrl)) - } - //先检测uri是否有效,这个比较快 - uri.inputStream(appCtx).getOrNull()?.use { - localUriCache[bookUrl] = uri - }?.let { - return uri + val fileDoc = treeFileDoc.find(originName, 5) + if (fileDoc != null) { + localUriCache[bookUrl] = fileDoc.uri + //更新bookUrl 重启不用再找一遍 + bookUrl = fileDoc.toString() + save() + return fileDoc.uri + } } - //不同的设备书籍保存路径可能不一样, uri无效时尝试寻找当前保存路径下的文件 - val defaultBookDir = AppConfig.defaultBookTreeUri - if (defaultBookDir.isNullOrBlank()) { - localUriCache[bookUrl] = uri - return uri + } + + // 查找添加本地选择的目录 + if (!importBookDir.isNullOrBlank()) { + val treeUri = if (importBookDir.isUri()) { + Uri.parse(importBookDir) + } else { + Uri.fromFile(File(importBookDir)) } - val treeUri = Uri.parse(defaultBookDir) val treeFileDoc = FileDoc.fromUri(treeUri, true) - val fileDoc = treeFileDoc.find(originName, 3) + val fileDoc = treeFileDoc.find(originName, 5) if (fileDoc != null) { localUriCache[bookUrl] = fileDoc.uri - //更新bookUrl 重启不用再找一遍 bookUrl = fileDoc.toString() save() return fileDoc.uri } - localUriCache[bookUrl] = uri - return uri } - throw NoStackTraceException("不是本地书籍") + + localUriCache[bookUrl] = uri + return uri } fun Book.cacheLocalUri(uri: Uri) { diff --git a/app/src/main/java/io/legado/app/help/config/AppConfig.kt b/app/src/main/java/io/legado/app/help/config/AppConfig.kt index 3e719344e..46f3f9134 100644 --- a/app/src/main/java/io/legado/app/help/config/AppConfig.kt +++ b/app/src/main/java/io/legado/app/help/config/AppConfig.kt @@ -135,6 +135,7 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { } } + // 书籍保存位置 var defaultBookTreeUri: String? get() = appCtx.getPrefString(PreferKey.defaultBookTreeUri) set(value) { @@ -166,6 +167,7 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { appCtx.putPrefInt(PreferKey.threadCount, value) } + // 添加本地选择的目录 var importBookPath: String? get() = appCtx.getPrefString("importBookPath") set(value) { diff --git a/app/src/main/java/io/legado/app/utils/FileDocExtensions.kt b/app/src/main/java/io/legado/app/utils/FileDocExtensions.kt index 798262602..6debc91e0 100644 --- a/app/src/main/java/io/legado/app/utils/FileDocExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/FileDocExtensions.kt @@ -221,6 +221,14 @@ fun FileDoc.exists( } } +fun FileDoc.exists(): Boolean { + return if (uri.isContentScheme()) { + DocumentFile.fromTreeUri(appCtx, uri)!!.exists() + } else { + FileUtils.exist(uri.path!!) + } +} + /** * DocumentFile 的 listFiles() 非常的慢,尽量不要使用 */