From 6265daa5d966691fdf969d62072ffa469f124844 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 16 Oct 2022 10:28:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../association/FileAssociationViewModel.kt | 19 ++++--------------- .../io/legado/app/utils/DocumentExtensions.kt | 17 +++++++++++++++++ .../java/io/legado/app/utils/UriExtensions.kt | 2 ++ 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/association/FileAssociationViewModel.kt b/app/src/main/java/io/legado/app/ui/association/FileAssociationViewModel.kt index 0f6a924e1..ca484936b 100644 --- a/app/src/main/java/io/legado/app/ui/association/FileAssociationViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/association/FileAssociationViewModel.kt @@ -2,16 +2,11 @@ package io.legado.app.ui.association import android.app.Application import android.net.Uri -import androidx.documentfile.provider.DocumentFile import androidx.lifecycle.MutableLiveData import io.legado.app.constant.AppLog import io.legado.app.constant.AppPattern.bookFileRegex -import io.legado.app.exception.NoStackTraceException import io.legado.app.model.localBook.LocalBook -import io.legado.app.utils.inputStream -import io.legado.app.utils.isJson -import io.legado.app.utils.printOnDebug -import java.io.File +import io.legado.app.utils.* class FileAssociationViewModel(application: Application) : BaseAssociationViewModel(application) { val importBookLiveData = MutableLiveData() @@ -24,15 +19,9 @@ class FileAssociationViewModel(application: Application) : BaseAssociationViewMo execute { lateinit var fileName: String //如果是普通的url,需要根据返回的内容判断是什么 - if (uri.scheme == "file" || uri.scheme == "content") { - fileName = if (uri.scheme == "file") { - val file = File(uri.path.toString()) - file.name - } else { - val file = DocumentFile.fromSingleUri(context, uri) - if (file?.exists() != true) throw NoStackTraceException("文件不存在") - file.name ?: "" - } + if (uri.isContentScheme() || uri.isFileScheme()) { + val fileDoc = FileDoc.fromUri(uri, false) + fileName = fileDoc.name kotlin.runCatching { if (uri.inputStream(context).isJson()) { importJson(uri) diff --git a/app/src/main/java/io/legado/app/utils/DocumentExtensions.kt b/app/src/main/java/io/legado/app/utils/DocumentExtensions.kt index 5a8fb7be6..7585d4b82 100644 --- a/app/src/main/java/io/legado/app/utils/DocumentExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/DocumentExtensions.kt @@ -1,5 +1,6 @@ package io.legado.app.utils +import android.app.DownloadManager import android.content.Context import android.database.Cursor import android.net.Uri @@ -7,6 +8,7 @@ import android.provider.DocumentsContract import androidx.documentfile.provider.DocumentFile import io.legado.app.exception.NoStackTraceException import splitties.init.appCtx +import splitties.systemservices.downloadManager import java.io.File import java.nio.charset.Charset @@ -63,6 +65,9 @@ object DocumentUtils { ) } + /** + * DocumentFile 的 listFiles() 非常的慢,所以这里直接从数据库查询 + */ @Throws(Exception::class) fun listFiles(uri: Uri, filter: ((file: FileDoc) -> Boolean)? = null): ArrayList { if (!uri.isContentScheme()) { @@ -149,6 +154,18 @@ data class FileDoc( if (uri.isContentScheme()) { val doc = if (isDir) { DocumentFile.fromTreeUri(appCtx, uri)!! + } else if (uri.host == "downloads") { + val query = DownloadManager.Query() + query.setFilterById(uri.lastPathSegment!!.toLong()) + downloadManager.query(query).use { + if (it.moveToFirst()) { + val lUriColum = it.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI) + val lUri = it.getString(lUriColum) + DocumentFile.fromSingleUri(appCtx, Uri.parse(lUri))!! + } else { + DocumentFile.fromSingleUri(appCtx, uri)!! + } + } } else { DocumentFile.fromSingleUri(appCtx, uri)!! } diff --git a/app/src/main/java/io/legado/app/utils/UriExtensions.kt b/app/src/main/java/io/legado/app/utils/UriExtensions.kt index e5da25e27..1c1fa6cc3 100644 --- a/app/src/main/java/io/legado/app/utils/UriExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/UriExtensions.kt @@ -17,6 +17,8 @@ import java.nio.charset.Charset fun Uri.isContentScheme() = this.scheme == "content" +fun Uri.isFileScheme() = this.scheme == "file" + /** * 读取URI */