pull/2437/head
kunfei 3 years ago
parent cc3a8625b5
commit 6265daa5d9
  1. 19
      app/src/main/java/io/legado/app/ui/association/FileAssociationViewModel.kt
  2. 17
      app/src/main/java/io/legado/app/utils/DocumentExtensions.kt
  3. 2
      app/src/main/java/io/legado/app/utils/UriExtensions.kt

@ -2,16 +2,11 @@ package io.legado.app.ui.association
import android.app.Application import android.app.Application
import android.net.Uri import android.net.Uri
import androidx.documentfile.provider.DocumentFile
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import io.legado.app.constant.AppLog import io.legado.app.constant.AppLog
import io.legado.app.constant.AppPattern.bookFileRegex import io.legado.app.constant.AppPattern.bookFileRegex
import io.legado.app.exception.NoStackTraceException
import io.legado.app.model.localBook.LocalBook import io.legado.app.model.localBook.LocalBook
import io.legado.app.utils.inputStream import io.legado.app.utils.*
import io.legado.app.utils.isJson
import io.legado.app.utils.printOnDebug
import java.io.File
class FileAssociationViewModel(application: Application) : BaseAssociationViewModel(application) { class FileAssociationViewModel(application: Application) : BaseAssociationViewModel(application) {
val importBookLiveData = MutableLiveData<Uri>() val importBookLiveData = MutableLiveData<Uri>()
@ -24,15 +19,9 @@ class FileAssociationViewModel(application: Application) : BaseAssociationViewMo
execute { execute {
lateinit var fileName: String lateinit var fileName: String
//如果是普通的url,需要根据返回的内容判断是什么 //如果是普通的url,需要根据返回的内容判断是什么
if (uri.scheme == "file" || uri.scheme == "content") { if (uri.isContentScheme() || uri.isFileScheme()) {
fileName = if (uri.scheme == "file") { val fileDoc = FileDoc.fromUri(uri, false)
val file = File(uri.path.toString()) fileName = fileDoc.name
file.name
} else {
val file = DocumentFile.fromSingleUri(context, uri)
if (file?.exists() != true) throw NoStackTraceException("文件不存在")
file.name ?: ""
}
kotlin.runCatching { kotlin.runCatching {
if (uri.inputStream(context).isJson()) { if (uri.inputStream(context).isJson()) {
importJson(uri) importJson(uri)

@ -1,5 +1,6 @@
package io.legado.app.utils package io.legado.app.utils
import android.app.DownloadManager
import android.content.Context import android.content.Context
import android.database.Cursor import android.database.Cursor
import android.net.Uri import android.net.Uri
@ -7,6 +8,7 @@ import android.provider.DocumentsContract
import androidx.documentfile.provider.DocumentFile import androidx.documentfile.provider.DocumentFile
import io.legado.app.exception.NoStackTraceException import io.legado.app.exception.NoStackTraceException
import splitties.init.appCtx import splitties.init.appCtx
import splitties.systemservices.downloadManager
import java.io.File import java.io.File
import java.nio.charset.Charset import java.nio.charset.Charset
@ -63,6 +65,9 @@ object DocumentUtils {
) )
} }
/**
* DocumentFile listFiles() 非常的慢,所以这里直接从数据库查询
*/
@Throws(Exception::class) @Throws(Exception::class)
fun listFiles(uri: Uri, filter: ((file: FileDoc) -> Boolean)? = null): ArrayList<FileDoc> { fun listFiles(uri: Uri, filter: ((file: FileDoc) -> Boolean)? = null): ArrayList<FileDoc> {
if (!uri.isContentScheme()) { if (!uri.isContentScheme()) {
@ -149,6 +154,18 @@ data class FileDoc(
if (uri.isContentScheme()) { if (uri.isContentScheme()) {
val doc = if (isDir) { val doc = if (isDir) {
DocumentFile.fromTreeUri(appCtx, uri)!! 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 { } else {
DocumentFile.fromSingleUri(appCtx, uri)!! DocumentFile.fromSingleUri(appCtx, uri)!!
} }

@ -17,6 +17,8 @@ import java.nio.charset.Charset
fun Uri.isContentScheme() = this.scheme == "content" fun Uri.isContentScheme() = this.scheme == "content"
fun Uri.isFileScheme() = this.scheme == "file"
/** /**
* 读取URI * 读取URI
*/ */

Loading…
Cancel
Save