1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 4760字,需瀏覽 10分鐘

         ·

        2021-11-08 11:42

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

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


        一、接入微信分享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這個(gè)類是主要用來接收微信回調(diào)的,如果接過微信的東西一般就會(huì)比較熟悉,比如微信分享、微信支付等等,都會(huì)要求你的工程加入這個(gè)類。


        (3)、初始化SDK

        IWXAPI wxAPI = WXAPIFactory.createWXAPI(context, appId, true);wxAPI.registerApp(appId);


        appId就是在微信后臺(tái)申請(qǐng)參數(shù)的時(shí)候生成的一個(gè)參數(shù)。

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

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

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


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



        這里就舉個(gè)最簡(jiǎn)單的例子,分享一條消息到微信,點(diǎn)開后是打開一個(gè)連接,看官網(wǎng)文檔的說明
        //初始化一個(gè)WXWebpageObject,填寫urlWXWebpageObject webpage = new WXWebpageObject();webpage.webpageUrl ="網(wǎng)頁url";
        //用 WXWebpageObject 對(duì)象初始化一個(gè) WXMediaMessage 對(duì)象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)造一個(gè)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);


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


        分享后差不多就是這樣一個(gè)效果



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


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

        接收分享的回調(diào)我感覺就是坑最多的。按照文檔的Demo的寫法,要在WXEntryActivity寫回調(diào)邏輯(這一塊建議直接可以看Demo中的WXEntryActivity類),我這里就寫一個(gè)簡(jiǎn)單的吧
        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是個(gè)假設(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("分享失敗,錯(cuò)誤碼:"+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,這是一個(gè)Activity,不寫finish的話你就無法和你的Activity交互。

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


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

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


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




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

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

        這是一個(gè)比較坑的問題了,好像挺早前就有了,簡(jiǎn)單來說,問題是:微信分享之后,選擇留在微信,再返回應(yīng)用,接收不到回調(diào)。

        是的,無論是Android還是IOS都是這樣,似乎是微信這樣特意去設(shè)計(jì)的,因?yàn)镼Q是可以的,QQ分享選擇留在QQ,返回之后也是有回調(diào)的。

        當(dāng)前版本分享到朋友圈不會(huì)有這個(gè)選擇,所以可以只對(duì)分享到微信做處理,那么官方?jīng)]有處理的辦法怎么辦?我們只能自己寫邏輯去處理了。


        先測(cè)下一下各種情況下的生命周期情況(可能不同的版本流程不同)

        (1)分享直接錯(cuò)誤,沒有跳轉(zhuǎn)微信的情況:
        send -> onPause -> WXEntryActivity -> onResume

        (2)分享時(shí)彈出同一個(gè)頁面提示分享錯(cuò)誤:
        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
        可以看出這種情況也不會(huì)調(diào)用WXEntryActivity

        (5)分享成功后選擇返回應(yīng)用:
        send -> onPause -> onStop -> 分享成功后選返回應(yīng)用 -> onStart -> WXEntryActivity ?-> onResume

        (6)分享成功后選擇留在微信:
        send -> onPause -> onStop -> 分享成功后選留在微信 -> onStart -> onResume -> onPause -> onStop -> 再手動(dòng)返回應(yīng)用 -> onStart ?-> onResume
        不知道為什么會(huì)調(diào)兩次生命周期

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


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

        從上面的所有情況的生命周期觀察,我的做法是判斷send方法之后有調(diào)用onStop 生命周期就表示跳轉(zhuǎn)微信的情況。

        我是自己定義一個(gè)狀態(tài)state去判斷分享的結(jié)果,onResume的時(shí)候返回分享的結(jié)果,send之前state為0,默認(rèn)設(shè)置結(jié)果為分享失敗,send+onStop 之后設(shè)置結(jié)果為分享成功,WXEntryActivity ?之后再把結(jié)果覆蓋之前的變量,然后onResume返回。



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


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

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            99乱伦 | 免费视频爱爱太爽 | 高潮喷水高清无码 | 国产 高清秘 成人久久 | 毛片毛片| 性爱免费网站 | 动漫做爱网站 | 一级黄片学生妹 | 凹凸日日摸日日碰夜夜爽孕妇 | 黑人大屌双插欧美女人 |