安卓分享微信小程序

分享小程序展示的封面图需要在 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值