From 9af86699a333431552eb283cba37cfbbf7cf1598 Mon Sep 17 00:00:00 2001 From: Xwite <1797350009@qq.com> Date: Sun, 9 Oct 2022 17:43:02 +0800 Subject: [PATCH] feat(LocalBook): `Book.getLocalUri` return dynamic value --- .../io/legado/app/help/book/BookExtensions.kt | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) 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 5f0bccd23..15b6c7912 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 @@ -1,13 +1,17 @@ package io.legado.app.help.book import android.net.Uri +import androidx.documentfile.provider.DocumentFile import io.legado.app.constant.BookSourceType import io.legado.app.constant.BookType import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookSource +import io.legado.app.help.config.AppConfig.defaultBookTreeUri import io.legado.app.exception.NoStackTraceException import io.legado.app.utils.isContentScheme +import io.legado.app.utils.getFile import java.io.File +import splitties.init.appCtx val Book.isAudio: Boolean @@ -50,10 +54,25 @@ val Book.isOnLineTxt: Boolean fun Book.getLocalUri(): Uri { if (isLocal) { - if (bookUrl.isContentScheme()) { - return Uri.parse(bookUrl) + val originBookUri = if (bookUrl.isContentScheme()) { + Uri.parse(bookUrl) + } else { + Uri.fromFile(File(bookUrl)) + } + //不同的设备书籍保存路径可能不一样 优先尝试寻找当前保存路径下的文件 + defaultBookTreeUri ?: return originBookUri + val treeUri = Uri.parse(defaultBookTreeUri) + return if (treeUri.isContentScheme()) { + DocumentFile.fromTreeUri(appCtx, treeUri)?.run { + findFile(originName)?.let { + if (it.exists()) it.uri else originBookUri + } ?: originBookUri + } ?: originBookUri + } else { + val treeFile = File(treeUri.path!!) + val file = treeFile.getFile(originName) + if (file.exists()) Uri.fromFile(file) else originBookUri } - return Uri.fromFile(File(bookUrl)) } throw NoStackTraceException("不是本地书籍") }