分享小程序展示的封面图需要在 128KB 以内,图片比例为 5:4,需要对图片进行裁剪和压缩。
自定义封面图拼接的话 1.Bitmap绘制 2.xml布局渲染 根据需求的简易方式选择
import android.content.Context
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Matrix
import android.graphics.drawable.Drawable
import android.view.View
import cn.rockysports.weibu.BuildConfig
import com.bumptech.glide.Glide
import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.transition.Transition
import com.tencent.mm.opensdk.modelmsg.SendMessageToWX
import com.tencent.mm.opensdk.modelmsg.WXMediaMessage
import com.tencent.mm.opensdk.modelmsg.WXMiniProgramObject
import com.tencent.mm.opensdk.openapi.IWXAPI
import com.tencent.mm.opensdk.openapi.WXAPIFactory
import java.io.ByteArrayOutputStream
/**
* Wx share util
*
* @constructor Create empty Wx share util
*/
class WxShareUtil {
private lateinit var api: IWXAPI
/**
* 生成小程序的时间
*
* @param type
* @return
*/
private fun buildTransaction(type: String?): String {
return if (type == null) System.currentTimeMillis()
.toString() else type + System.currentTimeMillis()
}
/**
* 微信小程序分享
* 借鉴两篇文章
* https://www.zhangshengrong.com/p/v710PE9l1M/
* https://blog.csdn.net/qq_41068322/article/details/113761693
*
* @param context
* @param url 小程序网址链接
* @param userName 小程序原始id
* @param path 小程序后面页面的具体链接
* @param title 小程序标题
* @param thumbData 小程序封面图
*/
fun wxAppletShare(
context: Context,
url: String?,
userName: String,
path: String,
title: String,
thumbData: ByteArray
) {
api = WXAPIFactory.createWXAPI(context, "wx8324333262b", true)
api.registerApp(BuildConfig.WX_APP_ID)
//微信分享
val miniProgramObj = WXMiniProgramObject()
miniProgramObj.webpageUrl = url // 兼容低版本的网页链接
miniProgramObj.miniprogramType =
WXMiniProgramObject.MINIPTOGRAM_TYPE_RELEASE // 正式版:0,测试版:1,体验版:2
miniProgramObj.userName = userName // 小程序原始id
miniProgramObj.path = path //小程序页面路径;对于小游戏,可以只传入 query 部分,来实现传参效果,如:传入 "?foo=bar"
val msg = WXMediaMessage(miniProgramObj)
msg.title = title // 小程序消息title
msg.description = "小程序消息Desc" // 小程序消息desc
msg.thumbData = thumbData // 小程序消息封面图片,小于128k
val req: SendMessageToWX.Req = SendMessageToWX.Req()
req.transaction = buildTransaction("miniProgram")
req.message = msg
req.scene = SendMessageToWX.Req.WXSceneSession // 目前只支持会话
api.sendReq(req)
}
/**
* 加载图片
* https://blog.csdn.net/m0_37792384/article/details/111035629
*
* @param context
* @param url
* @param callback
*/
fun loadImage(
context: Context,
url: String?,
callback: ((drawable: Drawable?) -> Unit)? = null
) {
if (url.isNullOrEmpty()) {
callback?.invoke(null)
return
}
Glide.with(context)
.load(url)
.into(
object : CustomTarget<Drawable>() {
override fun onResourceReady(
resource: Drawable,
transition: Transition<in Drawable>?
) {
try {
callback?.invoke(resource)
} catch (e: Exception) {
e.printStackTrace()
callback?.invoke(null)
}
}
override fun onLoadCleared(placeholder: Drawable?) {
}
}
)
}
/**
* 按质量压缩图片
*
* @param bitmap
* @param sizeLimit 压缩到多大
* @return
*/
fun compressBitmap(bitmap: Bitmap, sizeLimit: Long): ByteArray {
val baos = ByteArrayOutputStream()
var quality = 100
bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos)
// 循环判断压缩后图片是否超过限制大小
while (baos.toByteArray().size / 1024 > sizeLimit) {
// 清空baos
baos.reset()
bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos)
quality -= 10
}
return baos.toByteArray()
}
companion object {
/**
* View转Bitmap
* https://blog.csdn.net/u010055598/article/details/103563903
* @param view
* @return
*/
fun convertViewToBitmap(view: View): Bitmap? {
view.measure(
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
)
view.layout(0, 0, view.measuredWidth, view.measuredHeight)
val bitmap = Bitmap.createBitmap(view.width, view.height, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
view.draw(canvas)
return bitmap
}
/**
* Bitmap转换成制定大小
*
* @param bitmapOrg
* @param newWidth
* @param newHeight
* @return
*/
// 放大缩小图片
fun scaleTo(bitmapOrg: Bitmap, newWidth: Int, newHeight: Int): Bitmap? {
val width = bitmapOrg.width
val height = bitmapOrg.height
if (width == 0 || height == 0) {
return bitmapOrg
}
val scaleWidth = (newWidth.toFloat()) / width
val scaleHeight = (newHeight.toFloat()) / height
val matrix = Matrix()
matrix.postScale(scaleWidth, scaleHeight)
return Bitmap.createBitmap(
bitmapOrg,
0,
0,
width,
height,
matrix,
true
)
}
}
}
借鉴了一些文章如下 如有问题请留言
https://www.zhangshengrong.com/p/v710PE9l1M/
https://blog.csdn.net/qq_41068322/article/details/113761693