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

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

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

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

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

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

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

  • 1.1 查看項目的應用簽名

    1. Eclipse 中查看

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


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

      • 找到打包生成應用簽名(Build-->Generate Signed APK...)時候所產生的.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

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

二. 環境配置

  • 2.1 搭建環境

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

    libs
    libs

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

    在你需要使用微信終端API的文件中導入相應的類:
    import com.tencent.mm.sdk.openapi.WXTextObject;

    1. AndroidManifest.xml 設置添加必要的權限支持:
    <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 -- 微信媒體消息內容
      • mediaObject描述一個媒體對象的基類
      • 媒體對象包括WXTextObject,WXImageObect 等
    • 分享或收藏的目標場景,通過修改scene場景值實現

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

  • 3.2 集成:

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

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

2. #### Code
    >- 文字分享
    ```
    // 初始化一個WXTextObject對象,并填寫分享的內容
    WXTextObject textObject = new WXTextObject();
    textObject.text = "textObject.text"; // 分享的內容,即對方收到的消息
    // 用WXTextObject對象初始化WXMediaMessage對象
    WXMediaMessage msg = new WXMediaMessage();
    msg.mediaObject = textObject;
    msg.description = "description"; // 分享框的title文字
    // 構造一個Req
    SendMessageToWX.Req req = new SendMessageToWX.Req();
    // 用于唯一標識一個請求
    req.transaction = buildTransaction("text");
    req.message = msg;
    req.scene = SendMessageToWX.Req.WXSceneSession;// 聊天界面
    // 調用api接口發送數據到微信
    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);
    // 構造一個Req
    SendMessageToWX.Req req = new SendMessageToWX.Req();
    req.transaction = buildTransaction("img");
    req.message = msg;
    req.scene = SendMessageToWX.Req.WXSceneSession;
    // 調用api接口發送數據到微信
    Toast.makeText(this,"" + api.sendReq(req),Toast.LENGTH_SHORT).show();
    ```
    >- 其余媒體類型可具體參照-- 微信官方文檔:[分享與收藏功能開發文檔(Android應用)](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則分享不成功,以下有網上找的解決方法:

解決微信分享圖片,網址失效的Bug -- 不完美解決

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

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

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

四. 分享消息回調APP

  • 4.1 網頁調起

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

    1. 原理圖示

    網頁打開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. 擴展

    可以根據不同的需求,在網頁上配置不同的scheme字段,并在AndroidManifest.xml相應的Activity中配置所匹配的scheme,從而可以實現根據網頁打開特定界面的需求

    1. 遺留:其他App參考

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

  • 4.2 遺留:微信API調起

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

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


      官網文檔截圖

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

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

擴展

返回3.1

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

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

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

      1. Message相關的類圖

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



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

      1. 通信相關類


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

    2. 微信與第三方應用通信時序圖

      1. 第三方應用向微信發送消息時的時序圖

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

      1. 第三方應用接收微信請求信息的時序圖

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



      它的時序圖如下所示:


返回3.1

Refs:

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

Top

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,002評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,400評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,136評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,714評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,452評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,818評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,812評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,997評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,552評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,292評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,510評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,721評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,121評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,429評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,235評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,480評論 2 379

推薦閱讀更多精彩內容

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