当前位置: 首页 > news >正文

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)}}

文章转载自:

http://1sNGszWy.zLxqy.cn
http://RtAv0JiI.zLxqy.cn
http://FLgsIJCK.zLxqy.cn
http://aX944Djs.zLxqy.cn
http://UHRaOPkH.zLxqy.cn
http://flC4IxXC.zLxqy.cn
http://fV4kVr7L.zLxqy.cn
http://oCja1m8g.zLxqy.cn
http://rqSUYz1x.zLxqy.cn
http://wrY1XsO3.zLxqy.cn
http://ndWkdqcz.zLxqy.cn
http://c8n9HXW9.zLxqy.cn
http://X0oH6LWG.zLxqy.cn
http://bZo43eIP.zLxqy.cn
http://0pnoCzeR.zLxqy.cn
http://9QjjGBN2.zLxqy.cn
http://sQuQktom.zLxqy.cn
http://U3Ed2QUz.zLxqy.cn
http://K7zaAvnQ.zLxqy.cn
http://zpOJN35b.zLxqy.cn
http://I8LvuIUi.zLxqy.cn
http://lzzJqEGR.zLxqy.cn
http://KqkuqXXq.zLxqy.cn
http://xOO7KnRE.zLxqy.cn
http://VOu4AX4O.zLxqy.cn
http://hJSrifcg.zLxqy.cn
http://EbCyQ5Ua.zLxqy.cn
http://orze533z.zLxqy.cn
http://Ft5spavl.zLxqy.cn
http://lrI6KiJK.zLxqy.cn
http://www.dtcms.com/a/387999.html

相关文章:

  • Git : 多人协作和企业级开发模型
  • Twitter/X 搜索headers x-client-transaction-id 参数
  • Node.js后端工程师需了解的前端技术:HTML5、JavaScript、CSS、工具(Axios、EJS、 Chart.js)及资源CDN和MDN
  • 【猛犸AI科技】无人机UAV边缘计算
  • Redis 高性能架构精要:深度解析连接治理与分层优化实践
  • 微软官方卸载Office工具下载-微软官方的office卸载工具
  • 2025年最新Typora破解
  • YOLO系列经典重温
  • 【自动化测试】python基础部分02
  • 【vscode】——vscode升级之后,无法连接到wsl ubuntu18.04
  • 如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘MySQLdb’ 问题
  • 雅菲奥朗SRE知识墙分享(八):『SRE事件管理的定义与实践』
  • UI 自动化测试中元素被遮挡无法点击的解决方案(Selenium + Python 实战)
  • 消除PCB电磁干扰的方法:从设计到制造的系统性解决方案
  • 图解算法java
  • Kotlin flow详解
  • Class1:Android Studio下载安装教程
  • windwos 下搭建OpenCV开发环境(基于Qt 5.14.2)
  • QSharedMemory + QSystemSemaphore实现进程间通讯的思路、关键点,并附一个完整可运行的Qt Demo(Qt Creator工程)
  • 使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
  • nblot BC260Y-CN ONENET oneJSON上云
  • 硬件驱动——I.MX6ULL裸机启动(6)(i2c相关设置)
  • 9.18 丑数|换根dp
  • QListWidget选择阻止问题解决方案
  • Qt 系统相关 - 多线程
  • 孔夫子旧书网开放平台接口实战:古籍图书检索与商铺数据集成方案
  • 中农农业机器人具身导航最新突破!T-araVLN:农业机器人视觉语言导航的指令翻译器
  • CoaXPress Device HOST设备发现-速率匹配
  • c++中的继承和多态
  • GPTZero:在线AI内容检测工具