pull/1391/head
gedoor 4 years ago
parent 2d0d7447ef
commit 009555b2f8
  1. 6
      app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineViewModel.kt
  2. 4
      app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt
  3. 17
      app/src/main/java/io/legado/app/utils/DocumentUtils.kt
  4. 18
      app/src/main/java/io/legado/app/utils/UriExtensions.kt

@ -42,13 +42,11 @@ class SpeakEngineViewModel(application: Application) : BaseViewModel(application
fun importLocal(uri: Uri) { fun importLocal(uri: Uri) {
execute { execute {
uri.readText(context)?.let { import(uri.readText(context))
import(it)
}
}.onSuccess { }.onSuccess {
context.toastOnUi("导入成功") context.toastOnUi("导入成功")
}.onError { }.onError {
context.toastOnUi("导入失败") context.toastOnUi("导入失败\n${it.localizedMessage}")
} }
} }

@ -67,9 +67,7 @@ class BookSourceActivity : VMBaseActivity<ActivityBookSourceBinding, BookSourceV
private val importDoc = registerForActivityResult(HandleFileContract()) { uri -> private val importDoc = registerForActivityResult(HandleFileContract()) { uri ->
uri ?: return@registerForActivityResult uri ?: return@registerForActivityResult
try { try {
uri.readText(this)?.let { showDialogFragment(ImportBookSourceDialog(uri.readText(this)))
showDialogFragment(ImportBookSourceDialog(it))
}
} catch (e: Exception) { } catch (e: Exception) {
toastOnUi("readTextError:${e.localizedMessage}") toastOnUi("readTextError:${e.localizedMessage}")
} }

@ -5,6 +5,7 @@ import android.database.Cursor
import android.net.Uri import android.net.Uri
import android.provider.DocumentsContract import android.provider.DocumentsContract
import androidx.documentfile.provider.DocumentFile import androidx.documentfile.provider.DocumentFile
import io.legado.app.model.NoStackTraceException
import timber.log.Timber import timber.log.Timber
import java.nio.charset.Charset import java.nio.charset.Charset
import java.util.* import java.util.*
@ -76,24 +77,20 @@ object DocumentUtils {
@JvmStatic @JvmStatic
@Throws(Exception::class) @Throws(Exception::class)
fun readText(context: Context, uri: Uri): String? { fun readText(context: Context, uri: Uri): String {
readBytes(context, uri)?.let { return String(readBytes(context, uri))
return String(it)
}
return null
} }
@JvmStatic @JvmStatic
@Throws(Exception::class) @Throws(Exception::class)
fun readBytes(context: Context, uri: Uri): ByteArray? { fun readBytes(context: Context, uri: Uri): ByteArray {
context.contentResolver.openInputStream(uri)?.let { context.contentResolver.openInputStream(uri)?.let {
val len: Int = it.available() val len: Int = it.available()
val buffer = ByteArray(len) val buffer = ByteArray(len)
it.read(buffer) it.read(buffer)
it.close() it.close()
return buffer return buffer
} } ?: throw NoStackTraceException("打开文件失败\n${uri}")
return null
} }
fun listFiles(context: Context, uri: Uri): ArrayList<DocItem> { fun listFiles(context: Context, uri: Uri): ArrayList<DocItem> {
@ -166,11 +163,11 @@ fun DocumentFile.writeBytes(context: Context, data: ByteArray) {
} }
@Throws(Exception::class) @Throws(Exception::class)
fun DocumentFile.readText(context: Context): String? { fun DocumentFile.readText(context: Context): String {
return DocumentUtils.readText(context, this.uri) return DocumentUtils.readText(context, this.uri)
} }
@Throws(Exception::class) @Throws(Exception::class)
fun DocumentFile.readBytes(context: Context): ByteArray? { fun DocumentFile.readBytes(context: Context): ByteArray {
return DocumentUtils.readBytes(context, this.uri) return DocumentUtils.readBytes(context, this.uri)
} }

@ -25,7 +25,6 @@ fun AppCompatActivity.readUri(uri: Uri?, success: (name: String, bytes: ByteArra
doc ?: throw NoStackTraceException("未获取到文件") doc ?: throw NoStackTraceException("未获取到文件")
val name = doc.name ?: throw NoStackTraceException("未获取到文件名") val name = doc.name ?: throw NoStackTraceException("未获取到文件名")
val fileBytes = DocumentUtils.readBytes(this, doc.uri) val fileBytes = DocumentUtils.readBytes(this, doc.uri)
fileBytes ?: throw NoStackTraceException("读取文件出错")
success.invoke(name, fileBytes) success.invoke(name, fileBytes)
} else { } else {
PermissionsCompat.Builder(this) PermissionsCompat.Builder(this)
@ -59,7 +58,6 @@ fun Fragment.readUri(uri: Uri?, success: (name: String, bytes: ByteArray) -> Uni
doc ?: throw NoStackTraceException("未获取到文件") doc ?: throw NoStackTraceException("未获取到文件")
val name = doc.name ?: throw NoStackTraceException("未获取到文件名") val name = doc.name ?: throw NoStackTraceException("未获取到文件名")
val fileBytes = DocumentUtils.readBytes(requireContext(), doc.uri) val fileBytes = DocumentUtils.readBytes(requireContext(), doc.uri)
fileBytes ?: throw NoStackTraceException("读取文件出错")
success.invoke(name, fileBytes) success.invoke(name, fileBytes)
} else { } else {
PermissionsCompat.Builder(this) PermissionsCompat.Builder(this)
@ -83,24 +81,24 @@ fun Fragment.readUri(uri: Uri?, success: (name: String, bytes: ByteArray) -> Uni
} }
@Throws(Exception::class) @Throws(Exception::class)
fun Uri.readBytes(context: Context): ByteArray? { fun Uri.readBytes(context: Context): ByteArray {
if (this.isContentScheme()) { return if (this.isContentScheme()) {
return DocumentUtils.readBytes(context, this) DocumentUtils.readBytes(context, this)
} else { } else {
val path = RealPathUtil.getPath(context, this) val path = RealPathUtil.getPath(context, this)
if (path?.isNotEmpty() == true) { if (path?.isNotEmpty() == true) {
return File(path).readBytes() File(path).readBytes()
} else {
throw NoStackTraceException("获取文件真实地址失败\n${this.path}")
} }
} }
return null
} }
@Throws(Exception::class) @Throws(Exception::class)
fun Uri.readText(context: Context): String? { fun Uri.readText(context: Context): String {
readBytes(context)?.let { readBytes(context).let {
return String(it) return String(it)
} }
return null
} }
@Throws(Exception::class) @Throws(Exception::class)

Loading…
Cancel
Save