一、申請APPID
微信公共平台和微博分享一樣,也需要申請一個ID,來作為調起微信、分享到微信的唯一標識。
申請微信APPID可以到微信平台http://open.weixin.qq.com/app/list/?lang=zh_CN上申請。具體的申請流程網站上有很詳細的介紹,我這里就僅列出一些注意事項:
(1)申請APPID時的應用名字審核通過之后將不允許更改,所以申請時的應用名字一定要提前確定好。微信官方也有詳細說明,如下圖:
(2)應用簽名問題:應用簽名一定要填寫正確,否則會出現第三方應用拉不起微信的情況。
首先可以下載微信官方提供的一個簽名生成工具,打開這個應用輸入第三方應用的包名就能拿到用於微信的應用簽名。但是這里也有需要注意的地方:
1.我們平時開發使用的keystore是C:\Users\liwei\.android\ debug.keystore,而發布正式版肯定會有一個特定的keystore(比如:XXX.keystore)。因此,我們很有必要申請兩個APPID,一個用於開發測試用,另一個用於正式發版。這樣能夠更方便平時的開發。
2.假如想使用別人的APPID或者運行別人的demo,可以按下面的步驟來做:
在eclipse中打開window--->preferences---->Android---->build如下圖所示:
將別人的C:\Users\liwei\.android\ debug.keystore(微信提供的例子中有帶這個debug.keystore,所以想運行微信提供的例子要在這里加載debug.keystore),在這加載進來,就可以使用了。
(3)申請成功之后的APPID如下:
二、使用微信API接口
1、微信開放平台的一些公共類
(1)微信SDK會用到的主要類的類圖
上面這張圖展示的是與微信通信過程中的請求類和響應類。第三方應用通過他們
附帶的message字段來攜帶消息傳輸給微信進程。其中BaseResp有個內部類是ErrCode,它里面定義了幾個常量字段,當我們向微信發送請求后它會作為返回字段返回到我們的應用中來,我們可以根據這個做相應的處理(比如彈個toast來提醒用戶分享的狀態)。
(2)Message相關的類圖
上面提到過,第三方應用是通過請求類和響應類中的message字段來和微信通信的,那么下面的圖就展示了Message相關類的類圖:
第三方應用和微信就是通過上面的不同種類的Message對象來與微信進行通信,從而能達到想要的效果。
(3)通信相關類
上面的IWXAPI就是所說的通信類,所有與微信進行通信的工作都是他在做,我們可以通過下面的工廠類來生成一個IWXAPI對象。旁邊的IWXAPIEventHandler接口是需要我們第三方應用來實現的,如果我們想處理微信的請求信息或是我們向他發請求后他返回的標識字段,我們可以按照實現這個接口(可以參考微信開放平台文檔上有詳細說明http://open.weixin.qq.com/document/gettingstart/android/?lang=zh_CN)。
2.1.2微信與第三方應用通信時序圖
(4)第三方應用向微信發送消息時的時序圖
應用只需要進行一次注冊就行了,我們可以在一個Acitivity的onCreate()中注冊。然后在以后的使用中只需要封裝消息,讓通信類發送即可。從前面的類圖中可以看到,封裝消息的順序是首先生成需要發送的媒體對象,然后將媒體對象附加到消息對象中,接着建立請求對象,最后使用通信類發送即可。
在向微信發送消息的時候,會彈出一個分享到微信的彈框,包括分享到微信之后的消息展示,都是微信自己定義的UI展示,第三方應用是無法控制的(只是對不同消息類型,微信的展示也是不同的)。
下面就對代碼做簡單的引導性介紹,微信平台做的還是比較不錯的。舉一反三,就能做出來微信的對應功能了。
其對應的代碼大致如下:
注冊到微信
封裝Message(以WXWebpageObject 為例)和發送到微信
(5)第三方應用接收微信請求信息的時序圖
微信向第三方發送的請求信息分為兩種:一種是第三方應用注冊到微信后在聊天界面出現的應用圖標(如下圖所示)。然后點擊這個圖標能向第三方應用發送請求,第二種是針對微信的WXAppExtendObject類型的對象的,當用戶點擊了微信中的消息之后,微信就會去請求第三方應用完成請求。
它的時序圖如下所示:
下面對第三方應用接收微信發送的消息的代碼做一些簡單的介紹,按照以下步驟來就可以了。
1.在工程中建立包名.wxapi的包,其中包名只的是AndroidManifest.xml下面配置的packageName;
2.在新建的包下面新建一個WXEntryActivity類繼承Activity,同時實現IWXAPIEventHandler接口(前面有提到過這個接口,用來接受微信的請求和返回信息)。
3.在onCreate()中調用 mApi.handleIntent(getIntent(), this);來等待微信的回調
4.實現IWXAPIEventHandler的onReq(微信發送請求到第三方應用時,會回調到該方法)和onResp(第三方應用發送到微信的請求處理后的響應結果,會回調到該方法)方法
5.另外需要注意在AndroidManifest.xml中配置WXEntryActivity時需要加上android:exported="true",主要是為了使微信進程能夠調用第三方應用的進程。
其代碼如下:
//在onCreate()中調用handleIntent().來等待微信進程的調用。
//微信進程請求第三方應用的回調。
//第三方應用發送Message到微信之后,微信返回的狀態信息。
3.使用微信API注意事項
3.1微信公共平台問題
微信作為一個公共平台,還有一些自身的問題,下面是對我碰到的問題做一些描述:
1、
第三方應用是根據微信添加的參數isappinstalled來判斷接收方手機上是否已安裝了APP,但是經驗證發現,微信的這個判斷並不准確,即有時候用戶手機上安裝了APP,但是isappinstalled的值卻為0;有時候沒裝APP,isappInstalled的值又為1。已經將這個問題反映給了微信團隊。
2、
測試過程中會出現這種情況,會有個別手機會出現調不起微信客戶端的情況。造成這種情況的原因是微信對縮略圖的大小、title、description等參數的大小做了限制,所以有可能是大小超過了默認的范圍。一般情況下縮略圖超出比較常見。Title、description都是文本,一般不會超過。
3、分享到朋友圈時,是直接在第三方應用上彈出了分享框(這個有區別於分享給好友),分享完成之后,通過HOME鍵再回到微信,發現分享框依舊存在,並且還出現在桌面上。個人猜測,由於微信分享是新開了一個線程來處理,分享完成之后進程並沒有被殺死,所以通過HOME鍵返回微信的時候會用到該進程。這個問題已經向微信反映。
4、通過第三方應用打開微信,假如用戶沒登錄微信,會讓用戶登錄微信,但是登錄完成之后登錄框還存在,並且這個時候其實已經登錄成功了。造成這個問題的原因應該和第三個問題原因相似。
5、按照微信的要求,需要在工程中新建一個”應用包名.wxapi”的包,並在其下建立一個WXEntityActivity類。那么分享完成之后可能有兩種情況發生:
(1)假如沒做任何處理,那么分享完成之后回到第三方應用界面會是一個黑色的界面,啥也沒有。
(2)假如在WXEntityActivity類中在IWXAPIEventHandler接口的實現方法onResp()中調用finish()方法將WXEntityActivity銷毀掉,那么分享完成之后將會閃過一個黑色的界面回到第三方應用。
綜上,其實我們可以發現,微信分享完成之后會到WXEntityActivity這個Activity中,第一種情況,因為WXEntityActivity沒有布局文件,所以就是一個黑色的界面。第二種情況,由於finish掉了WXEntityActivity 這個Activity,所以是黑了一下。
這種情況將WXEntityActivity作為應用的界面展示就沒有問題了,但是正常情況下,我們都是在已有的項目上加微信分享這個邏輯,所以,代碼遷移也是影響比較大的。解決方法是可以用Android系統提供的android:theme="@android:style/Theme.NoDisplay"。
6、可以反編譯下微信的源碼看看。
以上的部分圖片是從其它人寫的博客里copy過來的。歡迎大家交流學習。