Files
mediaplayer/docs/wechat-share-app-name.md
2026-08-26 11:49:02 +08:00

7.8 KiB
Raw Permalink Blame History

微信分享返回提示显示“八哥口语”改造备忘

背景

当前 Android 配音分享使用系统 Intent.ACTION_SEND,入口位于:

android/sample-app/src/main/java/cn/learningpad/oraltrainer/sample/MainActivity.kt

shareMergedDubbing() 会构造一个 ACTION_SEND Intent然后通过 startActivity(Intent.createChooser(...)) 调起微信或其他应用。

这种方式下,微信只能识别到“第三方应用通过系统分享调起”,无法可靠关联到微信开放平台登记的 App 信息,因此完成后的返回提示通常显示为“留在微信 / 返回第三方工具”。

要让提示变成“返回八哥口语”,需要改为微信官方 OpenSDK 分享,并在微信开放平台完成应用登记。

目标

  1. 配音链接通过微信 OpenSDK 分享为网页卡片。
  2. 微信完成页返回提示能识别并显示“八哥口语”。
  3. 保留现有上传分享链接的逻辑,只替换最终调起微信的方式。

需要提前准备的信息

项目 当前值
应用名称 八哥口语
Android 包名 cn.learningpad.oraltrainer.sample
Gradle namespace cn.learningpad.oraltrainer.sample
微信回调 Activity 包名 cn.learningpad.oraltrainer.sample.wxapi
回调 Activity 类名 WXEntryActivity
本地名称资源 android:label="@string/app_name"

还需要从微信开放平台获取:

  • 微信 AppID
  • 应用签名 MD5
  • 已审核通过的移动应用信息

一、微信开放平台登记

  1. 登录 微信开放平台
  2. 进入“管理中心”,创建或打开移动应用。
  3. 填写应用名称为“八哥口语”。
  4. 配置 Android 应用信息:
    • 包名:cn.learningpad.oraltrainer.sample
    • 签名:使用正式签名 APK 的应用签名 MD5
  5. 提交审核,等待微信开放平台通过。
  6. 审核通过后记录微信 AppID。

注意微信校验的是正式签名。Debug 构建如果也要联调,需要在开放平台补充 Debug 签名,或临时使用与正式签名一致的构建配置。

二、获取正式签名 MD5

安装已签名的 APK 后执行:

adb shell dumpsys package cn.learningpad.oraltrainer.sample | grep -A 2 "Signatures"

更稳妥的方式是使用微信官方提供的生成签名工具,或在本地用正式 keystore 查询证书指纹:

keytool -list -v -alias <key-alias> -keystore <keystore-file>

将结果中的 MD5 去掉冒号并转为小写后填入微信开放平台。

三、添加微信 OpenSDK

修改文件:

android/sample-app/build.gradle.kts

dependencies 中加入:

implementation("com.tencent.mm.opensdk:wechat-sdk-android:6.7.0")

建议实施时检查 Maven 上是否有更新稳定版;如果没有特殊需求,可继续固定当前版本,避免 SDK 行为漂移。

四、初始化微信 API

建议在 MainActivity 中增加:

private lateinit var wxApi: IWXAPI

在创建 Activity 或进入配音功能前初始化:

wxApi = WXAPIFactory.createWXAPI(this, WECHAT_APP_ID, true)
wxApi.registerApp(WECHAT_APP_ID)

WECHAT_APP_ID 应放入构建配置、Manifest metadata 或私有配置中,不要硬编码在业务代码里。

五、替换系统分享调用

保留现有 uploadDubShare(),拿到 shareUrl 后改用:

val webpage = WXWebpageObject().apply {
    webpageUrl = shareUrl
}

val message = WXMediaMessage(webpage).apply {
    title = "我的口语配音"
    description = item.title
}

val request = SendMessageToWX.Req().apply {
    message = message
    transaction = "dub_share"
    scene = SendMessageToWX.Req.WXSceneSession
}

if (!wxApi.sendReq(request)) {
    setDubbingStatus("分享失败:未检测到可用的微信客户端")
} else {
    setDubbingStatus("已生成分享链接:$shareUrl")
}

如需支持朋友圈,把 scene 改为:

SendMessageToWX.Req.WXSceneTimeline

当前需求主要是发给好友或群聊,建议先保持 WXSceneSession

六、新增微信回调 Activity

必须严格按包名规则创建:

android/sample-app/src/main/java/cn/learningpad/oraltrainer/sample/wxapi/WXEntryActivity.kt

示例内容:

package cn.learningpad.oraltrainer.sample.wxapi

import android.app.Activity
import android.content.pm.PackageManager
import android.os.Bundle
import com.tencent.mm.opensdk.modelbase.BaseReq
import com.tencent.mm.opensdk.modelbase.BaseResp
import com.tencent.mm.opensdk.openapi.IWXAPI
import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler
import com.tencent.mm.opensdk.openapi.WXAPIFactory

class WXEntryActivity : Activity(), IWXAPIEventHandler {
    private lateinit var api: IWXAPI

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val info = packageManager.getApplicationInfo(
            packageName,
            PackageManager.GET_META_DATA
        )
        val appId = info.metaData.getString("com.tencent.wechat.APP_ID").orEmpty()
        api = WXAPIFactory.createWXAPI(this, appId, true)
        api.handleIntent(intent, this)
        finish()
    }

    override fun onReq(req: BaseReq) {}

    override fun onResp(resp: BaseResp) {
        finish()
    }
}

七、注册回调 Activity

修改:

android/sample-app/src/main/AndroidManifest.xml

<application> 内添加:

<activity
    android:name=".wxapi.WXEntryActivity"
    android:exported="true"
    android:label="@string/app_name"
    android:launchMode="singleTop"
    android:taskAffinity="cn.learningpad.oraltrainer.sample"
    android:theme="@android:style/Theme.Translucent.NoTitleBar" />

android:label="@string/app_name" 对应中文资源里的“八哥口语”:

android/sample-app/src/main/res/values-zh/strings.xml

八、配置 AppID

推荐方式是在 Manifest 中加:

<meta-data
    android:name="com.tencent.wechat.APP_ID"
    android:value="${wechatAppId}" />

并在 build.gradle.kts 中加:

manifestPlaceholders["wechatAppId"] = "替换为微信AppID"

正式项目建议不要直接提交真实密钥类配置。虽然微信 AppID 本身不是私钥,但仍更适合放到本地配置或 CI 注入。

九、验收清单

  • 正式签名包安装成功。
  • 点击“分享配音”后不再走系统分享面板,而是直接拉起微信。
  • 微信好友会话中出现网页卡片,标题为“我的口语配音”。
  • 卡片点击后能正常打开配音分享页。
  • 分享完成后,微信返回提示显示“八哥口语”相关文案,而不是“第三方工具”。
  • 从微信返回后,八哥口语仍停留在原界面。
  • 未安装微信时给出明确失败提示,不崩溃。
  • Debug 与 Release 的包名和签名策略确认无误。

十、容易踩坑的点

  1. 包名必须完全一致
    WXEntryActivity 必须放在 cn.learningpad.oraltrainer.sample.wxapi 下,否则微信无法回调。

  2. 签名必须是开放平台登记的那个
    Debug 签名和 Release 签名不同时OpenSDK 可能无法正常调起或回调。

  3. 应用名称以微信开放平台为准
    只修改 Android 本地 app_name 不一定足够;微信返回文案依赖开放平台登记的应用信息。

  4. 不要删除现有网页分享逻辑
    uploadDubShare() 仍然负责生成服务端分享链接,微信 OpenSDK 只负责把这个链接作为网页对象发送。

  5. 旧版本微信兼容性
    如果用户微信版本过低,sendReq() 可能返回 false。应给用户明确提示。

结论

这个问题的根因是当前实现使用系统 ACTION_SEND,而不是微信官方 OpenSDK。
要显示“返回八哥口语”,必须完成微信开放平台登记、正式签名绑定,并把分享路径切换为 IWXAPI.sendReq()