capability-share/src/
└── main/
├── AndroidManifest.xml # Android 清单文件(权限声明)
└── java/
└── com/narutohuo/xindazhou/share/
├── api/ # API 接口层
│ └── ShareService.kt # 分享服务接口定义(统一 share() 方法 + 9个平台方法)
├── factory/ # 工厂类层
│ └── ShareServiceFactory.kt # 服务工厂(统一入口,单例获取)
├── impl/ # 实现层
│ └── ShareServiceImpl.kt # 分享服务具体实现(封装友盟SDK)
├── ui/ # UI层
│ ├── ShareDialogFragment.kt # 分享弹窗(封装在模块内部)
│ └── ShareProxyActivity.kt # 透明代理 Activity(自动处理 onActivityResult)
└── model/ # 数据模型层
├── ShareResponse.kt # 分享相关的数据模型
│ ├── ShareContent # 分享内容模型
│ ├── ShareResponse # 分享响应模型
│ └── SharePlatform # 分享平台枚举
└── ShareConfig.kt # 分享服务配置模型
├── ShareConfig # 主配置类
├── WeChatConfig # 微信平台配置
├── QQConfig # QQ平台配置
└── WeiboConfig # 微博平台配置
ShareService 接口
share() - 统一分享方法(推荐使用,业务层调用)ShareContent.platform 已指定,直接分享到该平台ShareContent.platform 为 null,显示分享弹窗让用户选择shareManual() - 手动分享方法(内部使用,避免递归调用)ShareProxyActivity 内部调用,业务层不应直接使用showShareDialog() - 显示分享弹窗(底部弹出)ShareServiceFactory 单例工厂init() 方法统一初始化,避免在 Application 中直接调用服务方法getInstance() 方法获取服务实例ShareService 接口的具体逻辑ShareServiceImpl 单例实现类initialize())onActivityResult())- 通过透明代理 Activity 自动处理release())share() 方法,自动使用透明代理 Activity,业务层无需处理回调shareManual() 方法(内部使用,避免递归调用),供 ShareProxyActivity 调用showShareDialog() 方法,显示分享弹窗ShareDialogFragment - 分享弹窗(底部弹出)ShareProxyActivity - 透明代理 Activity(自动处理 onActivityResult)FragmentActivity,支持显示 ShareDialogFragmentonActivityResultshareManual() 方法避免递归调用ShareContent - 分享内容模型(标题、描述、URL、图片等)ShareContent.builder() 链式调用构建,支持灵活的参数组合platform: SharePlatform? 字段
ShareResponse - 分享响应模型(成功/失败、错误信息等)SharePlatform - 分享平台枚举(9个平台)ShareConfig - 分享服务配置模型(封装友盟和各平台配置)WeChatConfig - 微信平台配置QQConfig - QQ平台配置WeiboConfig - 微博平台配置onActivityResult,业务层无需关心实现细节✅ SDK 依赖已添加
com.umeng.umsdk:common:9.6.8 - 友盟基础库com.umeng.umsdk:share-core:7.3.2 - 友盟分享核心库com.umeng.umsdk:share-board:7.3.2 - 友盟分享面板com.umeng.umsdk:share-wx:7.3.2 - 微信分享com.umeng.umsdk:share-qq:7.3.2 - QQ分享com.umeng.umsdk:share-sina:7.3.2 - 新浪微博分享✅ 代码实现已完成
ShareServiceImpl 已实现友盟分享 SDK 调用ShareServiceFactory 已创建在 app/src/main/AndroidManifest.xml 中添加权限声明(meta-data 配置已通过代码完成,无需在 Manifest 中配置):
<manifest>
<!-- 友盟分享权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application>
<!-- 注意:友盟和各平台的配置已通过代码完成(见步骤4),无需在此配置 meta-data -->
</application>
</manifest>
说明:
在 app/src/main/res/values/strings.xml 中配置分享参数(推荐方式,配置统一管理):
<!-- app/src/main/res/values/strings.xml -->
<resources>
<!-- 友盟配置(必填) -->
<string name="share_umeng_app_key">您的友盟 AppKey</string>
<string name="share_umeng_channel">developer-default</string>
<!-- 微信平台配置(可选) -->
<string name="share_wechat_app_id">您的微信 AppID</string>
<string name="share_wechat_app_secret">您的微信 AppSecret</string>
<!-- QQ平台配置(可选) -->
<string name="share_qq_app_id">您的QQ AppID</string>
<string name="share_qq_app_key">您的QQ AppKey</string>
<!-- 微博平台配置(可选) -->
<string name="share_weibo_app_key">您的新浪微博 AppKey</string>
<string name="share_weibo_app_secret">您的新浪微博 AppSecret</string>
<string name="share_weibo_redirect_url">您的新浪微博回调地址</string>
</resources>
在您的 XinDaZhouApplication 类中初始化分享服务,支持三种方式:
// app/src/main/java/com/narutohuo/xindazhou/XinDaZhouApplication.kt
package com.narutohuo.xindazhou
import android.app.Application
import com.narutohuo.xindazhou.share.factory.ShareServiceFactory
class XinDaZhouApplication : Application() {
override fun onCreate() {
super.onCreate()
// ========== 初始化分享服务(最简单,从资源文件读取配置)==========
ShareServiceFactory.init(context = this)
}
}
优势:
ShareServiceFactory.init() 统一初始化,代码更清晰重要更新:分享功能已完全封装,业务层不需要在 MainActivity 中处理 onActivityResult!
分享组件内部使用透明代理 Activity 自动处理所有回调,业务层只需要调用 share() 方法即可:
// app/src/main/java/com/narutohuo/xindazhou/user/ui/profile/UserFragment.kt
class UserFragment : Fragment() {
private val shareService = ShareServiceFactory.getInstance()
private fun shareContent() {
val content = ShareContent.builder()
.setTitle("分享标题")
.setDescription("分享描述")
.setUrl("https://example.com")
.build()
// 直接调用 share() 方法,自动处理所有回调
shareService.share(requireActivity(), content) { response ->
if (response.success) {
Toast.makeText(requireContext(), "分享成功", Toast.LENGTH_SHORT).show()
}
}
}
}
说明:
onActivityResult,所有回调都在组件内部处理share() 方法,传入分享内容和回调即可shareToWeChat()shareToWeChatMoments()shareToQQ()shareToQZone()shareToWeibo()shareToDouyin() - 待实现shareToXiaohongshu() - 待实现shareToKuaishou() - 待实现shareToSystem() - 调用系统分享菜单分享功能在 Fragment 中使用:
// app/src/main/java/com/narutohuo/xindazhou/user/ui/profile/UserFragment.kt
package com.narutohuo.xindazhou.user.ui.profile
import android.view.View
import android.widget.Button
import android.widget.Toast
import androidx.fragment.app.Fragment
import com.narutohuo.xindazhou.R
import com.narutohuo.xindazhou.share.factory.ShareServiceFactory
import com.narutohuo.xindazhou.share.model.ShareContent
import com.narutohuo.xindazhou.share.model.ShareResponse
import timber.log.Timber
class UserFragment : Fragment() {
// 获取分享服务实例(单例)
private val shareService = ShareServiceFactory.getInstance()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// 示例:分享按钮点击
view.findViewById<Button>(R.id.btnShare)?.setOnClickListener {
shareContent()
}
}
/**
* 分享内容示例(推荐:使用统一的 share() 方法)
*/
private fun shareContent() {
// 创建分享内容(使用 Builder 模式)
val content = ShareContent.builder()
.setTitle("新大洲智能车控")
.setDescription("分享给您一个有趣的内容")
.setUrl("https://example.com/share/123")
.setImageUrl("https://example.com/image.jpg")
.setThumbImageUrl("https://example.com/thumb.jpg")
// 不设置 platform,会显示分享弹窗
.build()
// 方式1:统一方法(推荐)- 显示分享弹窗,用户选择平台
shareService.share(requireActivity(), content) { response: ShareResponse ->
if (response.success) {
// response.data 就是用户选择的平台(SharePlatform)
val platform = response.data // 例如:SharePlatform.WECHAT、SharePlatform.QQ 等
Timber.d("分享成功: 平台=${platform}")
Toast.makeText(requireContext(), "分享成功到:${platform}", Toast.LENGTH_SHORT).show()
} else {
Timber.e("分享失败: ${response.errorMessage}")
Toast.makeText(requireContext(), "分享失败: ${response.errorMessage}", Toast.LENGTH_SHORT).show()
}
}
}
}
关键点:
requireActivity() 获取 Activity 实例MainActivity 中处理 onActivityResultshare() 方法,传入分享内容和回调即可// 方式1:完整参数(网页分享)
val content1 = ShareContent.builder()
.setTitle("分享标题")
.setDescription("分享描述")
.setUrl("https://example.com")
.setImageUrl("https://example.com/image.jpg")
.setThumbImageUrl("https://example.com/thumb.jpg")
.build()
// 方式2:仅文本(纯文本分享)
val content2 = ShareContent.builder()
.setTitle("分享标题")
.setDescription("分享描述")
.build()
// 方式3:图片分享(无链接)
val content3 = ShareContent.builder()
.setTitle("图片分享")
.setDescription("这是一张图片")
.setImageUrl("https://example.com/image.jpg")
.build()
// 方式4:链式调用,灵活组合
val content4 = ShareContent.builder()
.setTitle("标题")
.setDescription("描述")
.setUrl("https://example.com")
.build() // 只设置必填项,其他可选参数不设置
Builder 模式优势:
build() 时统一检查以下平台接口已暴露,具体实现待完成:
shareToDouyin() - 待实现shareToXiaohongshu() - 待实现shareToKuaishou() - 待实现