Android實(shí)現(xiàn)微信分享功能
這里就先說說微信分享的功能。
一、接入微信分享SDK
1、sdk下載地址
里面有SDK的文件和接入指南(如果實(shí)在看不懂,可以下載Demo來看)
2、接入
android:name="你的包名.wxapi.WXEntryActivity"android:label="@string/app_name"android:theme="@android:style/Theme.Translucent.NoTitleBar"android:exported="true"android:taskAffinity="你的包名"android:launchMode="singleTask">
WXEntryActivity這個類是主要用來接收微信回調(diào)的,如果接過微信的東西一般就會比較熟悉,比如微信分享、微信支付等等,都會要求你的工程加入這個類。
(3)、初始化SDK
IWXAPI wxAPI = WXAPIFactory.createWXAPI(context, appId, true);wxAPI.registerApp(appId);
注意一下,無論你看文檔還是Demo,當(dāng)前版本給出測試用的appId是wx88888888,設(shè)置這個值得話會跳界面,不過會無法分享,這個問題在下面會詳細(xì)說。
(4)、跳轉(zhuǎn)微信分享
應(yīng)用向微信發(fā)送請求是使用sendReq方法
wxAPI.sendReq(req);至于怎么配置分享的參數(shù),文檔里把每種類型都說得很請求,Demo也有寫。

//初始化一個WXWebpageObject,填寫urlWXWebpageObject webpage = new WXWebpageObject();webpage.webpageUrl ="網(wǎng)頁url";//用 WXWebpageObject 對象初始化一個 WXMediaMessage 對象WXMediaMessage msg = new WXMediaMessage(webpage);msg.title ="網(wǎng)頁標(biāo)題 ";msg.description ="網(wǎng)頁描述";Bitmap thumbBmp = BitmapFactory.decodeResource(getResources(), R.drawable.send_music_thumb);msg.thumbData =Util.bmpToByteArray(thumbBmp, true);//構(gòu)造一個ReqSendMessageToWX.Req req = new SendMessageToWX.Req();req.transaction = buildTransaction("webpage");req.message =msg;req.scene =mTargetScene;req.userOpenId = getOpenId();//調(diào)用api接口,發(fā)送數(shù)據(jù)到微信api.sendReq(req);
private String buildTransaction(final String type) {return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();}
req.setThumbImage(bitmap);// 分享到微信req.scene = SendMessageToWX.Req.WXSceneSession;
// 分享到朋友圈req.scene = SendMessageToWX.Req.WXSceneTimeline ;

接收分享的回調(diào)我感覺就是坑最多的。按照文檔的Demo的寫法,要在WXEntryActivity寫回調(diào)邏輯(這一塊建議直接可以看Demo中的WXEntryActivity類),我這里就寫一個簡單的吧
public class WXEntryActivity extends Activity implements IWXAPIEventHandler{@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);IWXAPI wxAPI = 獲取到你之前初始化的IWXAPI ;if (wxAPI != null){wxAPI.handleIntent(getIntent(), this);}else{// callback是個假設(shè),你可以用自己的辦法把數(shù)據(jù)給回調(diào)callback.result("分享失敗");}}@Overridepublic void onReq(BaseReq baseReq) {}@Overridepublic void onResp(BaseResp baseResp) {// 返回結(jié)果if (baseResp != null){if (baseResp.errCode == BaseResp.ErrCode.ERR_OK){callback.result( "分享成功");}else {callback.result("分享失敗,錯誤碼:"+baseResp.errCode);}}else {callback.result("分享失敗");}finish();}@Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);IWXAPI wxAPI = 獲取到你之前初始化的IWXAPI ;if (wxAPI != null){wxAPI.handleIntent(getIntent(), this);}}}
還有就是要記得寫finish,這是一個Activity,不寫finish的話你就無法和你的Activity交互。
可以看出分享的操作還是很簡單的,按照文檔和Demo來做基本沒問題,我也是隨便講講,好吧,其實(shí)就是湊湊字?jǐn)?shù)。
二、接入微信分享SDK碰到的坑
1、跳轉(zhuǎn)彈出頁面提示失敗

還有如果包名和簽名對不上你在微信后臺申請時填的,也是無法跳轉(zhuǎn)的。
2、無法獲取到分享的回調(diào)
是的,無論是Android還是IOS都是這樣,似乎是微信這樣特意去設(shè)計(jì)的,因?yàn)镼Q是可以的,QQ分享選擇留在QQ,返回之后也是有回調(diào)的。
當(dāng)前版本分享到朋友圈不會有這個選擇,所以可以只對分享到微信做處理,那么官方?jīng)]有處理的辦法怎么辦?我們只能自己寫邏輯去處理了。
(1)分享直接錯誤,沒有跳轉(zhuǎn)微信的情況:
send -> onPause -> WXEntryActivity -> onResume
(2)分享時彈出同一個頁面提示分享錯誤:
send -> onPause -> (點(diǎn)擊確認(rèn)之后)onResume
是的,這種情況是不走WXEntryActivity 的
(3)分享跳轉(zhuǎn)到微信,然后直接物理返回應(yīng)用:
send -> onPause -> onStop -> 在微信返回 -> onStart -> WXEntryActivity ?-> onResume
(4)分享跳轉(zhuǎn)到微信,然后切進(jìn)程返回(只要是切進(jìn)程返回都是這種情況):
send -> onPause -> onStop -> 在微信切進(jìn)程 -> onStart -> onResume
可以看出這種情況也不會調(diào)用WXEntryActivity
(5)分享成功后選擇返回應(yīng)用:
send -> onPause -> onStop -> 分享成功后選返回應(yīng)用 -> onStart -> WXEntryActivity ?-> onResume
(6)分享成功后選擇留在微信:
send -> onPause -> onStop -> 分享成功后選留在微信 -> onStart -> onResume -> onPause -> onStop -> 再手動返回應(yīng)用 -> onStart ?-> onResume
(7)分享到朋友圈:
send -> onPause -> onStop -> 確認(rèn)分享朋友圈 ?-> onStart -> onResume -> onPause -> WXEntryActivity -> onResume
不知道為什么這個生命周期也是很亂
從上面的所有情況的生命周期觀察,我的做法是判斷send方法之后有調(diào)用onStop 生命周期就表示跳轉(zhuǎn)微信的情況。
我是自己定義一個狀態(tài)state去判斷分享的結(jié)果,onResume的時候返回分享的結(jié)果,send之前state為0,默認(rèn)設(shè)置結(jié)果為分享失敗,send+onStop 之后設(shè)置結(jié)果為分享成功,WXEntryActivity ?之后再把結(jié)果覆蓋之前的變量,然后onResume返回。

評論
圖片
表情
