最近由于相關需求,需要將微信分享集成到項目中,但在過程中遇到很多問題,現大致整理與此
此次過程中還有些許遺留問題(如無法分享app類型消息),待解決后會來此更新
(希望能有知曉的簡友,給與指導解答,能早點解決)
<h2 id="1">一. APP申請審核</h2>
首先項目集成微信SDK,需要到官網注冊,因為微信對第三方的調用有著嚴格的驗證:App ID,包名,及應用簽名,只有這三個跟申請的都完全匹配,才能調用分享。
按官網(微信開發平臺)提示步驟申請移動應用,步驟都比較簡單,按提示即可,需要說明的如下:
1) 應用官網那欄可以直接填寫你的博客地址或其他
2) 包名需填寫你所要集成項目的包名,后續可修改
3) 應用簽名格式為小寫連續,并且注意填寫簽名的版本
-
1.1 查看項目的應用簽名
-
Eclipse 中查看
-
頂部菜單Window -> Preferences -> Build,打開面板即可看到應用簽名(debug版),如圖
Preferences - >Build - tip:運行下載的官網demo時,需要將簽名文件替換為demo工程目錄中的debug.keystore文件
-
-
Android Studio 中查看
- 找到打包生成應用簽名(
Build-->Generate Signed APK...
)時候所產生的.jks文件
Generate Signed APK...- 打開
Terminal
面板,輸入以下命令行,再輸入生成簽名打包時候的密碼即可:
keytool -list -v -keystore "E:...\簽名文件.jks"
> 
- 找到打包生成應用簽名(
-
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 搭建環境
- 在Eclipse中建立你的工程。
- 在工程中新建一個libs目錄,將開發工具包中libs目錄下的libammsdk.jar復制到該目錄中(如下圖所示,建立了一個名為SDK_Sample 的工程,并把jar包復制到libs目錄下)。
libs
3. 右鍵單擊工程,選擇Build Path中的Configure Build Path...,選中Libraries這個tab,并通過Add Jars...導入工程libs目錄下的libammsdk.jar文件。(如下圖所示)
>Referenced Libraries
在你需要使用微信終端API的文件中導入相應的類:
import com.tencent.mm.sdk.openapi.WXTextObject;
- 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
- WXMediaMessage -- 微信媒體消息內容
-
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則分享不成功,以下有網上找的解決方法:
-
3.3 問題:無法分享App類型消息
- 項目無法分享App,參照微信提供Demo,分享
WXAppExtendObject
類型對象,卻分享失敗,結果如下:
分享App失敗
有哪位大神知曉原因或有做過的,希望能給予解答
- 項目無法分享App,參照微信提供Demo,分享
四. 分享消息回調APP
-
4.1 網頁調起
貌似由于微信加載WebView時添加過濾,所以利用scheme打開APP的方式在微信中失效
-
原理圖示
網頁打開APP-
代碼
- 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>
- HTML
-
擴展
可以根據不同的需求,在網頁上配置不同的scheme字段,并在AndroidManifest.xml相應的Activity中配置所匹配的scheme,從而可以實現根據網頁打開特定界面的需求
-
遺留:其他App參考
京東/CSDN/知乎等APP,在微信中點擊其分享的消息,跳轉的webview頂部有控件,從而實現跳轉
-
-
4.2 遺留:微信API調起
微信提供Demo中,能在微信中點擊由Demo分享的app類型消息,從而跳回Demo,但本地集成中:
- 無法分享App類型消息,既無法分享WXAppExtendObject類型消息
-
按官網提供文檔(4.[3] 接收微信的請求及返回值),新建WXEntryActivity類實現IWXAPIEventHandler接口,APP成功接收分享至微信的結果返回值,但微信發送的請求無反應,既如圖:
官網文檔截圖
百思百度谷歌都無過,不知是否遺漏了什么要點,希望能有高人點解
-
4.3 未添加:判斷是否安裝并根據結果進行下載或直接打開
擴展
- <span id="api">微信API接口</span> -- 以下摘至:[轉載]Android平臺第三方應用分享到微信開發
-
微信開放平臺的一些公共類
- 微信SDK會用到的主要類的類圖
Paste_Image.png
上面這張圖展示的是與微信通信過程中的請求類和響應類。第三方應用通過他們
附帶的message字段來攜帶消息傳輸給微信進程。其中BaseResp有個內部類是ErrCode,它里面定義了幾個常量字段,當我們向微信發送請求后它會作為返回字段返回到我們的應用中來,我們可以根據這個做相應的處理(比如彈個toast來提醒用戶分享的狀態)。- Message相關的類圖
上面提到過,第三方應用是通過請求類和響應類中的message字段來和微信通信的,那么下面的圖就展示了Message相關類的類圖:
第三方應用和微信就是通過上面的不同種類的Message對象來與微信進行通信,從而能達到想要的效果。
- 通信相關類
上面的IWXAPI就是所說的通信類,所有與微信進行通信的工作都是他在做,我們可以通過下面的工廠類來生成一個IWXAPI對象。旁邊的IWXAPIEventHandler接口是需要我們第三方應用來實現的,如果我們想處理微信的請求信息或是我們向他發請求后他返回的標識字段,我們可以按照實現這個接口(可以參考微信開放平臺文檔上有詳細說明http://open.weixin.qq.com/document/gettingstart/android/?lang=zh_CN)。 -
微信與第三方應用通信時序圖
- 第三方應用向微信發送消息時的時序圖
應用只需要進行一次注冊就行了,我們可以在一個Acitivity的onCreate()中注冊。然后在以后的使用中只需要封裝消息,讓通信類發送即可。從前面的類圖中可以看到,封裝消息的順序是首先生成需要發送的媒體對象,然后將媒體對象附加到消息對象中,接著建立請求對象,最后使用通信類發送即可。
在向微信發送消息的時候,會彈出一個分享到微信的彈框,包括分享到微信之后的消息展示,都是微信自己定義的UI展示,第三方應用是無法控制的(只是對不同消息類型,微信的展示也是不同的)。- 第三方應用接收微信請求信息的時序圖
微信向第三方發送的請求信息分為兩種:一種是第三方應用注冊到微信后在聊天界面出現的應用圖標(如下圖所示)。然后點擊這個圖標能向第三方應用發送請求,第二種是針對微信的WXAppExtendObject類型的對象的,當用戶點擊了微信中的消息之后,微信就會去請求第三方應用完成請求。
它的時序圖如下所示:
-
Refs:
android 微信 sdk api調用不成功解決方案運行
Android APP分享功能實現
Android:微信授權登錄與微信分享全解析
Android利用微信SDK分享到微信教程,回調分享結果錯誤解決和注意點,androidsdk
接收微信的請求信息
解決微信開放平臺分享圖片失敗問題
解決微信分享圖片,網址失效的Bug -- 不完美解決
[轉載]Android平臺第三方應用分享到微信開發
Android平臺好友點擊微信分享的內容后跳轉來源App的實現方案研究
微信直接打開App
Android平臺好友點擊微信分享的內容后跳轉來源App的實現方案研究