Android Kotlin 实现微信分享功能
分享基类:
package com.creatorsaijs.creatorai.uiimport android.annotation.SuppressLint
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.os.Bundle
import com.bumptech.glide.Glide
import com.bumptech.glide.request.target.CustomTarget
import com.creatorsaijs.creatorai.beans.product.AddAccount
import com.creatorsaijs.creatorai.beans.product.ProductInfo
import com.creatorsaijs.creatorai.handler.ShareHandler
import com.creatorsaijs.creatorai.request.product.CreateCountRequest
import com.creatorsaijs.creatorai.request.product.ShareCountRequest
import com.creatorsaijs.http.constants.ApiConstants
import com.creatorsaijs.http.utils.ToastyUtils
import com.creatorsaijs.zwzwidget.enums.ShareType
import com.creatorsaijs.zwzwidget.popup.SharePanelBottomPopup
import com.creatorsaijs.zwzwidget.utils.XPopupUtils
import com.tencent.mm.opensdk.modelmsg.SendMessageToWX/*** 分享基类*/
open class ShareBaseActivity : BaseActivity() {protected var productInfo: ProductInfo? = nullprotected var url: String? = nullprotected val createCountRequest = CreateCountRequest()protected val shareCountRequest = ShareCountRequest()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)}protected fun showShareDialog(showCreateBtn: Boolean?) {val sharePanelBottomPopup = SharePanelBottomPopup(this)sharePanelBottomPopup.setOnShareClick { shareType ->if (shareType == ShareType.WeChat) {//分享到朋友圈share(SendMessageToWX.Req.WXSceneSession)} else if (shareType == ShareType.WeChatMoments) {//分享给好友share(SendMessageToWX.Req.WXSceneTimeline)} else if (shareType == ShareType.Copy) {//复制链接copyLink()}}if (showCreateBtn == false) {sharePanelBottomPopup.rootView.post {// 此时弹窗视图已加载完成,控件可正常访问sharePanelBottomPopup.showTip()}}XPopupUtils.getInstance().showBottomDialog(this, sharePanelBottomPopup)}protected fun share(type: Int) {if (productInfo?.attachmentList?.isEmpty() == true) {ToastyUtils.show("没有任何图片可分享")return}var loadUrl = productInfo?.attachmentList?.get(0)?.attachmentThumbnailUrlif (loadUrl.isNullOrEmpty()) {loadUrl = productInfo?.attachmentList?.get(0)?.attachmentUrl}Glide.with(this).asBitmap().load(loadUrl)// 可选:指定尺寸,避免加载过大 Bitmap 导致 OOM.override(500, 500) // 根据分享需求设置合适尺寸.into(object : CustomTarget<Bitmap>() {override fun onLoadFailed(errorDrawable: Drawable?) {super.onLoadFailed(errorDrawable)ToastyUtils.show("分享失败:图片加载失败")}override fun onResourceReady(resource: Bitmap,transition: com.bumptech.glide.request.transition.Transition<in Bitmap>?) {// 关键修复:使用 ?: 提供默认 Config,处理可空问题val config = resource.config ?: Bitmap.Config.ARGB_8888val shareBitmap = resource.copy(config, true) ?: run {ToastyUtils.show("图片处理失败")return}if (shareBitmap.isRecycled) {ToastyUtils.show("图片已失效")return}// 执行分享逻辑url = ApiConstants.shareURL + "${productInfo?.productId}"ShareHandler.shareUrlToWechat(shareBitmap,url,productInfo?.productTitle,productInfo?.productContent,type)countAfterShare()}override fun onLoadCleared(placeholder: Drawable?) {// 当资源被清除时(如 Activity 销毁),此处可做额外清理}})}@SuppressLint("ServiceCast")protected fun copyLink() {// 1. 要复制的链接(替换为你的实际分享链接)url =ApiConstants.shareURL + "${productInfo?.productId}"// 2. 获取系统剪贴板管理器val clipboardManager =getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager// 3. 创建剪贴板内容(可添加标签,方便区分不同来源的剪贴内容)val clipData = ClipData.newPlainText("分享链接", // 标签(可选,用于标识剪贴内容的类型)url // 实际要复制的文本(链接))// 4. 将内容设置到剪贴板clipboardManager.setPrimaryClip(clipData)// 5. 给用户显示“复制成功”的反馈(提升用户体验)ToastyUtils.show("链接已复制到剪贴板,可粘贴使用")}private fun countAfterShare() {val params = AddAccount().apply {productId = productInfo?.productId}shareCountRequest.create(this@ShareBaseActivity, this@ShareBaseActivity, params)}}