美文网首页
谈谈微信分享那点事儿

谈谈微信分享那点事儿

作者: Bount林 | 来源:发表于2020-03-03 12:01 被阅读0次

    最近的项目中结合到了微信分享的功能,今天就来记录一下我的集成过程以及遇到的“坑”,项目中一开始集成的Mob平台的shareSDk,但是我们的测试人员很厉害发现的一个shareSDk的bug,比如:第一次分享朋友圈(没有分享) --切到后台--再切换回系统--点击微信好友--调出来的是微信朋友圈分享的界面。由于这个bug 咨询了一下Mob平台的客服,客服回答说这个一个正常现象,So,我换成了微信开发平台的微信分享。
    1.第一步就是注册登录申请 appId和appSecret。
    2.在app下的build.gradle中添加依赖

      compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
    

    3.开始使用
    附上官方平台链接点击进入
    图文分享

      // 通过appId得到IWXAPI这个对象
           IWXAPI wxapi = WXAPIFactory.createWXAPI(context, appId);
           // 检查手机或者模拟器是否安装了微信
           if (!wxapi.isWXAppInstalled()) {
               ToastUtil.makeText("您还没有安装微信");
               return;
           }
    
           // 初始化一个WXWebpageObject对象
           WXWebpageObject webpageObject = new WXWebpageObject();
           // 填写网页的url
           webpageObject.webpageUrl = webUrl;
    
           // 用WXWebpageObject对象初始化一个WXMediaMessage对象
           WXMediaMessage msg = new 
           WXMediaMessage(webpageObject);
           // 填写网页标题、描述、位图
           msg.title = title;
           msg.description = content;
           // 如果没有位图,可以传null,会显示默认的图片
           msg.setThumbImage(bitmap);
    
           // 构造一个Req
           SendMessageToWX.Req req = new SendMessageToWX.Req();
           // transaction用于唯一标识一个请求(可自定义)
           req.transaction = "webpage";
           // 上文的WXMediaMessage对象
           req.message = msg;
           // SendMessageToWX.Req.WXSceneSession是分享到好友会话
           // SendMessageToWX.Req.WXSceneTimeline是分享到朋友圈
           req.scene = SendMessageToWX.Req.WXSceneSession;
    
           // 向微信发送请求
           wxapi.sendReq(req);
    

    图片分享
    本地的图片好分享,如果是网络图片的链接呢,在项目中我直接将url转成bitmap

       // 通过appId得到IWXAPI这个对象
            IWXAPI wxapi = WXAPIFactory.createWXAPI(context, appId);
            // 检查手机或者模拟器是否安装了微信
            if (!wxapi.isWXAppInstalled()) {
                ToastUtil.ToastUtil(context, "您还没有安装微信");
                return;
            }
     
            Bitmap bmp = getBitMBitmap(imagePath); //URL转Bitmap
    
            //初始化 WXImageObject 和 WXMediaMessage 对象
            WXImageObject imgObj = new WXImageObject(bmp);
            WXMediaMessage msg = new WXMediaMessage();
            msg.mediaObject = imgObj;
    
            //构造一个Req
            SendMessageToWX.Req req = new SendMessageToWX.Req();
            req.transaction = "img";
            req.message = msg;
    
            if (type == 0) {
                req.scene = SendMessageToWX.Req.WXSceneSession;//好友列表
            } else if (type == 1) {
                req.scene = SendMessageToWX.Req.WXSceneTimeline;//朋友圈
            }
    
            // 向微信发送请求
            wxapi.sendReq(req);
    
    /**
         * 通过图片url生成Bitmap对象
         *
         * @param urlpath
         * @return Bitmap
         * 根据图片url获取图片对象
         */
        public static Bitmap getBitMBitmap(String urlpath) {
            Bitmap map = null;
            try {
                URL url = new URL(urlpath);
                URLConnection conn = url.openConnection();
                conn.connect();
                InputStream in;
                in = conn.getInputStream();
                map = BitmapFactory.decodeStream(in);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return map;
        }
    

    还可以使用Glide有个方法可以直接异步获取网络图片的位图

    Glide.with(this).asBitmap().load("图片url").into(new SimpleTarget<Bitmap>() {
               /**
                * 成功的回调
                */
               @Override
               public void onResourceReady(Bitmap bitmap, Transition<? super Bitmap> transition) {
                   // 下面这句代码是一个过度dialog,因为是获取网络图片,需要等待时间
                   mDialog.dismiss();
                   // 调用方法微信方法,传入bitmap
               
               }
    
               /**
                * 失败的回调
                */
               @Override
               public void onLoadFailed(@Nullable Drawable errorDrawable) {
                   super.onLoadFailed(errorDrawable);
                   mDialog.dismiss();
    
              }
    });
    

    最后
    在app模块包的根目录下新建一个wxapi的包,在这个包下面新建一个WXEntryActivity,这两步缺一不可,而且名字也要一模一样,不要问我为什么,微信规定的。

    image.png

    WXEntryActivity中的代码

    public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
    
        private IWXAPI wxapi;
    
        @Override
        protected void onNewIntent(Intent intent) {
            super.onNewIntent(intent);
            setIntent(intent);
            wxapi.handleIntent(intent, this);
        }
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_wxentry);
    
            wxapi = WXAPIFactory.createWXAPI(this, BuildConfig.wechat_appId);
            wxapi.handleIntent(getIntent(), this);
        }
    
        /**
         * 微信发送请求到第三方应用时,会回调到该方法
         */
        @Override
        public void onReq(BaseReq baseReq) {
            // 这里不作深究
        }
    
        /**
         * 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法
         * app发送消息给微信,处理返回消息的回调
         */
        @Override
        public void onResp(BaseResp baseResp) {
            switch (baseResp.errCode) {
                // 正确返回
                case BaseResp.ErrCode.ERR_OK:
                    switch (baseResp.getType()) {
                        // ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX是微信分享,api自带
                        case ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX:
                            // 只是做了简单的finish操作
                            LogUtils.i("WXEntryActivity", "成功 ");
                            Map<String, String> mapStr = new HashMap<>();
                            mapStr.put("message", "分享成功");
                            LogUtils.i("Tag", "messageStr:" + new Gson().toJson(mapStr));
                            finish();
                            break;
                        default:
                            break;
                    }
                    break;
                default:
                    // 错误返回
                    switch (baseResp.getType()) {
                        // 微信分享
                        case ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX:
                            LogUtils.i("WXEntryActivity", ">>>errCode = " + baseResp.errCode);
                            Map<String, String> mapStr = new HashMap<>();
                            mapStr.put("message", "分享失败");
                            LogUtils.i("Tag", "messageStr:" + new Gson().toJson(mapStr));
                            WebViewActivity.callJSMethod("sharePictureCallback", new Gson().toJson(mapStr));
    
                            finish();
                            break;
                        default:
                            break;
                    }
                    break;
            }
        }
    }
    

    这样还没完,最后需要在manifests文件中申明这个Activity

    <activity
        // 下面三行代码必须要有
        android:name=".wxapi.WXEntryActivity"
        android:exported="true"
        android:launchMode="singleTop"
        // 下面两行代码可有可无
        android:screenOrientation="portrait"
        // 指定一个主题,这里是无标题、半透明的主题
        android:theme="@style/NoTitleTranslucent80Theme"/>
    

    至此,一个完整的微信分享功能就实现了。
    Last :分享的图片大小不能大于32KB,最好压缩一下图片。

    相关文章

      网友评论

          本文标题:谈谈微信分享那点事儿

          本文链接:https://www.haomeiwen.com/subject/lclqlhtx.html