Android 生成并分享海报,到微信

本文详细介绍了如何通过微信开放平台实现海报二维码的动态生成,并展示了从环境配置、布局设计、到微信注册和分享功能的完整流程,包括分享到微信、朋友圈和本地下载的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先上效果图:海报二维码 动态生成,背景固定

 分享后,微信看到的效果

第一步:根据微信文档导包,配置环境(权限、回调Activity,拿到appId、混淆等),这里我就不具体介绍了,根据官方文档来就行了

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=1417751808&token=&lang=zh_CN

 

第二步:dialog布局 ,二维码一般就是根据一个URL 地址生成的二维码图片,然后微信用户 长按识别二维码,就能打开链接了

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/line4"
    tools:ignore="MissingConstraints"
    android:paddingTop="@dimen/dp_15"
    android:orientation="vertical"
    >


    <com.caimancang.gzh.cmc.view.MyConstraintLayout
        android:id="@+id/clImageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="visible"
        android:background="@color/colorTransparent"
        android:layout_marginBottom="@dimen/dp_20"
        android:layout_gravity="center_horizontal"
        >
        <ImageView
            android:id="@+id/ivBg"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:src="@mipmap/share_image_bg"
            />

        <ImageView
            android:id="@+id/ivQRCode"
            android:layout_width="@dimen/dp_60"
            android:layout_height="@dimen/dp_60"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            android:layout_marginBottom="@dimen/dp_15"
            app:layout_constraintBottom_toTopOf="@+id/tvLongClick"/>


        <TextView
            android:id="@+id/tvLongClick"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/dp_20"
            android:textColor="@color/colorWhite"
            android:text="长按识别二维码"
            android:textSize="@dimen/sp_8"
            android:gravity="center"
            android:paddingLeft="@dimen/dp_10"
            android:paddingRight="@dimen/dp_10"
            app:layout_constraintLeft_toLeftOf="@+id/ivBg"
            app:layout_constraintRight_toRightOf="@+id/ivBg"
            android:layout_marginBottom="@dimen/dp_20"
            android:background="@drawable/shape_share_image_text_bg"
            app:layout_constraintBottom_toBottomOf="@+id/ivBg"/>
    </com.caimancang.gzh.cmc.view.MyConstraintLayout>


    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/tv1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="@dimen/dp_16"
            android:text="分享到"
            android:textColor="@color/colorBlack"
            android:textSize="@dimen/sp_18"
            app:layout_constraintLeft_toLeftOf="parent" />

        <TextView
            android:id="@+id/tvWX"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="@dimen/sp_14"
            android:text="微信"
            app:layout_constraintHorizontal_chainStyle="spread_inside"
            android:gravity="center"
            app:layout_constraintLeft_toLeftOf="parent"
            android:layout_marginTop="@dimen/dp_30"
            android:drawablePadding="@dimen/dp_11"
            android:layout_marginLeft="@dimen/dp_16"
            app:layout_constraintTop_toBottomOf="@+id/tv1"
            app:layout_constraintRight_toLeftOf="@+id/tvWXFriends"
            android:drawableTop="@mipmap/share_wx"
            android:textColor="@color/colorBlack_59"/>
        <TextView
            android:id="@+id/tvWXFriends"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="@dimen/sp_14"
            android:text="微信朋友圈"
            android:gravity="center"
            android:layout_marginTop="@dimen/dp_30"
            android:drawablePadding="@dimen/dp_11"
            app:layout_constraintLeft_toRightOf="@+id/tvWX"
            app:layout_constraintRight_toLeftOf="@+id/tvDownCode"
            app:layout_constraintTop_toBottomOf="@+id/tv1"
            android:drawableTop="@mipmap/share_wx_friends"
            android:textColor="@color/colorBlack_59"/>


        <TextView
            android:id="@+id/tvDownCode"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="@dimen/sp_14"
            android:text="保存本地"
            android:gravity="center"
            app:layout_constraintRight_toLeftOf="@+id/tvQQ"
            app:layout_constraintLeft_toRightOf="@+id/tvWXFriends"
            android:layout_marginTop="@dimen/dp_30"
            android:drawablePadding="@dimen/dp_11"
            app:layout_constraintTop_toBottomOf="@+id/tv1"
            android:drawableTop="@mipmap/qr_code_down"
            android:visibility="visible"
            android:layout_marginRight="@dimen/dp_30"
            android:textColor="@color/colorBlack_59"/>

        <TextView
            android:id="@+id/tvQQ"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="@dimen/sp_14"
            android:text="QQ"
            android:gravity="center"
            android:visibility="invisible"
            app:layout_constraintLeft_toRightOf="@+id/tvDownCode"
            app:layout_constraintRight_toRightOf="parent"
            android:layout_marginTop="@dimen/dp_30"
            android:drawablePadding="@dimen/dp_11"
            app:layout_constraintTop_toBottomOf="@+id/tv1"
            android:drawableTop="@mipmap/share_qq"
            android:textColor="@color/colorBlack_59"/>

        <TextView
            android:id="@+id/tvDismiss"
            android:layout_width="match_parent"
            android:layout_height="@dimen/dp_50"
            android:text="取消"
            android:gravity="center"
            android:textColor="@color/colorBlack"
            android:textSize="@dimen/sp_15"
            app:layout_constraintTop_toBottomOf="@+id/tvWX"
            android:background="@color/colorWhite"
            android:layout_marginTop="@dimen/dp_40"/>
    </androidx.constraintlayout.widget.ConstraintLayout>

</LinearLayout>

MyConstraintLayout代码,你也可以不用 ConstraintLayout 根据自己需求继承不同布局就行了

重要的是,你要分享出去的海报布局必须在这个父布局里面

class MyConstraintLayout:ConstraintLayout {
    constructor(context: Context) : super(context)

    constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet)

    constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super(context, attributeSet, defStyleAttr)

    fun getBitmap():Bitmap{
        val bitmap = Bitmap.createBitmap(this.width, this.height,Bitmap.Config.ARGB_8888)
        this.draw(Canvas(bitmap))

        return bitmap
    }
}

 

第三步:注册到微信

var mIWXApi: IWXAPI? = null

    private fun regToWX(){
        mIWXApi = WXAPIFactory.createWXAPI(context, "微信appId", true)
        mIWXApi?.registerApp("微信appId")
        //建议动态监听微信启动广播进行注册到微信
        requireActivity().registerReceiver(object : BroadcastReceiver() {
            override fun onReceive(context: Context?, intent: Intent?) {
                // 将该app注册到微信
                mIWXApi?.registerApp(WX_APPID)
            }
        }, IntentFilter(ConstantsAPI.ACTION_REFRESH_WXAPP))

    }

第四步:点击分享 或者 下载

    /**
     * 分享图片到微信
     *
     * @param friendsCircle true:分享到朋友圈  false:分享到微信好友
     */
    private fun shareWXImage(friendsCircle: Boolean){
        //val bmp: Bitmap = BitmapFactory.decodeResource(resources, R.mipmap.share_image)
        //val bmp = requireActivity().capture()

        val clImageView = view?.find<MyConstraintLayout>(R.id.clImageView)
        val bmp = clImageView?.getBitmap()

        if (bmp == null){
            T.showShort(requireContext(),"分享失败")
            return
        }

        val imgObj = WXImageObject(bmp)

        val msg = WXMediaMessage(imgObj)

        //设置缩略图 这里宽高不能设置太大,不然分享会失败 大概250就差不多了
        val thumbBmp = Bitmap.createScaledBitmap(bmp, 200, 200, true)
        bmp.recycle()
        msg.thumbData = thumbBmp.bitToByte()

        //构造一个Req
        val req = SendMessageToWX.Req()
        req.transaction = "image ${System.currentTimeMillis()}"
        req.message = msg
        req.scene = if (friendsCircle) SendMessageToWX.Req.WXSceneTimeline else SendMessageToWX.Req.WXSceneSession
        //调用api接口,发送数据到微信
        val shareSuccess = mIWXApi?.sendReq(req)
        shareSuccess?.let {
            if (!it){
                T.showShort(context,"分享调起失败")
            }
        }
    }

下载代码:

    /**
     * 保存邀请二维码到本地
     */
    private fun saveMediaToStorage(context: Context, bitmap: Bitmap) {
        val filename = "邀请码.jpg"
        var fos: OutputStream? = null

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            context.contentResolver?.also { resolver ->
                val contentValues = ContentValues().apply {
                    put(MediaStore.MediaColumns.DISPLAY_NAME, filename)
                    put(MediaStore.MediaColumns.MIME_TYPE, "image/jpg")
                    put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES)
                }

                val imageUri: Uri? =
                    resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)

                fos = imageUri?.let { resolver.openOutputStream(it) }
            }
        } else {
            val imagesDir =
                Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
            val image = File(imagesDir, filename)
            fos = FileOutputStream(image)
        }

        fos?.use {
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, it)
            T.showShort(context,"保存成功")
        }
    }

扩展:分享链接到微信

 /**
     * 分享链接到微信
     *
     * @param friendsCircle true:分享到朋友圈  false:分享到微信好友
     */
    private fun shareTextWX(friendsCircle: Boolean) {
        //用 WXTextObject 对象初始化一个 WXMediaMessage 对象
        val webpage = WXWebpageObject()
        //分享url
        webpage.webpageUrl = "url"
        val msg = WXMediaMessage(webpage)
        msg.title = "标题"
        msg.description = "描述"
        //icon
        val bit = BitmapFactory.decodeResource(resources, R.mipmap.icon)
        //封面图片byte数组
        if (bit != null) {
            msg.thumbData = bit.bitToByte()
        }

        val req = SendMessageToWX.Req()
        //transaction字段用与唯一标示一个请求
        req.transaction = "url ${System.currentTimeMillis()}"
        req.message = msg
        req.scene = if (friendsCircle) SendMessageToWX.Req.WXSceneTimeline else SendMessageToWX.Req.WXSceneSession

        //调用api接口,发送数据到微信
        val shareSuccess = mIWXApi?.sendReq(req)
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值