Android 第三方應(yīng)用接入微信平臺研究情況分享(二)
微信平臺開放后倒是挺火的,許多第三方應(yīng)用都想試下,畢竟可以利用微信建立起來的關(guān)系鏈來拓展自己的應(yīng)用還是挺不錯的,可以節(jié)約很多在社交方面的開銷,我最近由于實習需要也在研究這個東西,不過發(fā)現(xiàn)網(wǎng)上的相關(guān)資料還是挺少的,這里把我的整個研究情況給出來,希望可以共同學習。
二、第三方應(yīng)用與微信通信的時序圖
2、接收微信的請求信息
前面四步和之前的“1、向微信發(fā)送消息”是一樣的,不需要重復(fù)執(zhí)行,這里給出來只是為了
流程的整體性。當我們注冊后,應(yīng)用圖標會出現(xiàn)在微信聊天的列表中,點擊加號即可去添加,
添加后,如果聊天時點擊應(yīng)用圖標將會回調(diào)第三方應(yīng)用,如上面時序圖所示。這里補充一點,
當我們向微信發(fā)消息的媒體類型是appdata類型,即WXAppExtendObject對象時,好友在
收到消息時點擊消息,會出現(xiàn)類似的回調(diào)過程,需要修改的就是此時onReq被調(diào)用時,type
為ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX而不是ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX 。
當我們在onReq方法中接到ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX
類型的消息時,如果想要把響應(yīng)發(fā)回微信,可用如下代碼段來實現(xiàn)
可以發(fā)現(xiàn)響應(yīng)的消息對象和發(fā)請求是一樣的,下面看看效果圖
這是聊天窗口,前提是你已經(jīng)點擊加號將應(yīng)用添加到下面的列表中
此時,如果點擊第三方應(yīng)用,會回調(diào)我們設(shè)置好的界面
這個界面是自己定義的,你可以在接到微信的請求后自定義響應(yīng)界面。
說了半天,還沒說到onReq方法或是前面講的onResp方法的由來,
也就是說如果我們想要處理給微信發(fā)請求后的回饋或是響應(yīng)微信的請求
應(yīng)該怎么做,我們需要下面3步操作:
a. 可以在你的包名相應(yīng)目錄下新建一個wxapi目錄,并在該wxapi目錄下新增一個
WXEntryActivity類,該類繼承自Activity(當然這個路徑是自定義的,隨便你自己)
并在manifest文件里面加上exported屬性,設(shè)置為true,例如:
<activity
android:name=".wxapi.WXEntryActivity"
android:exported="true"
android:label="@string/app_name"
android:launchMode="singleTop" >
b. 實現(xiàn)IWXAPIEventHandler接口,微信發(fā)送的請求將回調(diào)到onReq方法,發(fā)送
到微信請求的響應(yīng)結(jié)果將回調(diào)到onResp方法
終于出現(xiàn)了這兩個神奇的方法,可以看看他們的大致用法
<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及實現(xiàn)了IWXAPIEventHandler接口的對
象傳遞給IWXAPI接口的handleIntent方法:
api.handleIntent(intent, this);
ok,這三步可以結(jié)合時序圖一起來理解,都可以一一對應(yīng)的。
最后給出一些注意點,也是容易混淆的,我都寫過Demo驗證過了,如果大家覺得有不對的,歡迎指出,歡迎討論
1、注冊是本地注冊,且只需要注冊一次,但是在發(fā)送的時候微信服務(wù)器會檢測第三方應(yīng)用的合法性
2、說白了就是在本地第三方應(yīng)用將要發(fā)送的內(nèi)容先發(fā)給微信進程,微信進程收到后再將消息發(fā)給自己的微信好友
3、卸載或者反注冊后,第三方應(yīng)用將不會出現(xiàn)在本機微信的可添加應(yīng)用列表中
4、使用微信開放平臺發(fā)送的媒體對象中,網(wǎng)頁,音頻和視頻只能是網(wǎng)絡(luò)URL,圖片可發(fā)送本地路徑,本地字節(jié)數(shù)據(jù),網(wǎng)絡(luò)URL,文件可以發(fā)送本地字節(jié)數(shù)據(jù)和本地路徑,附帶在媒體對象中的字節(jié)數(shù)組,微信默認會是點擊則給出下載界面,下載后存儲的路徑是在/sdcard/Tecent/MicroMsg/本機微信帳號(一般是一串字母數(shù)字的組合體)/attachment文件夾下,這個路徑不需要自己去記錄,微信會在媒體對象的filepath字段中記錄,此時一定注意的是當你響應(yīng)微信的show請求時,媒體對象中的filedata字段是為空的,即使你在發(fā)送的時候附帶在了這個字段中,如前面所說,只能用filepath這個字段。
如果要自行處理只能是appdata類型數(shù)據(jù),理由下面給出:
appdata類型的對象唯一特殊點就只是告訴微信這個消息點擊時需要調(diào)用第三方應(yīng)用,而其他類型的媒體對象被點擊時所顯示的是微信的默認頁面
5、微信根據(jù)transaction字段決定消息在聊天框中的表現(xiàn)以及點擊后的響應(yīng),只有appdata被點擊時可以調(diào)用第三方應(yīng)用的進程,所觸發(fā)的方法是實現(xiàn)了IWXAPIEventHandler接口的類的onReq方法,類型是ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX而在微信中和好友聊天時點擊第三方應(yīng)用圖標所所觸發(fā)的方法是實現(xiàn)了IWXAPIEventHandler接口的類的onReq方法,類型是ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX
6、微信會根據(jù)第三方應(yīng)用是否注冊來給出應(yīng)用安裝的信息,比如傳給微信好友一個音頻消息時,當好友點擊那個消息,微信會以一個WebView來load音頻消息中的URL,不過在此前會在URL后面附加一些微信定義的信息,其中就會包括一個字段是isInstalled有關(guān)微信包裝后的URL的具體格式,我們可以將網(wǎng)絡(luò)斷開,然后再去點擊,這時自然就出現(xiàn)了那個經(jīng)典界面,你也就可以看到URL的真面目了因為我自己寫的demo都在實習結(jié)束后丟失了,所以給一個官方的demo下載,如果有不清楚的可以交流
謝謝合作,希望共同學習。
相關(guān)文章
詳解Retrofit 動態(tài)參數(shù)(非固定參數(shù)、非必須參數(shù))(Get、Post請求)
這篇文章主要介紹了詳解Retrofit 動態(tài)參數(shù)(非固定參數(shù)、非必須參數(shù))(Get、Post請求),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04詳解Android Handler機制和Looper Handler Message關(guān)系
Handler是Android線程之間的消息機制,主要的作用是將一個任務(wù)切換到指定的線程中去執(zhí)行,準確的說是切換到構(gòu)成Handler的looper所在的線程中去出處理。本文將詳細介紹Android Handler機制和Looper Handler Message關(guān)系。2021-06-06Kotlin中Lambda表達式與高階函數(shù)使用分析講解
lambda 本質(zhì)上是可以傳遞給函數(shù)的一小段代碼,Kotlin 與 Java 中的 Lambda 有一定的區(qū)別,除了對 lambda 的全面支持外,還有內(nèi)聯(lián)函數(shù)等簡潔高效的特性。下面我們來仔細看一下2022-12-12Flutter?阻止系統(tǒng)鍵盤彈出的優(yōu)雅方式
這篇文章主要為大家介紹了Flutter?阻止系統(tǒng)鍵盤彈出的優(yōu)雅方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11Android UI設(shè)計系列之自定義SwitchButton開關(guān)實現(xiàn)類似IOS中UISwitch的動畫效果(2
這篇文章主要介紹了Android UI設(shè)計系列之自定義SwitchButton開關(guān)實現(xiàn)類似IOS中UISwitch的動畫效果,具有一定的實用性和參考價值,感興趣的小伙伴們可以參考一下2016-06-06Android實現(xiàn)網(wǎng)絡(luò)多線程文件下載
這篇文章主要介紹了Android實現(xiàn)網(wǎng)絡(luò)多線程文件下載的相關(guān)資料,需要的朋友可以參考下2016-03-03關(guān)于AndroidStudio R文件莫名其妙缺失的快速解決方法
下面小編就為大家?guī)硪黄P(guān)于AndroidStudio R文件莫名其妙缺失的快速解決方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03