Android開發 對接微信分享SDK總結

来源:https://www.cnblogs.com/stars-one/archive/2022/11/01/16848763.html
-Advertisement-
Play Games

原文:Android開發 對接微信分享SDK總結 - Stars-One的雜貨小窩 公司項目需要對接微信分享,本來之前準備對接友盟分享的,但友盟的分享實際參數太多,而我又只需要對接一個微信分享,於是便是選擇總結對接官方的 順便把微信SDK的APPID申請的流程也一起記錄了 步驟 1.註冊獲得APPI ...


原文:Android開發 對接微信分享SDK總結 - Stars-One的雜貨小窩

公司項目需要對接微信分享,本來之前準備對接友盟分享的,但友盟的分享實際參數太多,而我又只需要對接一個微信分享,於是便是選擇總結對接官方的

順便把微信SDK的APPID申請的流程也一起記錄了

步驟

1.註冊獲得APPID

前往微信公眾平臺,使用企業認證的開發者賬號進行登錄,提交應用包名和簽名指紋文件,可以生成一個appId,有了此appId賬號才能有侯勛的操作

通過輸入命令可查看簽名文件的md5等信息:

keytool -list -v -keystore qj_test.keystore

註意:上述輸完命令後需要輸入密碼,密碼不會顯示出來,密碼正確則會出現下麵的相關md5等信息了

微信平臺比較坑的就是,它要求輸入不要帶:號,且還要小寫的md5數值,我們稍微處理一下:我比較懶,就寫了幾行代碼處理了,代碼如下:

//改為你的md5即可
String md5 = "73:95:50:FB:F9:A9:A6:A3:F2:74:E0:25:64:EB:E7:48";
String result = md5.replaceAll(":", "").toLowerCase();
System.out.println(result);

輸出結果複製一下,就得到了符合規範的md5了

2.添加依賴

implementation 'com.tencent.mm.opensdk:wechat-sdk-android:6.8.0'

官方文檔提供的寫法是不固定版本號的,我這裡覺得還是固定版本號比較好,需要依賴中央倉庫即可

3.初始化啟動分享

// APP_ID 替換為你的應用從官方網站申請到的合法appID
private static final String APP_ID = "wx88888888";

// IWXAPI 是第三方 app 和微信通信的 openApi 介面
private IWXAPI api;

private void regToWx(Context context) {
    // 通過 WXAPIFactory 工廠,獲取 IWXAPI 的實例
    api = WXAPIFactory.createWXAPI(context, APP_ID, true);

    // 將應用的 appId 註冊到微信
    api.registerApp(APP_ID);

    //建議動態監聽微信啟動廣播進行註冊到微信
    context.registerReceiver(new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {

            // 將該 app 註冊到微信
            api.registerApp(APP_ID);
        }
    }, new IntentFilter(ConstantsAPI.ACTION_REFRESH_WXAPP));

}

之後在分享的Activity或Application中進行初始化,調用regToWx(),如

regToWx(MainActivity.this)

PS: 這裡可以看下下麵提到的工具類封裝

4.使用微信分享

經過上面的步驟,我們已經能夠使用微信分享了,使用IWXAPI那個對象即可,具體可以查看文檔WXMediaMessage (微信媒體消息內容)說明 | 微信開放文檔

api.sendReq(req);

不過需要註意一下Android11的適配,需要在AndroidManifest.xml聲明

<queries>
    <!-- 指定微信包名-->
    <package android:name="com.tencent.mm" />
</queries>

這裡我是封裝了一個工具類,源碼在下一章節,主要封裝了分享文本,圖片,視頻和網頁鏈接,至於分享小程式和分享音樂文件沒有需求,就暫時沒有對接,各位可以參考的完善即可

這裡順便補充一下,由於我自己個人沒法成功申請到微信應用平臺的APPID,於是我就是使用了另外項目的的APPID來進行測試

測試的發現,只要你使用同個簽名文件,同時,把build.gradle裡面的applicationId改成填寫的包名,微信分享就是能夠正常的使用

舉個例子,我們有一個應用包名為com.starsone.test的應用已經申請到了APPID

這個時候,我們另外個項目,包名與其不同,但我們想要測試一下分享功能,可以進行以下的操作:

修改app模塊里的build.gradle,將applicationId改為com.starsone.test包名,並使用相同的簽名文件打包即可使用同個APPID測試分享功能了,如下圖所示:

這裡如果使用分享視頻或分享網頁鏈接,在微信中會以消息卡片的形式展示,如下圖所示:

5.添加回調

如果項目中需要對分享成功或失敗進行監聽,來進行進一步的邏輯處理,可以按照微信官方的文檔添加一個WxEntryActivity實現

由於我開發的項目暫時無需,所以沒怎麼研究,這裡稍微簡單的補充一下:

我們需要創建一個WXEntryActivity作為回調的接收,WXEntryActivity沒有頁面,主要實現微信的回調介面IWXAPIEventHandler即可,代碼如下:


public class WXEntryActivity extends Activity implements IWXAPIEventHandler {

    @Override
    public void onReq(BaseReq baseReq) {

    }

    @Override
    public void onResp(BaseResp baseResp) {

    }
}
<activity
    android:name=".wxapi.WXEntryActivity"
    android:exported="true"
    android:launchMode="singleTask"
    android:taskAffinity="com.tyky.share"
    android:theme="@android:style/Theme.Translucent.NoTitleBar"/>

這裡,註意,Activity是要處於你當前包名下的wxapi文件夾,如我自己的例子,當前包名是com.tyky.share,也是我在新建一層wxapi包名,並將Activity放在裡面,如下圖所示

這裡由於我沒有用到,所以就沒有在方法里補充對應的邏輯了

邏輯解釋如下:

通過api.sendReq(req)分享內容,發送的請求會將回調一次 onReq() 方法,之後微信分享完成(成功或取消)之後,會將響應結果將回調到 onResp() 方法

工具類封裝

工具類用到了以下兩個依賴,記得先導入

implementation 'org.apache.commons:commons-lang3:3.9'
// Android的工具類   https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/README-CN.md
implementation 'com.blankj:utilcodex:1.30.6'

PS:微信SDK依賴也不要忘記哦!

點擊查看工具類源碼
package com.tyky.share.utils;

import android.graphics.Bitmap;

import com.blankj.utilcode.util.EncodeUtils;
import com.blankj.utilcode.util.ImageUtils;
import com.blankj.utilcode.util.MetaDataUtils;
import com.tencent.mm.opensdk.modelmsg.SendMessageToWX;
import com.tencent.mm.opensdk.modelmsg.WXImageObject;
import com.tencent.mm.opensdk.modelmsg.WXMediaMessage;
import com.tencent.mm.opensdk.modelmsg.WXTextObject;
import com.tencent.mm.opensdk.modelmsg.WXVideoObject;
import com.tencent.mm.opensdk.modelmsg.WXWebpageObject;
import com.tencent.mm.opensdk.openapi.IWXAPI;

import org.apache.commons.lang3.StringUtils;

import java.io.File;

import static com.tencent.mm.opensdk.modelmsg.SendMessageToWX.Req.WXSceneSession;
import static com.tencent.mm.opensdk.modelmsg.SendMessageToWX.Req.WXSceneTimeline;

/**
 * 參考文檔 [WXMediaMessage (微信媒體消息內容)說明 | 微信開放文檔](https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Share_and_Favorites/Android.html)
 * 微信分享工具類(沒有對接小程式和音樂)
 *
 * @author stars-one
 */
public class WxUtils {

    //從meta里讀取微信平臺的appId
    public static String appId = MetaDataUtils.getMetaDataInApp("wechat_app_id");

    // IWXAPI 是第三方 app 和微信通信的 openApi 介面 初始化在ShareInitializer類中
    public static IWXAPI api;

    /**
     * 分享文本
     *
     * @param text        文本內容(長度需大於 0 且不超過 10KB)
     * @param flag        0:好友 1:朋友圈
     * @param title       分享標題(限制長度不超過 512Bytes)
     * @param description 分享描述(限制長度不超過 1KB)
     */
    public static void shareText(String text, int flag, String title, String description) {
        //初始化一個 WXTextObject 對象,填寫分享的文本內容
        WXTextObject textObj = new WXTextObject();
        textObj.text = text;

        //用 WXTextObject 對象初始化一個 WXMediaMessage 對象
        WXMediaMessage msg = new WXMediaMessage();
        msg.mediaObject = textObj;
        msg.title = title;
        msg.description = description;
        sendMessage(msg, flag);
    }

    /**
     * 分享圖片
     *
     * @param imgBase64   圖片base64數據
     * @param flag        0:好友 1:朋友圈
     * @param title       分享標題(限制長度不超過 512Bytes)
     * @param description 分享描述(限制長度不超過 1KB)
     */
    public static void sharePicture(String imgBase64, int flag, String title, String description) {
        //base64數據處理
        String data = imgBase64;
        if (data.contains("base64,")) {
            data = org.apache.commons.lang3.StringUtils.substringAfter(data, "base64,");
        }
        byte[] bytes = EncodeUtils.base64Decode(data);
        Bitmap bitmap = ImageUtils.bytes2Bitmap(bytes);

        //使用file存放,突破微信分享的限制
        File file = ImageUtils.save2Album(bitmap, Bitmap.CompressFormat.PNG);
        sharePictureByImgFilePath(file.getPath(), flag, title, description);
    }

    /**
     * 分享圖片
     *
     * @param imgFilePath 圖片本地路徑
     * @param flag        0:好友 1:朋友圈
     * @param title       分享標題(限制長度不超過 512Bytes)
     * @param description 分享描述(限制長度不超過 1KB)
     */
    public static void sharePictureByImgFilePath(String imgFilePath, int flag, String title, String description) {
        //初始化一個 WXImageObject 對象,填寫分享圖片
        WXImageObject wxImageObject = new WXImageObject();
        wxImageObject.imagePath = imgFilePath;

        //用 WXTextObject 對象初始化一個 WXMediaMessage 對象
        WXMediaMessage msg = new WXMediaMessage();
        msg.mediaObject = wxImageObject;
        msg.title = title;
        msg.description = description;
        sendMessage(msg, flag);
    }

    /**
     * 分享視頻(分享給好友會以消息卡片展示)
     *
     * @param videoUrl    視頻鏈接(文本長度不能超過10KB)
     * @param flag        0:好友 1:朋友圈
     * @param title       分享標題(限制長度不超過 512Bytes)
     * @param description 分享描述(限制長度不超過 1KB)
     * @param thumbData   縮略圖base64(不能超過32KB)
     */
    public static void shareVideo(String videoUrl, int flag, String title, String description, String thumbData) {
        //初始化一個 WXImageObject 對象,填寫分享圖片
        WXVideoObject wxImageObject = new WXVideoObject();
        wxImageObject.videoUrl = videoUrl;

        //用 WXTextObject 對象初始化一個 WXMediaMessage 對象
        WXMediaMessage msg = new WXMediaMessage();
        msg.mediaObject = wxImageObject;
        msg.title = title;
        msg.description = description;
        if (StringUtils.isNotBlank(thumbData)) {
            String data = thumbData;
            if (data.contains("base64,")) {
                data = org.apache.commons.lang3.StringUtils.substringAfter(data, "base64,");
            }
            byte[] bytes = EncodeUtils.base64Decode(data);
            Bitmap bitmap = ImageUtils.bytes2Bitmap(bytes);
            msg.setThumbImage(bitmap);
        }
        sendMessage(msg, flag);
    }

    /**
     * 分享網頁(分享給好友會以消息卡片展示)
     *
     * @param webUrl      網頁鏈接(文本長度不能超過10KB)
     * @param flag        0:好友 1:朋友圈
     * @param title       分享標題(限制長度不超過 512Bytes)
     * @param description 分享描述(限制長度不超過 1KB)
     * @param thumbData   縮略圖base64(不能超過32KB)
     */
    public static void shareWeb(String webUrl, int flag, String title, String description, String thumbData) {
        //初始化一個 WXImageObject 對象,填寫分享圖片
        WXWebpageObject wxImageObject = new WXWebpageObject();
        wxImageObject.webpageUrl = webUrl;

        //用 WXTextObject 對象初始化一個 WXMediaMessage 對象
        WXMediaMessage msg = new WXMediaMessage();
        msg.mediaObject = wxImageObject;
        msg.title = title;
        msg.description = description;

        if (StringUtils.isNotBlank(thumbData)) {
            String data = thumbData;
            if (data.contains("base64,")) {
                data = org.apache.commons.lang3.StringUtils.substringAfter(data, "base64,");
            }
            byte[] bytes = EncodeUtils.base64Decode(data);
            Bitmap bitmap = ImageUtils.bytes2Bitmap(bytes);
            msg.setThumbImage(bitmap);
        }
        sendMessage(msg, flag);
    }


    /**
     * @param msg  分享內容實體數據
     * @param flag 0:好友 1:朋友圈
     */
    private static void sendMessage(WXMediaMessage msg, int flag) {
        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.transaction = String.valueOf(System.currentTimeMillis());  //transaction欄位用與唯一標示一個請求
        req.message = msg;

        //朋友圈:WXSceneTimeline
        //會話:WXSceneSession
        if (flag == 1) {
            req.scene = WXSceneTimeline;
        } else {
            req.scene = WXSceneSession;
        }

        //調用 api 介面,發送數據到微信
        api.sendReq(req);
    }
}

工具類使用的時候,記得在註冊的時候一起進行初始化,把上述第三步的初始化方法代碼改為如下麵:

private void regToWx(Context context) {
    String APP_ID = WxUtils.appId;

    // 通過 WXAPIFactory 工廠,獲取 IWXAPI 的實例
    WxUtils.api = WXAPIFactory.createWXAPI(context, APP_ID, true);

    // 將應用的 appId 註冊到微信
    WxUtils.api.registerApp(APP_ID);

    //建議動態監聽微信啟動廣播進行註冊到微信
    context.registerReceiver(new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {

            // 將該 app 註冊到微信
            WxUtils.api.registerApp(APP_ID);
        }
    }, new IntentFilter(ConstantsAPI.ACTION_REFRESH_WXAPP));
}

之後在Application或Activity進行初始化,其他步驟不變

踩坑總結

1、配置簽名的坑

解決:一定要MD5、小寫、不要帶冒號,最好用官方給的簽名獲取工具。

2、沒有註冊API

解決:API是運行重覆註冊的,並且也不是耗時任務,所以不妨放在Activity的onCreate下麵,記得寫這個。

3、分享的圖標

解決:分享的圖標大小不能超過32K,要是jpg格式。

3、分享圖標自己能看到,好友看不到

解決:修改分享的標題和內容,不要觸及微信的敏感詞檢測系統,多試幾下。

4、沒有回調

解決:一定要註意WXEntryActivity的包名路徑是否正確,已經配置export=true

5、確定了問題4後還是調不起來

你確定有在WXEntryActivity的onCreate裡面註冊API並且調用 api.handleIntent(getIntent(), this);? 估計你沒有吧?

6、回調到其他頁面

解決:沒辦法直接回調到其他頁面,但可以通過廣播、EventBus等通知的實現來通知其他頁面刷新,同時結束WXEntryActivity的頁面。

參考


提問之前,請先看提問須知 點擊右側圖標發起提問 聯繫我 或者加入QQ群一起學習 Stars-One安卓學習交流群 TornadoFx學習交流群:1071184701
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本章開始`LyShark`將介紹如何在內核中實現`InlineHook`掛鉤這門技術,內核掛鉤的第一步需要實現一個動態計算彙編指令長度的功能,該功能可以使用`LDE64`這個反彙編引擎,該引擎小巧簡單可以直接在驅動中使用,LDE引擎是`BeaEngine`引擎的一部分,後來讓`BeatriX`打包成... ...
  • 今天我們來聊一聊關於JWT授權的事情。 JWT:Json Web Token。顧名思義,它是一種在Web中,使用Json來進行Token授權的方案。 既然沒有找好密碼,token是如何解決信任問題的呢? 解決信任問題,只需要解決兩個問題即可: token是不是來自我信任的機構頒發 token中的信息 ...
  • 操作mysql的命令 cmd命令行中查看mysql版本: mysql -V mysql --version 登陸mysql: mysql -uroot -pluis mysql -uroot -p 在mysql中查看資料庫版本: select version(); 查看所有資料庫: show dat ...
  • 1 環境準備 192.168.1.34 伺服器A(主機) 192.168.1.35 伺服器B(從機) 2 安裝mysql MySQL版本: 這裡採用Server version: 5.7.35 MySQL Community Server (GPL) 我們把安裝在“伺服器A”的資料庫稱作“主資料庫” ...
  • 近日,國內領先的數字化技術與服務提供商——袋鼠雲宣佈完成過億元C+輪融資,本輪融資由源星昱瀚基金、國中資本、深創投投資。 本輪融資資金將主要用於袋鼠雲核心產品的研發、產品生態體系建設和市場營銷推廣等方面。一直以來,袋鼠雲都牢記“讓數據產生價值”的使命,以科技創新驅動發展,不斷迭代優化解決方案和生態結 ...
  • MongoDB 是一個基於分散式文件存儲的資料庫,因此其常作為使用了大數據技術的公司的優選;MongoDB 的存儲是類 JSON 結構,因此在一些敏捷 Web 開發中也常使用到。 ...
  • ①MVCC定義,用處,快照讀,當前讀 ②MVCC實現原理:隱藏欄位,readview,undo log ③readview訪問規則 ④事務隔離級別的具體實現 ...
  • 大多數QQ模板都要黃鑽,真是好奇到底有幾個免費的,於是寫了一個爬蟲。寫的過程中遇到了一些新的問題,在此做一個記錄。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...