微信SDK分享功能集成的大坑小坑

最近由于相關(guān)需求,需要將微信分享集成到項目中,但在過程中遇到很多問題,現(xiàn)大致整理與此

此次過程中還有些許遺留問題(如無法分享app類型消息),待解決后會來此更新
(希望能有知曉的簡友,給與指導(dǎo)解答,能早點解決)

<h2 id="1">一. APP申請審核</h2>

首先項目集成微信SDK,需要到官網(wǎng)注冊,因為微信對第三方的調(diào)用有著嚴格的驗證:App ID,包名,及應(yīng)用簽名,只有這三個跟申請的都完全匹配,才能調(diào)用分享。

按官網(wǎng)(微信開發(fā)平臺)提示步驟申請移動應(yīng)用,步驟都比較簡單,按提示即可,需要說明的如下:

1) 應(yīng)用官網(wǎng)那欄可以直接填寫你的博客地址或其他
  2) 包名需填寫你所要集成項目的包名,后續(xù)可修改
  3) 應(yīng)用簽名格式為小寫連續(xù),并且注意填寫簽名的版本

  • 1.1 查看項目的應(yīng)用簽名

    1. Eclipse 中查看

      • 頂部菜單Window -> Preferences -> Build,打開面板即可看到應(yīng)用簽名(debug版),如圖


        Preferences - >Build
      • tip:運行下載的官網(wǎng)demo時,需要將簽名文件替換為demo工程目錄中的debug.keystore文件
    2. Android Studio 中查看

      • 找到打包生成應(yīng)用簽名(Build-->Generate Signed APK...)時候所產(chǎn)生的.jks文件
      Generate Signed APK...
      • 打開Terminal面板,輸入以下命令行,再輸入生成簽名打包時候的密碼即可:

      keytool -list -v -keystore "E:...\簽名文件.jks"

      > ![命令行:最后引號中的路徑即為.jks的文件路徑](http://upload-images.jianshu.io/upload_images/1814468-0f980f06e336b064.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
      
      
    3. Tips

    • 簽名格式:小寫連續(xù)不冒號
      由于以上兩個方式查看到的應(yīng)用簽名都是大寫冒號間隔,如:
      CE:18:7E:D6:7E:05:C2:D8:87:9B:F6:6B:BF:DF:C8:B9
      但是申請時填寫的應(yīng)用簽名需轉(zhuǎn)換為小寫連續(xù)不冒號,既:
      ce187ed67e05c2d8879bf66bbfdfc8b9
      不然會因應(yīng)用簽名不匹配而調(diào)起微信失敗,閃回原程序
    • 申請的簽名與調(diào)試時所用版本是否匹配:release/ debug
      注意調(diào)試時項目是debug的還是打包的relaese版,兩者所對應(yīng)的簽名不同,
    • 清除緩存:
      若因簽名不同,待確認所填寫簽名與使用版本的簽名一致后,清除本地微信緩存或卸載重裝微信后再調(diào)試
    • 官網(wǎng)說明:Android常見問題
      常見問題-部分

二. 環(huán)境配置

  • 2.1 搭建環(huán)境

    1. 在Eclipse中建立你的工程。
    2. 在工程中新建一個libs目錄,將開發(fā)工具包中l(wèi)ibs目錄下的libammsdk.jar復(fù)制到該目錄中(如下圖所示,建立了一個名為SDK_Sample 的工程,并把jar包復(fù)制到libs目錄下)。

    libs
    libs

    3. 右鍵單擊工程,選擇Build Path中的Configure Build Path...,選中Libraries這個tab,并通過Add Jars...導(dǎo)入工程libs目錄下的libammsdk.jar文件。(如下圖所示)
    >
    Referenced Libraries
    Referenced Libraries

    在你需要使用微信終端API的文件中導(dǎo)入相應(yīng)的類:
    import com.tencent.mm.sdk.openapi.WXTextObject;

    1. AndroidManifest.xml 設(shè)置添加必要的權(quán)限支持:
    <code class="code">
        <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
        <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    </code>
    

以上摘至官方文檔,具體詳見Android接入指南
資源下載可至:Android資源下載

三. 分享集成

  • 3.1 接口方法類及屬性

    • WXMediaMessage -- 微信媒體消息內(nèi)容
      • mediaObject描述一個媒體對象的基類
      • 媒體對象包括WXTextObject,WXImageObect 等
    • 分享或收藏的目標場景,通過修改scene場景值實現(xiàn)

      發(fā)送到聊天界面 —— WXSceneSession
      發(fā)送到朋友圈 —— WXSceneTimeline
      添加到微信收藏 —— WXSceneFavorite

  • 3.2 集成:

要使你的程序啟動后微信終端能響應(yīng)你的程序,必須在代碼中向微信終端注冊你的id:
api = WXAPIFactory.createWWXAPI(this,APP_ID,ture);// 第三個參數(shù)作用? api.registerApp(APP_ID)

1. #### Steps:
    > 1. 將要分享的內(nèi)容shareContent,傳給新建出來的相應(yīng)類型媒體對象
    ```
    WXTypeObject typeObj = new WXTypeObject(); // typeObj為分享內(nèi)容類型
    typeObj = shareContent;// 分享內(nèi)容
    ```
    >2. 初始化WXMediaMessage對象,并將帶有分享內(nèi)容的類型媒體對象typeObj賦值給其mediaObject屬性
    ```
    WXMediaMessage msg = new WXMediaMessage();
    msg.mediaObject = typeObject;
    ```
    >3. 構(gòu)造Req,并選擇分享的目標場景**scene**
    ```
    SendMessageToWX.Req req = new SendMessageToWX.Req();
    req.transaction = buildTransaction("text");// 用于唯一標識一個請求
    req.message = msg;
    req.scene = SendMessageToWX.Req.WXSceneSession;
    ```
    >4. 調(diào)用api.sendReq(req);
    ```
    api.sendReq(req);
    ```
    > 每個類型的分享流程大致都如上,只是需要根據(jù)具體的分享類型修改第1,2步驟

2. #### Code
    >- 文字分享
    ```
    // 初始化一個WXTextObject對象,并填寫分享的內(nèi)容
    WXTextObject textObject = new WXTextObject();
    textObject.text = "textObject.text"; // 分享的內(nèi)容,即對方收到的消息
    // 用WXTextObject對象初始化WXMediaMessage對象
    WXMediaMessage msg = new WXMediaMessage();
    msg.mediaObject = textObject;
    msg.description = "description"; // 分享框的title文字
    // 構(gòu)造一個Req
    SendMessageToWX.Req req = new SendMessageToWX.Req();
    // 用于唯一標識一個請求
    req.transaction = buildTransaction("text");
    req.message = msg;
    req.scene = SendMessageToWX.Req.WXSceneSession;// 聊天界面
    // 調(diào)用api接口發(fā)送數(shù)據(jù)到微信
    Toast.makeText(this,"" + api.sendReq(req),Toast.LENGTH_SHORT).show();
    ```
    >- 圖片分享
    ```
    // 獲取索要分享的圖片
     Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.little);
    // 初始化WXImageObject,并將圖片傳入
    WXImageObject imgObject = new WXImageObject(bmp); 
    // 初始化WXMediaMessage對象,并將imgObj賦值給媒體對象mediaObject
    WXMediaMessage msg = new WXMediaMessage();
    msg.mediaObject = imgObject;
    Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, 150, 150, true);
    bmp.recycle();
    msg.thumbData = bmpToByteArray(thumbBmp, true);
    // 構(gòu)造一個Req
    SendMessageToWX.Req req = new SendMessageToWX.Req();
    req.transaction = buildTransaction("img");
    req.message = msg;
    req.scene = SendMessageToWX.Req.WXSceneSession;
    // 調(diào)用api接口發(fā)送數(shù)據(jù)到微信
    Toast.makeText(this,"" + api.sendReq(req),Toast.LENGTH_SHORT).show();
    ```
    >- 其余媒體類型可具體參照-- 微信官方文檔:[分享與收藏功能開發(fā)文檔(Android應(yīng)用)](https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317340&token=09e51320315d0c4a38675f1214ff706ea4a56260&lang=zh_CN)

3. ####Tips:
    >- 注意所分享類型的限制條件,例如分享的文字及圖片有大小限制,所以若圖片縮略圖大于32k則分享不成功,以下有網(wǎng)上找的解決方法:

解決微信分享圖片,網(wǎng)址失效的Bug -- 不完美解決

  • 3.3 問題:無法分享App類型消息

    • 項目無法分享App,參照微信提供Demo,分享WXAppExtendObject類型對象,卻分享失敗,結(jié)果如下:
    分享App失敗

    有哪位大神知曉原因或有做過的,希望能給予解答

四. 分享消息回調(diào)APP

  • 4.1 網(wǎng)頁調(diào)起

    貌似由于微信加載WebView時添加過濾,所以利用scheme打開APP的方式在微信中失效

    1. 原理圖示

    網(wǎng)頁打開APP
    1. 代碼

      • HTML
        <html> <head></head> <body> <a href=testapp://><span>lunch</span></a> <a href=testapp://id=1><span>lunch</span></a> </body> </html>
        >- Android
        <intent-filter > <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSER"/> <data android:scheme="testapp"/> </intent-filter>
    2. 擴展

    可以根據(jù)不同的需求,在網(wǎng)頁上配置不同的scheme字段,并在AndroidManifest.xml相應(yīng)的Activity中配置所匹配的scheme,從而可以實現(xiàn)根據(jù)網(wǎng)頁打開特定界面的需求

    1. 遺留:其他App參考

    京東/CSDN/知乎等APP,在微信中點擊其分享的消息,跳轉(zhuǎn)的webview頂部有控件,從而實現(xiàn)跳轉(zhuǎn)

  • 4.2 遺留:微信API調(diào)起

    微信提供Demo中,能在微信中點擊由Demo分享的app類型消息,從而跳回Demo,但本地集成中:

    1. 無法分享App類型消息,既無法分享WXAppExtendObject類型消息
    2. 按官網(wǎng)提供文檔(4.[3] 接收微信的請求及返回值),新建WXEntryActivity類實現(xiàn)IWXAPIEventHandler接口,APP成功接收分享至微信的結(jié)果返回值,但微信發(fā)送的請求無反應(yīng),既如圖:


      官網(wǎng)文檔截圖

      百思百度谷歌都無過,不知是否遺漏了什么要點,希望能有高人點解

  • 4.3 未添加:判斷是否安裝并根據(jù)結(jié)果進行下載或直接打開

擴展

返回3.1

  • <span id="api">微信API接口</span> -- 以下摘至:[轉(zhuǎn)載]Android平臺第三方應(yīng)用分享到微信開發(fā)
    1. 微信開放平臺的一些公共類

      1. 微信SDK會用到的主要類的類圖
      Paste_Image.png

      上面這張圖展示的是與微信通信過程中的請求類和響應(yīng)類。第三方應(yīng)用通過他們
      附帶的message字段來攜帶消息傳輸給微信進程。其中BaseResp有個內(nèi)部類是ErrCode,它里面定義了幾個常量字段,當我們向微信發(fā)送請求后它會作為返回字段返回到我們的應(yīng)用中來,我們可以根據(jù)這個做相應(yīng)的處理(比如彈個toast來提醒用戶分享的狀態(tài))。

      1. Message相關(guān)的類圖

      上面提到過,第三方應(yīng)用是通過請求類和響應(yīng)類中的message字段來和微信通信的,那么下面的圖就展示了Message相關(guān)類的類圖:



      第三方應(yīng)用和微信就是通過上面的不同種類的Message對象來與微信進行通信,從而能達到想要的效果。

      1. 通信相關(guān)類


      上面的IWXAPI就是所說的通信類,所有與微信進行通信的工作都是他在做,我們可以通過下面的工廠類來生成一個IWXAPI對象。旁邊的IWXAPIEventHandler接口是需要我們第三方應(yīng)用來實現(xiàn)的,如果我們想處理微信的請求信息或是我們向他發(fā)請求后他返回的標識字段,我們可以按照實現(xiàn)這個接口(可以參考微信開放平臺文檔上有詳細說明http://open.weixin.qq.com/document/gettingstart/android/?lang=zh_CN)。

    2. 微信與第三方應(yīng)用通信時序圖

      1. 第三方應(yīng)用向微信發(fā)送消息時的時序圖

      應(yīng)用只需要進行一次注冊就行了,我們可以在一個Acitivity的onCreate()中注冊。然后在以后的使用中只需要封裝消息,讓通信類發(fā)送即可。從前面的類圖中可以看到,封裝消息的順序是首先生成需要發(fā)送的媒體對象,然后將媒體對象附加到消息對象中,接著建立請求對象,最后使用通信類發(fā)送即可。
      在向微信發(fā)送消息的時候,會彈出一個分享到微信的彈框,包括分享到微信之后的消息展示,都是微信自己定義的UI展示,第三方應(yīng)用是無法控制的(只是對不同消息類型,微信的展示也是不同的)。

      1. 第三方應(yīng)用接收微信請求信息的時序圖

      微信向第三方發(fā)送的請求信息分為兩種:一種是第三方應(yīng)用注冊到微信后在聊天界面出現(xiàn)的應(yīng)用圖標(如下圖所示)。然后點擊這個圖標能向第三方應(yīng)用發(fā)送請求,第二種是針對微信的WXAppExtendObject類型的對象的,當用戶點擊了微信中的消息之后,微信就會去請求第三方應(yīng)用完成請求。



      它的時序圖如下所示:


返回3.1

Refs:

android 微信 sdk api調(diào)用不成功解決方案運行
Android APP分享功能實現(xiàn)
Android:微信授權(quán)登錄與微信分享全解析
Android利用微信SDK分享到微信教程,回調(diào)分享結(jié)果錯誤解決和注意點,androidsdk
接收微信的請求信息
解決微信開放平臺分享圖片失敗問題
解決微信分享圖片,網(wǎng)址失效的Bug -- 不完美解決
[轉(zhuǎn)載]Android平臺第三方應(yīng)用分享到微信開發(fā)
Android平臺好友點擊微信分享的內(nèi)容后跳轉(zhuǎn)來源App的實現(xiàn)方案研究
微信直接打開App
Android平臺好友點擊微信分享的內(nèi)容后跳轉(zhuǎn)來源App的實現(xiàn)方案研究

Top

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,716評論 25 709
  • 前言 最近項目中需要分享功能,就集成官方的分享,特此記錄下,便于自己后續(xù)回顧。注意:我都是分享的網(wǎng)址即URL,其他...
    Jsonzhang閱讀 6,296評論 2 11
  • 我愛你,默默的
    小強哈哈閱讀 142評論 1 1
  • 1. 這個主題你不能再鉆了,你做不出的。年近六十的數(shù)學(xué)教授,將一疊厚厚的稿紙緩緩放下,目光決然地望著面前那個瘦長的...
    寫樂保介介閱讀 3,277評論 6 4
  • 三大階段: 第一階段、同心協(xié)力,把會長趕下臺 第二階段、反目成仇,爭搶向老師獻花 第三階段、同心協(xié)力,捉弄保安 第...
    蒼穹一君閱讀 1,806評論 2 4

友情鏈接更多精彩內(nèi)容