优化
This commit is contained in:
@@ -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
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user