Horis 4 سال پیش
والد
کامیت
1c8df880b9

+ 48 - 25
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) {

+ 2 - 0
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) {

+ 8 - 0
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() 非常的慢,尽量不要使用
  */