Commit fc62b35f authored by yinjiacheng's avatar yinjiacheng

update 图片服务逻辑

parent c15e0e34
package com.yidian.common.bean
import com.google.gson.annotations.SerializedName
import java.io.Serializable
/**
* author: yinjiacheng
* date: 7/8/21 8:55 AM
* description: 图片服务-选择图片业务参数数据结构
*/
data class SelectImageParamsBean(
@SerializedName("maxCount")
val maxCount: Int,
@SerializedName("selectedImages")
val selectedImages: List<SelectedImage>
) : Serializable
data class SelectedImage(
@SerializedName("id")
val id: String
) : Serializable
package com.yidian.common.bean
/**
* author: yinjiacheng
* date: 7/8/21 8:43 AM
* description: 图片服务-已选择图片数据结构
*/
data class SelectedImageBean(val id: String, val photo_base64_str: String)
package com.yidian.common.bean
/**
* author: yinjiacheng
* date: 7/8/21 8:43 AM
* description: 图片服务-已上传图片数据结构
*/
data class UploadImageBean(val id: String, val image_uploaded_key: String)
package com.yidian.common.services package com.yidian.common.services
import android.app.Activity import android.app.Activity
import android.net.Uri
import android.util.Base64 import android.util.Base64
import com.google.gson.Gson import com.google.gson.Gson
import com.luck.picture.lib.PictureSelector import com.luck.picture.lib.PictureSelector
import com.luck.picture.lib.config.PictureMimeType import com.luck.picture.lib.config.PictureMimeType
import com.luck.picture.lib.entity.LocalMedia import com.luck.picture.lib.entity.LocalMedia
import com.luck.picture.lib.listener.OnResultCallbackListener import com.luck.picture.lib.listener.OnResultCallbackListener
import com.yidian.common.bean.SelectImageParamsBean import com.luck.picture.lib.manager.PictureCacheManager
import com.yidian.common.bean.SelectedImageBean import com.yidian.common.YdBaseApplication
import com.yidian.common.bean.UploadImageBean
import com.yidian.common.utils.GlideEngine import com.yidian.common.utils.GlideEngine
import com.yidian.common.utils.KS3Core import com.yidian.common.utils.KS3Core
import com.yidian.xarc.xrouter.ResultResolver import com.yidian.xarc.xrouter.ResultResolver
...@@ -19,6 +19,9 @@ import org.json.JSONArray ...@@ -19,6 +19,9 @@ import org.json.JSONArray
import org.json.JSONObject import org.json.JSONObject
import java.io.File import java.io.File
import java.io.FileInputStream import java.io.FileInputStream
import java.io.FileOutputStream
import java.util.*
import kotlin.collections.ArrayList
/** /**
* author: yinjiacheng * author: yinjiacheng
...@@ -71,9 +74,19 @@ class ImageService : ZapService() { ...@@ -71,9 +74,19 @@ class ImageService : ZapService() {
private lateinit var curTopActivity: Activity private lateinit var curTopActivity: Activity
/** /**
* 内存缓存已选择图片 * 缓存已选择图片
*/ */
private val cacheSelectedImages by lazy { ArrayList<LocalMedia>() } private val localSelectedImages by lazy { ArrayList<LocalSelectedImageBean>() }
/**
* 自定义压缩路径
*/
private val picCompressPath by lazy { YdBaseApplication.context.externalCacheDir?.absolutePath + "/picture_selector_compress/" }
/**
* 自定义原图路径
*/
private val picOriginalPath by lazy { YdBaseApplication.context.externalCacheDir?.absolutePath + "/picture_selector_original/" }
override fun onAction(path: String, action: String, params: Any, options: Any, resolver: ResultResolver) { override fun onAction(path: String, action: String, params: Any, options: Any, resolver: ResultResolver) {
this.resolver = resolver this.resolver = resolver
...@@ -81,7 +94,7 @@ class ImageService : ZapService() { ...@@ -81,7 +94,7 @@ class ImageService : ZapService() {
val resolveParams = params as JSONObject val resolveParams = params as JSONObject
when (action) { when (action) {
ACTION_SELECT_PIC -> { ACTION_SELECT_PIC -> {
selectPic(gson.fromJson(resolveParams.toString(), SelectImageParamsBean::class.java)) selectPic(resolveParams.optInt("maxCount"))
} }
ACTION_TAKE_PIC -> { ACTION_TAKE_PIC -> {
takePic() takePic()
...@@ -96,42 +109,57 @@ class ImageService : ZapService() { ...@@ -96,42 +109,57 @@ class ImageService : ZapService() {
} }
override fun onExit() { override fun onExit() {
clearCache()
} }
override fun onInit() { override fun onInit() {
File(picCompressPath).apply {
if (!exists()) {
mkdirs()
}
}
File(picOriginalPath).apply {
if (!exists()) {
mkdirs()
}
}
} }
/** /**
* 选择图片 * 选择图片
* @param maxCount 最多可选择的数量
*/ */
private fun selectPic(params: SelectImageParamsBean) { private fun selectPic(maxCount: Int) {
PictureSelector.create(curTopActivity) PictureSelector.create(curTopActivity)
.openGallery(PictureMimeType.ofImage()) .openGallery(PictureMimeType.ofImage())
.imageEngine(GlideEngine.createGlideEngine()) .imageEngine(GlideEngine.createGlideEngine())
.maxSelectNum(params.maxCount) .maxSelectNum(maxCount)
.isWeChatStyle(true) .isWeChatStyle(true)
.isCompress(true) .isCompress(true)
.compressQuality(10) .compressQuality(10)
.compressSavePath(picCompressPath)
.forResult(object : OnResultCallbackListener<LocalMedia> { .forResult(object : OnResultCallbackListener<LocalMedia> {
override fun onResult(result: MutableList<LocalMedia>?) { override fun onResult(result: MutableList<LocalMedia>?) {
if (result.isNullOrEmpty()) { if (result.isNullOrEmpty()) {
resolver.fail(CODE_ACTION_CANCEL, "select failed", "选择失败") resolver.fail(CODE_ACTION_CANCEL, "select failed", "选择失败")
return return
} }
cacheSelectedImages.addAll(result as ArrayList<LocalMedia>) // 回传h5选择的图片的数据
val picList = ArrayList<SelectedImageBean>(params.maxCount) val selectedList = ArrayList<SelectedImageBean>(maxCount)
result.forEach { result.forEach {
picList.add( val uuid = UUID.randomUUID().toString()
val inputStream = FileInputStream(it.compressPath)
selectedList.add(
SelectedImageBean( SelectedImageBean(
it.id.toString(), uuid,
Base64.encodeToString(FileInputStream(it.compressPath).readBytes(), Base64.DEFAULT) Base64.encodeToString(inputStream.readBytes(), Base64.DEFAULT)
) )
) )
inputStream.close()
localSelectedImages.add(LocalSelectedImageBean(uuid, it))
} }
// 成功回传数据 // 成功回传数据
resolver.success(JSONArray(gson.toJson(picList))) resolver.success(JSONArray(gson.toJson(selectedList)))
} }
override fun onCancel() { override fun onCancel() {
...@@ -152,26 +180,30 @@ class ImageService : ZapService() { ...@@ -152,26 +180,30 @@ class ImageService : ZapService() {
.imageEngine(GlideEngine.createGlideEngine()) .imageEngine(GlideEngine.createGlideEngine())
.isCompress(true) .isCompress(true)
.compressQuality(10) .compressQuality(10)
.compressSavePath(picCompressPath)
.forResult(object : OnResultCallbackListener<LocalMedia> { .forResult(object : OnResultCallbackListener<LocalMedia> {
override fun onResult(result: MutableList<LocalMedia>?) { override fun onResult(result: MutableList<LocalMedia>?) {
if (result.isNullOrEmpty()) { if (result.isNullOrEmpty()) {
resolver.fail(CODE_ACTION_CANCEL, "take failed", "拍照失败") resolver.fail(CODE_ACTION_CANCEL, "take failed", "拍照失败")
return return
} }
cacheSelectedImages.add(result[0]) val uuid = UUID.randomUUID().toString()
val inputStream = FileInputStream(result[0].compressPath)
// 成功回传数据 // 成功回传数据
resolver.success( resolver.success(
JSONArray( JSONArray(
gson.toJson( gson.toJson(
arrayListOf( arrayListOf(
SelectedImageBean( SelectedImageBean(
result[0].id.toString(), uuid,
Base64.encodeToString(FileInputStream(result[0].compressPath).readBytes(), Base64.DEFAULT) Base64.encodeToString(inputStream.readBytes(), Base64.DEFAULT)
) )
) )
) )
) )
) )
inputStream.close()
localSelectedImages.add(LocalSelectedImageBean(uuid, result[0]))
} }
override fun onCancel() { override fun onCancel() {
...@@ -187,16 +219,18 @@ class ImageService : ZapService() { ...@@ -187,16 +219,18 @@ class ImageService : ZapService() {
* @param id 需要上传的图片id * @param id 需要上传的图片id
*/ */
private fun uploadPic(id: String) { private fun uploadPic(id: String) {
var uploadPic: LocalMedia? = null var uploadPic: LocalSelectedImageBean? = null
cacheSelectedImages.forEach { localSelectedImages.forEach {
// 遍历寻找指定图片 // 遍历寻找指定图片
if (id == it.id.toString()) { if (id == it.uuid) {
uploadPic = it uploadPic = it
return@forEach return@forEach
} }
} }
uploadPic?.let { uploadPic?.let {
val file = File(it.compressPath) // 将图片拷贝到沙盒
fileCopy(it.data.path, picOriginalPath + it.data.fileName)
val file = File(picOriginalPath + it.data.fileName)
if (!file.exists()) { if (!file.exists()) {
resolver.fail(CODE_FILE_NOT_EXIST, "file not exist", "文件不存在") resolver.fail(CODE_FILE_NOT_EXIST, "file not exist", "文件不存在")
return return
...@@ -226,6 +260,42 @@ class ImageService : ZapService() { ...@@ -226,6 +260,42 @@ class ImageService : ZapService() {
resolver.fail(CODE_FILE_UPLOAD_FAIL, "upload failed", "上传失败") resolver.fail(CODE_FILE_UPLOAD_FAIL, "upload failed", "上传失败")
} }
}) })
} } ?: resolver.fail(CODE_FILE_NOT_EXIST, "file not exist", "文件不存在")
}
/**
* 文件拷贝
* @param fromUriStr 源文件uri
* @param targetPath 目标文件全路径
*/
private fun fileCopy(fromUriStr: String?, targetPath: String?) {
val inputStream = YdBaseApplication.context.contentResolver.openInputStream(Uri.parse(fromUriStr))
val outputStream = FileOutputStream(targetPath)
inputStream?.copyTo(outputStream)
inputStream?.close()
outputStream.close()
}
/**
* 清理缓存
*/
private fun clearCache() {
PictureCacheManager.deleteAllCacheDirRefreshFile(YdBaseApplication.context)
File(picOriginalPath).delete()
} }
/**
* 已选择的图片数据结构
*/
data class LocalSelectedImageBean(val uuid: String, val data: LocalMedia)
/**
* 已选择的图片数据结构 回传H5结果使用
*/
data class SelectedImageBean(val id: String, val photo_base64_str: String)
/**
* 已上传的图片数据结构 回传H5结果使用
*/
data class UploadImageBean(val id: String, val image_uploaded_key: String)
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment