Android開發微信分享功能
準備打算寫一個專題關於一些第三方的SDK的使用,主要是因為有些三方SDK在開發時會碰到一些問題,所以打算記錄下。接入功能基本都是挺方便的,主要就是會碰上一些坑。 每次遇到新的坑都會抽時間重新更新文章
這裡就先說說微信分享的功能。
如果你知道怎麼做分享,只是在使用的過程中碰到問題,可以直接跳過 標題一 直接看 標題二
時間 | 描述 |
---|---|
2019.5.9 | 寫簡單的匯入方式和坑1、2 |
一.接入微信分享SDK
1.sdk下載地址
裡面有SDK的檔案和接入指南(如果實在看不懂,可以下載Demo來看)
2.接入
(1)在Gradle中引用或者匯入jar包
(2)配置manifest
<uses-permission android:name="android.permission.INTERNET" /> <!-- for mta statistics, not necessary--> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <activity android:name="你的包名.wxapi.WXEntryActivity" android:label="@string/app_name" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:exported="true" android:taskAffinity="你的包名" android:launchMode="singleTask"> </activity>
WXEntryActivity這個類是主要用來接收微信回撥的,如果接過微信的東西一般就會比較熟悉,比如微信分享、微信支付等等,都會要求你的工程加入這個類。
(3)初始化SDK
IWXAPI wxAPI = WXAPIFactory.createWXAPI(context, appId, true); wxAPI.registerApp(appId);
appId就是在微信後臺申請引數的時候生成的一個引數。
注意一下,無論你看文件還是Demo,當前版本給出測試用的appId是wx88888888,設定這個值得話會跳介面,不過會無法分享,這個問題在下面會詳細說。
(4)跳轉微信分享
應用向微信傳送請求是使用sendReq方法
wxAPI.sendReq(req);
至於怎麼配置分享的引數,文件裡把每種型別都說得很請求,Demo也有寫。

這裡就舉個最簡單的例子,分享一條訊息到微信,點開後是開啟一個連線,看官網文件的說明
//初始化一個WXWebpageObject,填寫url WXWebpageObject webpage = new WXWebpageObject(); webpage.webpageUrl ="網頁url"; //用 WXWebpageObject 物件初始化一個 WXMediaMessage 物件 WXMediaMessage msg = new WXMediaMessage(webpage); msg.title ="網頁標題 "; msg.description ="網頁描述"; Bitmap thumbBmp = BitmapFactory.decodeResource(getResources(), R.drawable.send_music_thumb); msg.thumbData =Util.bmpToByteArray(thumbBmp, true); //構造一個Req SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = buildTransaction("webpage"); req.message =msg; req.scene =mTargetScene; req.userOpenId = getOpenId(); //呼叫api介面,傳送資料到微信 api.sendReq(req);
private String buildTransaction(final String type) { return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis(); }
其實就直接抄這段就行了,不過設定圖片應該是這樣
req.setThumbImage(bitmap);
再看看這個req.scene屬性
// 分享到微信 req.scene = SendMessageToWX.Req.WXSceneSession;
// 分享到朋友圈 req.scene = SendMessageToWX.Req.WXSceneTimeline ;
分享後差不多就是這樣一個效果

(5)接收微信的回撥
接收分享的回撥我感覺就是坑最多的。按照文件的Demo的寫法,要在WXEntryActivity寫回調邏輯(這一塊建議直接可以看Demo中的WXEntryActivity類),我這裡就寫一個簡單的吧
public class WXEntryActivity extends Activity implements IWXAPIEventHandler{ @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); IWXAPI wxAPI = 獲取到你之前初始化的IWXAPI ; if (wxAPI != null){ wxAPI.handleIntent(getIntent(), this); }else{ // callback是個假設,你可以用自己的辦法把資料給回撥 callback.result("分享失敗"); } } @Override public void onReq(BaseReq baseReq) { } @Override public void onResp(BaseResp baseResp) { // 返回結果 if (baseResp != null){ if (baseResp.errCode == BaseResp.ErrCode.ERR_OK){ callback.result( "分享成功"); }else { callback.result("分享失敗,錯誤碼:"+baseResp.errCode); } }else { callback.result("分享失敗"); } finish(); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); IWXAPI wxAPI = 獲取到你之前初始化的IWXAPI ; if (wxAPI != null){ wxAPI.handleIntent(getIntent(), this); } } }
具體的邏輯具體處理,不過不建議在這裡處理複雜的邏輯,可以把分享的結果先返回去,再自己的類中再做處理。
還有就是要記得寫finish,這是一個Activity,不寫finish的話你就無法和你的Activity互動。
可以看出分享的操作還是很簡單的,按照文件和Demo來做基本沒問題,我也是隨便講講,好吧,其實就是湊湊字數。
二. 接入微信分享SDK碰到的坑
好吧,這才是重點,上面的都是在划水。先說一下,可能我碰到了一些問題是讀者沒碰到的,也有可能讀者碰到一些問題我沒碰到所以沒寫下來,希望可以在評論區或者私信留言。
1.跳轉彈出頁面提示失敗
一般來說是引數的問題,比如我上面說的appId,如果你用測試的那個appId來測試的話,在現版本是跳轉不了的,官方也有說明。

所以最好是用正式的引數去測(臥槽,為是什麼QQ分享都可以微信卻不行)
還有如果包名和簽名對不上你在微信後臺申請時填的,也是無法跳轉的。
2.無法獲取到分享的回撥
這是一個比較坑的問題了,好像挺早前就有了,簡單來說,問題是:
微信分享之後,選擇留在微信,再返回應用,接收不到回撥。
是的,無論是Android還是IOS都是這樣,似乎是微信這樣特意去設計的,因為QQ是可以的,QQ分享選擇留在QQ,返回之後也是有回撥的。
當前版本分享到朋友圈不會有這個選擇,所以可以只對分享到微信做處理
那麼官方沒有處理的辦法怎麼辦?我們只能自己寫邏輯去處理了。
先測下一下各種情況下的生命週期情況(可能不同的版本流程不同)
(1)分享直接錯誤,沒有跳轉微信的情況
send -> onPause -> WXEntryActivity -> onResume
(2)分享時彈出同一個頁面提示分享錯誤
send -> onPause -> (點選確認之後)onResume
是的,這種情況是不走WXEntryActivity 的
(3)分享跳轉到微信,然後直接物理返回應用
send -> onPause -> onStop -> 在微信返回 -> onStart -> WXEntryActivity -> onResume
這種情況下微信給的回撥是分享成功
(4)分享跳轉到微信,然後切程序返回(只要是切程序返回都是這種情況)
send -> onPause -> onStop -> 在微信切程序 -> onStart -> onResume
可以看出這種情況也不會呼叫WXEntryActivity
(5)分享成功後選擇返回應用
send -> onPause -> onStop -> 分享成功後選返回應用 -> onStart -> WXEntryActivity -> onResume
(6)分享成功後選擇留在微信
send -> onPause -> onStop -> 分享成功後選留在微信 -> onStart -> onResume -> onPause -> onStop -> 再手動返回應用 -> onStart -> onResume
不知道為什麼會調兩次生命週期
(7)分享到朋友圈
send -> onPause -> onStop -> 確認分享朋友圈 -> onStart -> onResume -> onPause -> WXEntryActivity -> onResume
不知道為什麼這個生命週期也是很亂
可以看出如果要做的話,我們可以選擇只要跳轉到微信就分享成功,因為預設就算你跳到微信不分享,他們給的回撥也是成功的回撥。
從上面的所有情況的生命週期觀察,我的做法是判斷send方法之後有呼叫onStop 生命週期就表示跳轉微信的情況。
我是自己定義一個狀態state去判斷分享的結果,onResume的時候返回分享的結果,send之前state為0,預設設定結果為分享失敗,send+onStop 之後設定結果為分享成功,WXEntryActivity 之後再把結果覆蓋之前的變數,然後onResume返回。

就算中間某步的方法沒呼叫也沒關係,最終都會有返回值,不過這樣的做法也會有問題,如果onResume沒呼叫,那就無法接收到回調了。
三. 附言
如果大家有什麼其它的問題或者有其它的解決方式,歡迎留言。