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
import android.app.Activity
import android.net.Uri
import android.util.Base64
import com.google.gson.Gson
import com.luck.picture.lib.PictureSelector
import com.luck.picture.lib.config.PictureMimeType
import com.luck.picture.lib.entity.LocalMedia
import com.luck.picture.lib.listener.OnResultCallbackListener
import com.yidian.common.bean.SelectImageParamsBean
import com.yidian.common.bean.SelectedImageBean
import com.yidian.common.bean.UploadImageBean
import com.luck.picture.lib.manager.PictureCacheManager
import com.yidian.common.YdBaseApplication
import com.yidian.common.utils.GlideEngine
import com.yidian.common.utils.KS3Core
import com.yidian.xarc.xrouter.ResultResolver
......@@ -19,6 +19,9 @@ import org.json.JSONArray
import org.json.JSONObject
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import java.util.*
import kotlin.collections.ArrayList
/**
* author: yinjiacheng
......@@ -71,9 +74,19 @@ class ImageService : ZapService() {
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) {
this.resolver = resolver
......@@ -81,7 +94,7 @@ class ImageService : ZapService() {
val resolveParams = params as JSONObject
when (action) {
ACTION_SELECT_PIC -> {
selectPic(gson.fromJson(resolveParams.toString(), SelectImageParamsBean::class.java))
selectPic(resolveParams.optInt("maxCount"))
}
ACTION_TAKE_PIC -> {
takePic()
......@@ -96,42 +109,57 @@ class ImageService : ZapService() {
}
override fun onExit() {
clearCache()
}
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)
.openGallery(PictureMimeType.ofImage())
.imageEngine(GlideEngine.createGlideEngine())
.maxSelectNum(params.maxCount)
.maxSelectNum(maxCount)
.isWeChatStyle(true)
.isCompress(true)
.compressQuality(10)
.compressSavePath(picCompressPath)
.forResult(object : OnResultCallbackListener<LocalMedia> {
override fun onResult(result: MutableList<LocalMedia>?) {
if (result.isNullOrEmpty()) {
resolver.fail(CODE_ACTION_CANCEL, "select failed", "选择失败")
return
}
cacheSelectedImages.addAll(result as ArrayList<LocalMedia>)
val picList = ArrayList<SelectedImageBean>(params.maxCount)
// 回传h5选择的图片的数据
val selectedList = ArrayList<SelectedImageBean>(maxCount)
result.forEach {
picList.add(
val uuid = UUID.randomUUID().toString()
val inputStream = FileInputStream(it.compressPath)
selectedList.add(
SelectedImageBean(
it.id.toString(),
Base64.encodeToString(FileInputStream(it.compressPath).readBytes(), Base64.DEFAULT)
uuid,
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() {
......@@ -152,26 +180,30 @@ class ImageService : ZapService() {
.imageEngine(GlideEngine.createGlideEngine())
.isCompress(true)
.compressQuality(10)
.compressSavePath(picCompressPath)
.forResult(object : OnResultCallbackListener<LocalMedia> {
override fun onResult(result: MutableList<LocalMedia>?) {
if (result.isNullOrEmpty()) {
resolver.fail(CODE_ACTION_CANCEL, "take failed", "拍照失败")
return
}
cacheSelectedImages.add(result[0])
val uuid = UUID.randomUUID().toString()
val inputStream = FileInputStream(result[0].compressPath)
// 成功回传数据
resolver.success(
JSONArray(
gson.toJson(
arrayListOf(
SelectedImageBean(
result[0].id.toString(),
Base64.encodeToString(FileInputStream(result[0].compressPath).readBytes(), Base64.DEFAULT)
uuid,
Base64.encodeToString(inputStream.readBytes(), Base64.DEFAULT)
)
)
)
)
)
inputStream.close()
localSelectedImages.add(LocalSelectedImageBean(uuid, result[0]))
}
override fun onCancel() {
......@@ -187,16 +219,18 @@ class ImageService : ZapService() {
* @param id 需要上传的图片id
*/
private fun uploadPic(id: String) {
var uploadPic: LocalMedia? = null
cacheSelectedImages.forEach {
var uploadPic: LocalSelectedImageBean? = null
localSelectedImages.forEach {
// 遍历寻找指定图片
if (id == it.id.toString()) {
if (id == it.uuid) {
uploadPic = it
return@forEach
}
}
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()) {
resolver.fail(CODE_FILE_NOT_EXIST, "file not exist", "文件不存在")
return
......@@ -226,6 +260,42 @@ class ImageService : ZapService() {
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