<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Android實(shí)現(xiàn)微信分享功能

          共 4760字,需瀏覽 10分鐘

           ·

          2021-11-08 11:42

          準(zhǔn)備打算寫一個專題關(guān)于一些第三方的SDK的使用,主要是因?yàn)橛行┤絊DK在開發(fā)時會碰到一些問題,所以打算記錄下。接入功能基本都是挺方便的,主要就是會碰上一些坑。每次遇到新的坑都會抽時間重新更新文章

          這里就先說說微信分享的功能。


          一、接入微信分享SDK

          1、sdk下載地址
          https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&lang=zh_CN
          里面有SDK的文件和接入指南(如果實(shí)在看不懂,可以下載Demo來看)


          2、接入
          (1)、在Gradle中引用或者導(dǎo)入jar包

          (2)、配置manifest


          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);


          appId就是在微信后臺申請參數(shù)的時候生成的一個參數(shù)。

          注意一下,無論你看文檔還是Demo,當(dāng)前版本給出測試用的appId是wx88888888,設(shè)置這個值得話會跳界面,不過會無法分享,這個問題在下面會詳細(xì)說。

          (4)、跳轉(zhuǎn)微信分享

          應(yīng)用向微信發(fā)送請求是使用sendReq方法
          wxAPI.sendReq(req);


          至于怎么配置分享的參數(shù),文檔里把每種類型都說得很請求,Demo也有寫。



          這里就舉個最簡單的例子,分享一條消息到微信,點(diǎn)開后是打開一個連接,看官網(wǎng)文檔的說明
          //初始化一個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();    }


          其實(shí)就直接抄這段就行了,不過設(shè)置圖片應(yīng)該是這樣
          req.setThumbImage(bitmap);


          再看看這個req.scene屬性
          // 分享到微信 req.scene = SendMessageToWX.Req.WXSceneSession;
          // 分享到朋友圈req.scene = SendMessageToWX.Req.WXSceneTimeline ;


          分享后差不多就是這樣一個效果



          還要說一個問題是,按照文檔和demo的做法是這個圖片的設(shè)置都是設(shè)置bitmap,都是本地的,那如果是給一個網(wǎng)上圖片的url怎么辦,我不知道有沒有辦法能直接設(shè)置(QQ分享是可以的),目前我的做法是根據(jù)url下載圖片成bitmap格式再設(shè)置,如果有人知道能直接設(shè)置圖片url,勞煩在評論指導(dǎo)一下。


          (5)、接收微信的回調(diào)

          接收分享的回調(diào)我感覺就是坑最多的。按照文檔的Demo的寫法,要在WXEntryActivity寫回調(diào)邏輯(這一塊建議直接可以看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是個假設(shè),你可以用自己的辦法把數(shù)據(jù)給回調(diào) callback.result("分享失敗"); } }
          @Override public void onReq(BaseReq baseReq) {
          }
          @Override public 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(); }
          @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); IWXAPI wxAPI = 獲取到你之前初始化的IWXAPI ; if (wxAPI != null){ wxAPI.handleIntent(getIntent(), this); } }
          }


          具體的邏輯具體處理,不過不建議在這里處理復(fù)雜的邏輯,可以把分享的結(jié)果先返回去,再自己的類中再做處理。

          還有就是要記得寫finish,這是一個Activity,不寫finish的話你就無法和你的Activity交互。

          可以看出分享的操作還是很簡單的,按照文檔和Demo來做基本沒問題,我也是隨便講講,好吧,其實(shí)就是湊湊字?jǐn)?shù)。


          二、接入微信分享SDK碰到的坑

          1、跳轉(zhuǎn)彈出頁面提示失敗


          一般來說是參數(shù)的問題,比如我上面說的appId,如果你用測試的那個appId來測試的話,在現(xiàn)版本是跳轉(zhuǎn)不了的,官方也有說明。




          所以最好是用正式的參數(shù)去測(臥槽,為是什么QQ分享都可以微信卻不行)
          還有如果包名和簽名對不上你在微信后臺申請時填的,也是無法跳轉(zhuǎn)的。

          2、無法獲取到分享的回調(diào)

          這是一個比較坑的問題了,好像挺早前就有了,簡單來說,問題是:微信分享之后,選擇留在微信,再返回應(yīng)用,接收不到回調(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
          這種情況下微信給的回調(diào)是分享成功

          (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
          不知道為什么會調(diào)兩次生命周期

          (7)分享到朋友圈:
          send -> onPause -> onStop -> 確認(rèn)分享朋友圈 ?-> onStart -> onResume -> onPause -> WXEntryActivity -> onResume
          不知道為什么這個生命周期也是很亂


          可以看出如果要做的話,我們可以選擇只要跳轉(zhuǎn)到微信就分享成功,因?yàn)槟J(rèn)就算你跳到微信不分享,他們給的回調(diào)也是成功的回調(diào)。

          從上面的所有情況的生命周期觀察,我的做法是判斷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返回。



          就算中間某步的方法沒調(diào)用也沒關(guān)系,最終都會有返回值,不過這樣的做法也會有問題,如果onResume沒調(diào)用,那就無法接收到回調(diào)了。


          到這里就結(jié)束啦。
          瀏覽 120
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  操逼在线观看 | 97爽无码人妻AⅤ精品牛牛 | 大鸡已久久久 | 国产综合视频在线播放 | 97超级碰人人 |