Android 第三方應(yīng)用接入微信平臺(tái)研究情況分享(二)
微信平臺(tái)開放后倒是挺火的,許多第三方應(yīng)用都想試下,畢竟可以利用微信建立起來的關(guān)系鏈來拓展自己的應(yīng)用還是挺不錯(cuò)的,可以節(jié)約很多在社交方面的開銷,我最近由于實(shí)習(xí)需要也在研究這個(gè)東西,不過發(fā)現(xiàn)網(wǎng)上的相關(guān)資料還是挺少的,這里把我的整個(gè)研究情況給出來,希望可以共同學(xué)習(xí)。
二、第三方應(yīng)用與微信通信的時(shí)序圖
2、接收微信的請(qǐng)求信息

前面四步和之前的“1、向微信發(fā)送消息”是一樣的,不需要重復(fù)執(zhí)行,這里給出來只是為了
流程的整體性。當(dāng)我們注冊(cè)后,應(yīng)用圖標(biāo)會(huì)出現(xiàn)在微信聊天的列表中,點(diǎn)擊加號(hào)即可去添加,
添加后,如果聊天時(shí)點(diǎn)擊應(yīng)用圖標(biāo)將會(huì)回調(diào)第三方應(yīng)用,如上面時(shí)序圖所示。這里補(bǔ)充一點(diǎn),
當(dāng)我們向微信發(fā)消息的媒體類型是appdata類型,即WXAppExtendObject對(duì)象時(shí),好友在
收到消息時(shí)點(diǎn)擊消息,會(huì)出現(xiàn)類似的回調(diào)過程,需要修改的就是此時(shí)onReq被調(diào)用時(shí),type
為ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX而不是ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX 。
當(dāng)我們?cè)趏nReq方法中接到ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX
類型的消息時(shí),如果想要把響應(yīng)發(fā)回微信,可用如下代碼段來實(shí)現(xiàn)

可以發(fā)現(xiàn)響應(yīng)的消息對(duì)象和發(fā)請(qǐng)求是一樣的,下面看看效果圖
這是聊天窗口,前提是你已經(jīng)點(diǎn)擊加號(hào)將應(yīng)用添加到下面的列表中

此時(shí),如果點(diǎn)擊第三方應(yīng)用,會(huì)回調(diào)我們?cè)O(shè)置好的界面

這個(gè)界面是自己定義的,你可以在接到微信的請(qǐng)求后自定義響應(yīng)界面。
說了半天,還沒說到onReq方法或是前面講的onResp方法的由來,
也就是說如果我們想要處理給微信發(fā)請(qǐng)求后的回饋或是響應(yīng)微信的請(qǐng)求
應(yīng)該怎么做,我們需要下面3步操作:
a. 可以在你的包名相應(yīng)目錄下新建一個(gè)wxapi目錄,并在該wxapi目錄下新增一個(gè)
WXEntryActivity類,該類繼承自Activity(當(dāng)然這個(gè)路徑是自定義的,隨便你自己)
并在manifest文件里面加上exported屬性,設(shè)置為true,例如:
<activity
android:name=".wxapi.WXEntryActivity"
android:exported="true"
android:label="@string/app_name"
android:launchMode="singleTop" >
b. 實(shí)現(xiàn)IWXAPIEventHandler接口,微信發(fā)送的請(qǐng)求將回調(diào)到onReq方法,發(fā)送
到微信請(qǐng)求的響應(yīng)結(jié)果將回調(diào)到onResp方法
終于出現(xiàn)了這兩個(gè)神奇的方法,可以看看他們的大致用法
<SPAN style="FONT-SIZE: 18px; FONT-FAMILY: Microsoft YaHei"> @Override
public void onReq(BaseReq req) {
switch (req.getType()) {
case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:
goToGetMsg();
break;
case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
goToShowMsg((ShowMessageFromWX.Req) req);
break;
default:
break;
}
}</SPAN>
<SPAN style="FONT-SIZE: 18px; FONT-FAMILY: Microsoft YaHei"> @Override
public void onResp(BaseResp resp) {
int result = 0;
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:
result = R.string.errcode_success;
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
result = R.string.errcode_cancel;
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
result = R.string.errcode_deny;
break;
default:
result = R.string.errcode_unknown;
break;
}
Toast.makeText(this, result, Toast.LENGTH_LONG).show();
}</SPAN>
c. 在WXEntryActivity中將接收到的intent及實(shí)現(xiàn)了IWXAPIEventHandler接口的對(duì)
象傳遞給IWXAPI接口的handleIntent方法:
api.handleIntent(intent, this);
ok,這三步可以結(jié)合時(shí)序圖一起來理解,都可以一一對(duì)應(yīng)的。
最后給出一些注意點(diǎn),也是容易混淆的,我都寫過Demo驗(yàn)證過了,如果大家覺得有不對(duì)的,歡迎指出,歡迎討論
1、注冊(cè)是本地注冊(cè),且只需要注冊(cè)一次,但是在發(fā)送的時(shí)候微信服務(wù)器會(huì)檢測第三方應(yīng)用的合法性
2、說白了就是在本地第三方應(yīng)用將要發(fā)送的內(nèi)容先發(fā)給微信進(jìn)程,微信進(jìn)程收到后再將消息發(fā)給自己的微信好友
3、卸載或者反注冊(cè)后,第三方應(yīng)用將不會(huì)出現(xiàn)在本機(jī)微信的可添加應(yīng)用列表中
4、使用微信開放平臺(tái)發(fā)送的媒體對(duì)象中,網(wǎng)頁,音頻和視頻只能是網(wǎng)絡(luò)URL,圖片可發(fā)送本地路徑,本地字節(jié)數(shù)據(jù),網(wǎng)絡(luò)URL,文件可以發(fā)送本地字節(jié)數(shù)據(jù)和本地路徑,附帶在媒體對(duì)象中的字節(jié)數(shù)組,微信默認(rèn)會(huì)是點(diǎn)擊則給出下載界面,下載后存儲(chǔ)的路徑是在/sdcard/Tecent/MicroMsg/本機(jī)微信帳號(hào)(一般是一串字母數(shù)字的組合體)/attachment文件夾下,這個(gè)路徑不需要自己去記錄,微信會(huì)在媒體對(duì)象的filepath字段中記錄,此時(shí)一定注意的是當(dāng)你響應(yīng)微信的show請(qǐng)求時(shí),媒體對(duì)象中的filedata字段是為空的,即使你在發(fā)送的時(shí)候附帶在了這個(gè)字段中,如前面所說,只能用filepath這個(gè)字段。
如果要自行處理只能是appdata類型數(shù)據(jù),理由下面給出:
appdata類型的對(duì)象唯一特殊點(diǎn)就只是告訴微信這個(gè)消息點(diǎn)擊時(shí)需要調(diào)用第三方應(yīng)用,而其他類型的媒體對(duì)象被點(diǎn)擊時(shí)所顯示的是微信的默認(rèn)頁面
5、微信根據(jù)transaction字段決定消息在聊天框中的表現(xiàn)以及點(diǎn)擊后的響應(yīng),只有appdata被點(diǎn)擊時(shí)可以調(diào)用第三方應(yīng)用的進(jìn)程,所觸發(fā)的方法是實(shí)現(xiàn)了IWXAPIEventHandler接口的類的onReq方法,類型是ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX而在微信中和好友聊天時(shí)點(diǎn)擊第三方應(yīng)用圖標(biāo)所所觸發(fā)的方法是實(shí)現(xiàn)了IWXAPIEventHandler接口的類的onReq方法,類型是ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX
6、微信會(huì)根據(jù)第三方應(yīng)用是否注冊(cè)來給出應(yīng)用安裝的信息,比如傳給微信好友一個(gè)音頻消息時(shí),當(dāng)好友點(diǎn)擊那個(gè)消息,微信會(huì)以一個(gè)WebView來load音頻消息中的URL,不過在此前會(huì)在URL后面附加一些微信定義的信息,其中就會(huì)包括一個(gè)字段是isInstalled有關(guān)微信包裝后的URL的具體格式,我們可以將網(wǎng)絡(luò)斷開,然后再去點(diǎn)擊,這時(shí)自然就出現(xiàn)了那個(gè)經(jīng)典界面,你也就可以看到URL的真面目了因?yàn)槲易约簩懙膁emo都在實(shí)習(xí)結(jié)束后丟失了,所以給一個(gè)官方的demo下載,如果有不清楚的可以交流
謝謝合作,希望共同學(xué)習(xí)。
相關(guān)文章
Android自定義StepView仿外賣配送進(jìn)度
這篇文章主要為大家詳細(xì)介紹了Android自定義StepView仿外賣配送進(jìn)度,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
Android檢測手機(jī)多點(diǎn)觸摸點(diǎn)數(shù)的方法
這篇文章主要為大家詳細(xì)介紹了Android檢測手機(jī)多點(diǎn)觸摸點(diǎn)數(shù)的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
Android中使用開源框架Citypickerview實(shí)現(xiàn)省市區(qū)三級(jí)聯(lián)動(dòng)選擇
這篇文章主要介紹了Android中使用開源框架Citypickerview實(shí)現(xiàn)省市區(qū)三級(jí)聯(lián)動(dòng)選擇效果,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03
詳解Android應(yīng)用中preference首選項(xiàng)的編寫方法
這篇文章主要介紹了Android應(yīng)用中preference首選項(xiàng)的編寫方法,或許Apple將其翻譯為'偏好設(shè)置'更直觀些,即用戶對(duì)應(yīng)用的一些個(gè)性化調(diào)整菜單,需要的朋友可以參考下2016-04-04
如何在Android Studio下進(jìn)行NDK開發(fā)
這篇文章主要介紹了如何在Android Studio下進(jìn)行NDK開發(fā),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
android實(shí)現(xiàn)圓形漸變進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)圓形漸變進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05
Android CheckBox中設(shè)置padding無效解決辦法
這篇文章主要介紹了Android CheckBox中設(shè)置padding無效解決辦法的相關(guān)資料,希望通過本文能幫助到大家,讓大家解決這樣類似的問題,需要的朋友可以參考下2017-10-10
Android自定義帶動(dòng)畫的半圓環(huán)型進(jìn)度效果
這篇文章主要為大家詳細(xì)介紹了Android自定義帶動(dòng)畫的半圓環(huán)型進(jìn)度效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
Android判斷應(yīng)用程序退到后臺(tái)的方法(示例代碼)
判斷手機(jī)是否退到后臺(tái),這是我們?cè)贏ndroid開發(fā)中實(shí)現(xiàn)一些功能時(shí),經(jīng)常會(huì)考慮的問題,這篇文章主要介紹了android判斷應(yīng)用程序退到后臺(tái)的方法,需要的朋友可以參考下2023-03-03

