安卓 -- 微信分享集成

2017 - 04 - 10

1, 首先需要在微信开放平台创建应用,网址:open.weixin.qq.com   Ps:吐槽一下微信东西放的好乱。

其中应用包名和 签名千万不要乱写,其他的看着办吧;然后提交审核

签名可以用腾讯公司提供的签名获取工具 ,

网址:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=&lang=zh_CN

图1:

图2:


大概等待一周后审核通过就可以集成了。


2,之前集成大多采用的的libmmsdk的jar包形式,现在微信已经发布到jcenter,可以采用Gradle的compile,如图:

图3:


3,开始集成到项目

3.1需要的权限

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

3.2

这里我采用的是网上大神封装的一个工具类 ,在此也万分感谢大神;

代码中的Wechatutils工具类就是微信示例代码的utils工具类,大家可以自己copy过来,我只是改了名字

网址:http://www.2cto.com/kf/201410/346762.html

public class WechatShareManager {
    private static final int THUMB_SIZE = 150;

    public static final int WECHAT_SHARE_WAY_TEXT = 1;   //文字
    public static final int WECHAT_SHARE_WAY_PICTURE = 2; //图片
    public static final int WECHAT_SHARE_WAY_WEBPAGE = 3;  //链接
    public static final int WECHAT_SHARE_WAY_VIDEO = 4; //视频
    public static final int WECHAT_SHARE_TYPE_TALK = SendMessageToWX.Req.WXSceneSession;  //会话
    public static final int WECHAT_SHARE_TYPE_FRENDS = SendMessageToWX.Req.WXSceneTimeline; //朋友圈

    private static WechatShareManager mInstance;
    private ShareContent mShareContentText, mShareContentPicture, mShareContentWebpag, mShareContentVideo;
    public IWXAPI  mWXApi;
    private Context mContext;

    private WechatShareManager(Context context){
        this.mContext = context;
        //初始化数据
        //初始化微信分享代码
        initWechatShare(context);
    }

    /**
     * 获取WeixinShareManager实例
     * 非线程安全,请在UI线程中操作
     * @return
     */
    public static WechatShareManager getInstance(Context context){
        if(mInstance == null){
            mInstance = new WechatShareManager(context);
        }
        return mInstance;
    }

    private void initWechatShare(Context context){
        if (mWXApi == null) {
            mWXApi = WXAPIFactory.createWXAPI(context, Constants.APP_ID, true);
        }
        mWXApi.registerApp(Constants.APP_ID);
    }

    /**
     * 通过微信分享
     * @param shareContent 分享的方式(文本、图片、链接)
     * @param shareType 分享的类型(朋友圈,会话)
     */
    public void shareByWebchat(ShareContent shareContent, int shareType){
        switch (shareContent.getShareWay()) {
            case WECHAT_SHARE_WAY_TEXT:
                shareText(shareContent, shareType);
                break;
            case WECHAT_SHARE_WAY_PICTURE:
                sharePicture(shareContent, shareType);
                break;
            case WECHAT_SHARE_WAY_WEBPAGE:
                ULog.e("调用shareByWebchat","调用shareByWebchat");
                shareWebPage(shareContent, shareType);
                break;
            case WECHAT_SHARE_WAY_VIDEO:
//                shareVideo(shareContent, shareType);
                break;
        }
    }

    private abstract class ShareContent {
        protected abstract int getShareWay();
        protected abstract String getContent();
        protected abstract String getTitle();
        protected abstract String getURL();
        protected abstract int getPictureResource();
    }

    /**
     * 设置分享文字的内容
     * @author chengcj1
     *
     */
    public class ShareContentText extends ShareContent {
        private String content;

        /**
         * 构造分享文字类
         * @param content 分享的文字内容
         */
        public ShareContentText(String content){
            this.content = content;
        }

        @Override
        protected int getShareWay() {
            return WECHAT_SHARE_WAY_TEXT;
        }

        @Override
        protected String getContent() {
            return content;
        }

        @Override
        protected String getTitle() {
            return null;
        }

        @Override
        protected String getURL() {
            return null;
        }

        @Override
        protected int getPictureResource() {
            return -1;
        }
    }

    /*
     * 获取文本分享对象
     */
    public ShareContent getShareContentText(String content) {
        if (mShareContentText == null) {
            mShareContentText = new ShareContentText(content);
        }
        return (ShareContentText) mShareContentText;
    }

    /**
     * 设置分享图片的内容
     * @author chengcj1
     *
     */
    public class ShareContentPicture extends ShareContent {
        private int pictureResource;
        public ShareContentPicture(int pictureResource){
            this.pictureResource = pictureResource;
        }

        @Override
        protected int getShareWay() {
            return WECHAT_SHARE_WAY_PICTURE;
        }

        @Override
        protected int getPictureResource() {
            return pictureResource;
        }

        @Override
        protected String getContent() {
            return null;
        }

        @Override
        protected String getTitle() {
            return null;
        }

        @Override
        protected String getURL() {
            return null;
        }
    }

    /*
     * 获取图片分享对象
     */
    public ShareContent getShareContentPicture(int pictureResource) {
        if (mShareContentPicture == null) {
            mShareContentPicture = new ShareContentPicture(pictureResource);
        }
        return (ShareContentPicture) mShareContentPicture;
    }

    /**
     * 设置分享链接的内容
     * @author chengcj1
     *
     */
    public class ShareContentWebpage extends ShareContent {
        private String title;
        private String content;
        private String url;
        private int pictureResource;
        public ShareContentWebpage(String title, String content, String url, int pictureResource){
            this.title = title;
            this.content = content;
            this.url = url;
            this.pictureResource = pictureResource;
        }

        @Override
        protected int getShareWay() {
            return WECHAT_SHARE_WAY_WEBPAGE;
        }

        @Override
        protected String getContent() {
            return content;
        }

        @Override
        protected String getTitle() {
            return title;
        }

        @Override
        protected String getURL() {
            return url;
        }

        @Override
        protected int getPictureResource() {
            return pictureResource;
        }
    }

    /*
     * 获取网页分享对象
     */
    public ShareContent getShareContentWebpag(String title, String content, String url, int pictureResource) {
        if (mShareContentWebpag == null) {
            mShareContentWebpag = new ShareContentWebpage(title, content, url, pictureResource);
        }
        return (ShareContentWebpage) mShareContentWebpag;
    }

    /**
     * 设置分享视频的内容
     * @author chengcj1
     *
     */
    public class ShareContentVideo extends ShareContent {
        private String url;
        public ShareContentVideo(String url) {
            this.url = url;
        }

        @Override
        protected int getShareWay() {
            return WECHAT_SHARE_WAY_VIDEO;
        }

        @Override
        protected String getContent() {
            return null;
        }

        @Override
        protected String getTitle() {
            return null;
        }

        @Override
        protected String getURL() {
            return url;
        }

        @Override
        protected int getPictureResource() {
            return -1;
        }
    }

    /*
     * 获取视频分享内容
     */
    public ShareContent getShareContentVideo(String url) {
        if (mShareContentVideo == null) {
            mShareContentVideo = new ShareContentVideo(url);
        }
        return (ShareContentVideo) mShareContentVideo;
    }

    /*
     * 分享文字
     */
    private void shareText(ShareContent shareContent, int shareType) {
        if (!isInstallWX()) {
            return;
        }
        String text = shareContent.getContent();
        //初始化一个WXTextObject对象
        WXTextObject textObj = new WXTextObject();
        textObj.text = text;
        //用WXTextObject对象初始化一个WXMediaMessage对象
        WXMediaMessage msg = new WXMediaMessage();
        msg.mediaObject = textObj;
        msg.description = text;
        //构造一个Req
        SendMessageToWX.Req req = new SendMessageToWX.Req();
        //transaction字段用于唯一标识一个请求
        req.transaction = buildTransaction("textshare");
        req.message = msg;
        //发送的目标场景, 可以选择发送到会话 WXSceneSession 或者朋友圈 WXSceneTimeline。 默认发送到会话。
        req.scene = shareType;
        mWXApi.sendReq(req);
    }

    /*
     * 分享图片
     */
    private void sharePicture(ShareContent shareContent, int shareType) {
        if (!isInstallWX()) {
            return;
        }
        Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), shareContent.getPictureResource());
        WXImageObject imgObj = new WXImageObject(bitmap);

        WXMediaMessage msg = new WXMediaMessage();
        msg.mediaObject = imgObj;
        //在这设置缩略图
        //官方文档介绍这个bitmap不能超过32kb
        //如果一个像素是8bit的话换算成正方形的bitmap则边长不超过181像素,边长设置成150是比较保险的
        //或者使用msg.setThumbImage(thumbBitmap);省去自己转换二进制数据的过程
        //如果超过32kb则抛异常
        Bitmap thumbBitmap =  Bitmap.createScaledBitmap(bitmap, THUMB_SIZE, THUMB_SIZE, true);
        bitmap.recycle();
        msg.thumbData = WechatUtils.bmpToByteArray(thumbBitmap, true);  //设置缩略图

        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.transaction = buildTransaction("imgshareappdata");
        req.message = msg;
        req.scene = shareType;
        mWXApi.sendReq(req);
    }

    /*
     * 分享链接
     */
    private void shareWebPage(ShareContent shareContent, int shareType) {
        if (!isInstallWX()) {
           
            return;
        }
        
        WXWebpageObject webpage = new WXWebpageObject();
        webpage.webpageUrl = shareContent.getURL();
        WXMediaMessage msg = new WXMediaMessage(webpage);
        msg.title = shareContent.getTitle();
        msg.description = shareContent.getContent();

        //在这设置缩略图
        //官方文档介绍这个bitmap不能超过32kb
        //如果一个像素是8bit的话换算成正方形的bitmap则边长不超过181像素,边长设置成150是比较保险的
        //或者使用msg.setThumbImage(thumbBitmap);省去自己转换二进制数据的过程
        //如果超过32kb则抛异常
        Bitmap thumb = BitmapFactory.decodeResource(mContext.getResources(), shareContent.getPictureResource());
        if(thumb == null) {
            Toast.makeText(mContext, "图片不能为空", Toast.LENGTH_SHORT).show();
        } else {
            msg.thumbData = WechatUtils.bmpToByteArray(thumb, true);
//            msg.setThumbImage(thumb);
        }

        SendMessageToWX.Req req = new SendMessageToWX.Req();//创建一个请求对象
        req.transaction = buildTransaction("webpage");//这个tag要唯一,用于在回调中分辨是哪个分享请求
        req.message = msg;//把msg放入请求对象中
        req.scene = shareType;//发送到哪里的字段
//        req.scene = SendMessageToWX.Req.WXSceneTimeline;发送到朋友圈
        //req.scene = SendMessageToWX.Req.WXSceneSession;   //设置发送给朋友
        boolean b = mWXApi.sendReq(req);//如果调用成功微信,会返回true
        
    }

    /*
     * 分享视频
     */
//    private void shareVideo(ShareContent shareContent, int shareType) {
//            if (!isInstallWX()) {
//                return;
//            }
//        WXVideoObject video = new WXVideoObject();
//        video.videoUrl = shareContent.getURL();
//
//        WXMediaMessage msg = new WXMediaMessage(video);
//        msg.title = shareContent.getTitle();
//        msg.description = shareContent.getContent();
//        Bitmap thumb = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.send_music_thumb);
//        //      BitmapFactory.decodeStream(new URL(video.videoUrl).openStream());
//        /**
//         * 测试过程中会出现这种情况,会有个别手机会出现调不起微信客户端的情况。造成这种情况的原因是微信对缩略图的大小、title、description等参数的大小做了限制,所以有可能是大小超过了默认的范围。
//         * 一般情况下缩略图超出比较常见。Title、description都是文本,一般不会超过。
//         */
//        Bitmap thumbBitmap =  Bitmap.createScaledBitmap(thumb, THUMB_SIZE, THUMB_SIZE, true);
//        thumb.recycle();
//        msg.thumbData = WechatUtils.bmpToByteArray(thumbBitmap, true);
//
//        SendMessageToWX.Req req = new SendMessageToWX.Req();
//        req.transaction = buildTransaction("video");
//        req.message = msg;
//        req.scene =  shareType;
//        mWXApi.sendReq(req);
//    }

    private String buildTransaction(final String type) {
        return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
    }

    // 判断手机是否安装微信
    private boolean isInstallWX() {

        if(!mWXApi.isWXAppInstalled()) {
            ToastUtils.show(APP.getContext(), "请先安装微信", Toast.LENGTH_LONG);
            
            return false;
        } else if (!mWXApi.isWXAppSupportAPI()) {
            ToastUtils.show(APP.getContext(), "请将已安装的微信升级至最新版本", Toast.LENGTH_LONG);
            
            return false;
        } else {
            return true;
        }


    }
}

然后调用工具类去分享:

 @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.id_ll_share_toFriends://分享给好友
                WechatShareManager.ShareContentWebpage mShareContentWebpag = (WechatShareManager.ShareContentWebpage) mShareManager.getShareContentWebpag(title,content,url,R.mipmap.ic_launcher);
                mShareManager.shareByWebchat(mShareContentWebpag,WechatShareManager.WECHAT_SHARE_TYPE_TALK);
                break;
            case R.id.id_ll_share_toFriendsLine://分享到好友圈
                WechatShareManager.ShareContentWebpage mShareContentWebpagToLine = (WechatShareManager.ShareContentWebpage) mShareManager.getShareContentWebpag(title,content,url,R.mipmap.ic_launcher);
                mShareManager.shareByWebchat(mShareContentWebpagToLine,WechatShareManager.WECHAT_SHARE_TYPE_FRENDS);
                break;
        }

    }

其实我看现在微信开放平台关于分享的写的比较清楚了,基本可以拿来使用,

在开放平台 -- 资源中心 --- 分享与收藏功能 --- Android应用下,

网址:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317340&token=f7ec6832f33c43b585586e7b708f10d92965ffad&lang=zh_CN


图5:


3.3 处理分享后的回调

这里需要在自己的包下新建一个package,这个package名称是确定的,

肯定一定要是wxapi,比如说我的包名是com.test.project,那么新建的包名就在这个下面,是com.test.project.wxapi

在这个包下面新建(或者直接把示例的类copy过来)WXEntryActivity集成activity,实现IWXAPIEventHandler接口,在oncreate中需要调用handleIntent方法,处理微信传回的intent,你也可以在其他地方处理

在onResp中是你请求微信返回的,你可以在这里处理,我只弹了个吐司,然后finish掉回到自己的页面处理。

 protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //处理微信传回的Intent,当然你也可以在别的地方处理
        WechatShareManager.getInstance(this).mWXApi.handleIntent(getIntent(), this);
    }


@Override
    public void onResp(BaseResp baseResp) {//在这个方法中处理微信传回的数据
        String result = "分享错误";
        //形参resp 有下面两个个属性比较重要
        //1.resp.errCode
        //2.resp.transaction则是在分享数据的时候手动指定的字符串,用来分辨是那次分享(参照4.中req.transaction)
        switch (baseResp.errCode) { //根据需要的情况进行处理

            case BaseResp.ErrCode.ERR_OK:
                //正确返回
                result = "分享成功";
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL:
                //用户取消
                result = "分享取消";
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED:
                //认证被否决
                result = "分享被拒绝";
                break;
            case BaseResp.ErrCode.ERR_SENT_FAILED:
                //发送失败
                result = "分享失败";
                break;
            case BaseResp.ErrCode.ERR_UNSUPPORT:
                //不支持错误
                result = "不支持错误";
                break;
            case BaseResp.ErrCode.ERR_COMM:
                //一般错误
                result = "分享发生错误";
                break;
            default:
                //其他不可名状的情况
                result = "分享出现未知错误";
                break;

//            Intent intent = new Intent(this, xxx.class);
//            intent.putExtra("errCode", resp.errCode);
//            intent.putExtra("errStr", resp.transaction);
//            startActivity(intent);
//            finish();

        }

        ToastUtils.show(this,result, Toast.LENGTH_SHORT);
        finish();



    }

另外:onNewIntent也复写下

 @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        WechatShareManager.getInstance(this).mWXApi.handleIntent(intent, this);
    }

别忘了在清单文件中注册改activity

<!--注意这个exported="true"属性一定是true,不然微信不能调用-->
        <activity android:name=".wxapi.WXEntryActivity"
                  android:screenOrientation="portrait"
                  android:launchMode="singleTask"
                  android:exported="true"/>


最后注意事项:

1.签名不能错,最后一开始就用release版本的签名,免得之后忘记

2.缩略图大小不能超过32k

3.清单文件中要注册,exported必须是true

4.回调的包名一定是wxapi







猜你喜欢

转载自blog.csdn.net/MelvinCen/article/details/69946622