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.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)

@ -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)!!
}

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

Loading…
Cancel
Save