kunfei 4 سال پیش
والد
کامیت
759fc2a399

+ 4 - 15
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<Uri>()
@@ -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)

+ 17 - 0
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<FileDoc> {
         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)!!
                 }

+ 2 - 0
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
  */