kunfei 4 ani în urmă
părinte
comite
6fcccc1004

+ 29 - 5
app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt

@@ -3,6 +3,7 @@ package io.legado.app.ui.book.read
 import android.app.Application
 import android.content.Intent
 import android.net.Uri
+import androidx.documentfile.provider.DocumentFile
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.viewModelScope
 import io.legado.app.R
@@ -29,12 +30,12 @@ import io.legado.app.service.BaseReadAloudService
 import io.legado.app.ui.book.read.page.entities.TextChapter
 import io.legado.app.ui.book.read.page.provider.ImageProvider
 import io.legado.app.ui.book.searchContent.SearchResult
-import io.legado.app.utils.msg
-import io.legado.app.utils.postEvent
-import io.legado.app.utils.toStringArray
-import io.legado.app.utils.toastOnUi
+import io.legado.app.utils.*
 import kotlinx.coroutines.Dispatchers.IO
 import kotlinx.coroutines.launch
+import java.io.File
+import java.io.FileInputStream
+import java.io.FileOutputStream
 
 /**
  * 阅读界面数据处理
@@ -426,8 +427,31 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
         }
     }
 
+    @Suppress("BlockingMethodInNonBlockingContext")
     fun saveImage(src: String?, uri: Uri) {
-
+        src ?: return
+        val book = ReadBook.book ?: return
+        execute {
+            val image = BookHelp.getImage(book, src)
+            FileInputStream(image).use { input ->
+                if (uri.isContentScheme()) {
+                    DocumentFile.fromTreeUri(context, uri)?.let { doc ->
+                        DocumentUtils.createFileIfNotExist(doc, image.name)
+                        context.contentResolver.openOutputStream(doc.uri)!!.use { output ->
+                            input.copyTo(output)
+                        }
+                    }
+                } else {
+                    val dir = File(uri.path ?: uri.toString())
+                    val file = FileUtils.createFileIfNotExist(dir, image.name)
+                    FileOutputStream(file).use { output ->
+                        input.copyTo(output)
+                    }
+                }
+            }
+        }.onError {
+            context.toastOnUi("保存图片出错\n${it.localizedMessage}")
+        }
     }
 
     /**