一.接入
?APP申請(qǐng)審核
首先項(xiàng)目集成微信SDK切揭,需要到官網(wǎng)注冊(cè),因?yàn)槲⑿艑?duì)第三方的調(diào)用有著嚴(yán)格的驗(yàn)證:App ID等曼,包名,及應(yīng)用簽名,只有這三個(gè)跟申請(qǐng)的都完全匹配禁谦,才能調(diào)用分享胁黑。
需要注意點(diǎn):
1) 應(yīng)用官網(wǎng)那欄可以直接填寫你的博客地址或其他
2) 包名需填寫你所要集成項(xiàng)目的包名,后續(xù)可修改
3) 應(yīng)用簽名格式為小寫連續(xù)州泊,并且注意填寫簽名的版本
二.搭建開發(fā)環(huán)境
Android Studio環(huán)境下:
在build.gradle文件中丧蘸,添加如下依賴即可:
dependencies {
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
}
或
dependencies {
compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}
[1] AndroidManifest.xml 設(shè)置
添加必要的權(quán)限支持:
三.分享集成
3.1? 接口方法類及屬性
WXMediaMessage -- 微信媒體消息內(nèi)容
mediaObject描述一個(gè)媒體對(duì)象的基類
媒體對(duì)象包括WXTextObject,WXImageObect 等
3.2 分享或收藏的目標(biāo)場(chǎng)景遥皂,通過(guò)修改scene場(chǎng)景值實(shí)現(xiàn)
發(fā)送到聊天界面 ——WXSceneSession
發(fā)送到朋友圈 ——WXSceneTimeline
添加到微信收藏 ——WXSceneFavorite
3.3 集成
要使你的程序啟動(dòng)后微信終端能響應(yīng)你的程序力喷,必須在代碼中向微信終端注冊(cè)你的id:
api = WXAPIFactory.createWWXAPI(this,APP_ID,ture);// 第三個(gè)參數(shù)作用??
api.registerApp(APP_ID)
Steps: > 1.
//將要分享的內(nèi)容shareContent演训,傳給新建出來(lái)的相應(yīng)類型媒體對(duì)象?
WXTypeObject typeObj = new WXTypeObject(); // typeObj為分享內(nèi)容類型
typeObj = shareContent;// 分享內(nèi)容
>2. 初始化WXMediaMessage對(duì)象弟孟,并將帶有分享內(nèi)容的類型媒體對(duì)象typeObj賦值給其mediaObject屬性 WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = typeObject;?
>3. 構(gòu)造Req,并選擇分享的目標(biāo)場(chǎng)景**scene**
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("text");// 用于唯一標(biāo)識(shí)一個(gè)請(qǐng)求
req.message = msg;
req.scene = SendMessageToWX.Req.WXSceneSession;?
>4. 調(diào)用api.sendReq(req);
?api.sendReq(req);
?每個(gè)類型的分享流程大致都如上样悟,只是需要根據(jù)具體的分享類型修改第1拂募,2步驟
2. 文字分享
// 初始化一個(gè)WXTextObject對(duì)象,并填寫分享的內(nèi)容
WXTextObject textObject = new WXTextObject();
textObject.text = "textObject.text"; // 分享的內(nèi)容,即對(duì)方收到的消息
// 用WXTextObject對(duì)象初始化WXMediaMessage對(duì)象
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = textObject;
msg.description = "description"; // 分享框的title文字
// 構(gòu)造一個(gè)Req
SendMessageToWX.Req req = new SendMessageToWX.Req(); // 用于唯一標(biāo)識(shí)一個(gè)請(qǐng)求
req.transaction = buildTransaction("text");
req.message = msg;
req.scene = SendMessageToWX.Req.WXSceneSession;// 聊天界面
// 調(diào)用api接口發(fā)送數(shù)據(jù)到微信
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對(duì)象,并將imgObj賦值給媒體對(duì)象mediaObject
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = imgObject;
Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, 150, 150, true);
bmp.recycle();
msg.thumbData = bmpToByteArray(thumbBmp, true);
// 構(gòu)造一個(gè)Req
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("img");
req.message = msg;
req.scene = SendMessageToWX.Req.WXSceneSession;
// 調(diào)用api接口發(fā)送數(shù)據(jù)到微信
Toast.makeText(this,"" + api.sendReq(req),Toast.LENGTH_SHORT).show();
>- 其余媒體類型可具體參照-- 微信官方文檔:(分享與收藏功能開發(fā)文檔)
3. Tips: >- 注意所分享類型的限制條件没讲,例如分享的文字及圖片有大小限制眯娱,所以若圖片縮略圖大于32k則分享不成功礁苗。
3.4.跳轉(zhuǎn)小程序
val miniProgramObj = WXMiniProgramObject()
miniProgramObj.webpageUrl = "http://www.qq.com"
// 兼容低版本的網(wǎng)頁(yè)鏈接
miniProgramObj.miniprogramType = WXMiniProgramObject.MINIPROGRAM_TYPE_PREVIEW // 正式版:0,測(cè)試版:1徙缴,體驗(yàn)版:2
miniProgramObj.userName = "gh_b7a83a16c048" // 小程序原始id
miniProgramObj.path = "pages/index/index" //小程序頁(yè)面路徑
val msg = WXMediaMessage(miniProgramObj)
msg.title = "小程序消息Title" // 小程序消息title
msg.description = "小程序消息Desc" // 小程序消息desc
msg.thumbData = getThumb() // 小程序消息封面圖片试伙,小于128k
val req = SendMessageToWX.Req()req.transaction = buildTransaction("webpage")
req.message = msgreq.scene = SendMessageToWX.Req.WXSceneSession // 目前只支持會(huì)話
api.sendReq(req)
3.5接收微信的請(qǐng)求及返回值(從小程序跳回app必須要實(shí)現(xiàn))
如果你的程序需要接收微信發(fā)送的請(qǐng)求,或者接收發(fā)送到微信請(qǐng)求的響應(yīng)結(jié)果于样,需要下面3步操作:
a. 在你的包名相應(yīng)目錄下新建一個(gè)wxapi目錄疏叨,并在該wxapi目錄下新增一個(gè)WXEntryActivity類(保命,類名不可改)穿剖,該類繼承自Activity
并在manifest文件里面加上exported屬性蚤蔓,設(shè)置為true,例如:
b. 實(shí)現(xiàn)IWXAPIEventHandler接口糊余,微信發(fā)送的請(qǐng)求將回調(diào)到onReq方法秀又,發(fā)送到微信請(qǐng)求的響應(yīng)結(jié)果將回調(diào)到onResp方法
c. 在WXEntryActivity中將接收到的intent及實(shí)現(xiàn)了IWXAPIEventHandler接口的對(duì)象傳遞給IWXAPI接口的handleIntent方法,示例如下圖:
當(dāng)微信發(fā)送請(qǐng)求到你的應(yīng)用贬芥,將通過(guò)IWXAPIEventHandler接口的onReq方法進(jìn)行回調(diào)吐辙,類似的,應(yīng)用請(qǐng)求微信的響應(yīng)結(jié)果將通過(guò)onResp回調(diào)蘸劈。
四.?點(diǎn)擊微信分享的內(nèi)容后跳轉(zhuǎn)來(lái)源App的實(shí)現(xiàn)
方案一
從WebView(該WebView從屬于另一個(gè)App昏苏,并非我們自己的App)跳轉(zhuǎn)到MyApp的某個(gè)界面(這里以跳轉(zhuǎn)到MyApp的Acticity?A為例)。具體的實(shí)現(xiàn)邏輯如下:
(1)該WebView顯示的網(wǎng)頁(yè)內(nèi)容只是一個(gè)超鏈接,自定義了一個(gè)scheme=myapp://贤惯,后邊可以附加一些參數(shù)洼专,如果需要從網(wǎng)頁(yè)向App傳值的話。
(2)MyApp中的Activity?A需要配置特定的infliter孵构,如下:
(3)當(dāng)在WebView上點(diǎn)擊上述自定義的超鏈接時(shí)就可以打開MyApp的A界面壶熏,所傳遞的參數(shù)也可以在所跳轉(zhuǎn)到的Activity中獲取,方法如下:
getIntent().getScheme();//獲得Scheme名稱??
getIntent().getDataString();//獲得Uri全部路徑浦译,根據(jù)自定義的格式解析字符串即可獲取我們上面附加的參數(shù)棒假。
問(wèn)題1:如果用戶安裝了MyApp,就可以點(diǎn)擊網(wǎng)頁(yè)跳轉(zhuǎn)精盅,如果沒(méi)有安裝MyApp的話帽哑,WebView就會(huì)提示找不到該頁(yè)面。制作網(wǎng)頁(yè)時(shí)可以在網(wǎng)頁(yè)中做檢測(cè)叹俏,沒(méi)安裝MyApp的話妻枕,頁(yè)面就重定向到應(yīng)用的下載頁(yè)面。
問(wèn)題2:在普通App的WebView中和瀏覽器中上述機(jī)制是可以的粘驰,但是在微信的WebView是不可以點(diǎn)擊直接跳轉(zhuǎn)我們的應(yīng)用的屡谐,可能是微信做了某些過(guò)濾,且僅僅支持跟微信有深度合作的應(yīng)用的跳轉(zhuǎn)蝌数,如大眾點(diǎn)評(píng)是可以的愕掏。針對(duì)這種情況,我們可以引導(dǎo)用戶使用瀏覽器打開所分享的網(wǎng)頁(yè)顶伞,然后點(diǎn)擊就可以跳轉(zhuǎn)應(yīng)用了饵撑。
方案二
使用微信SDK分享WXAppExtendObject數(shù)據(jù)給好友,好友點(diǎn)擊跳轉(zhuǎn)MyApp的某個(gè)頁(yè)面(需要在分享時(shí)傳遞構(gòu)造跳轉(zhuǎn)Intent的參數(shù))唆貌。
1.該類型的分享(具體請(qǐng)參考微信分享SDK)可以帶幾個(gè)參數(shù)滑潘,參數(shù)中必須附帶一些構(gòu)造跳轉(zhuǎn)Intent的數(shù)據(jù)。
2.好友點(diǎn)擊分享的內(nèi)容锨咙,回調(diào)IWXAPIEventHandler接口的類的onReq方法语卤,具體為
ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:這種情況才會(huì)調(diào)用,此時(shí)可以取出分享時(shí)附帶在參數(shù)中的一些數(shù)據(jù)酪刀,構(gòu)造一個(gè)跳轉(zhuǎn)Intent,調(diào)用startActivity(intent)?來(lái)打開MyApp粹舵。
問(wèn)題0:現(xiàn)版本無(wú)法分享App類型消息(低版本可以,微信抽風(fēng))
問(wèn)題1:該分享方式只能分享給好友蓖宦,不能分享到朋友圈齐婴。
問(wèn)題2:如果好友沒(méi)安裝MyApp,點(diǎn)擊微信中好友分享過(guò)來(lái)的消息后無(wú)反應(yīng)稠茂,無(wú)法提醒“未安裝MyApp柠偶,請(qǐng)下載”情妖,因?yàn)檫@些邏輯要實(shí)現(xiàn)的話本身就是在MyApp里面寫的,原本沒(méi)裝的話根本無(wú)法檢測(cè)诱担。
問(wèn)題3:WXAppExtendObject類型的分享毡证,數(shù)據(jù)有大小限制,
extInfo(String)限制2KB蔫仙;
fileData(byte[])供第三方使用的文件二進(jìn)制數(shù)據(jù)料睛,最大10M;
filePath:(String)Local?directory?of?the?file?provided?for?applications,本身長(zhǎng)度最大10KB,文件大小同上摇邦,不超過(guò)10M恤煞。
五.目前存在問(wèn)題
1.無(wú)法分享App類型消息
解決方式:用老版本的微信,新版本的微信不支持WXAppExtendObject
疑問(wèn):但是微信分享的官方demo是可以分享app類型消息的施籍,猜測(cè)是否微信官方對(duì)app類型消息做了過(guò)濾居扒。