android 分享小程序到微信聊天、朋友圈,java生成小程序

2019-05-10  本文已影响0人  罗宾船长
准备:
  1. 微信开放平台:https://open.weixin.qq.com
  2. 需要拿到的参数:AppId小程序原始Id
  3. 接入指南:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=1417751808&token=&lang=zh_CN
  4. 微信demo下载地址:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=&lang=zh_CN
一、分享到聊天
    private IWXAPI api;

    // 在Activity的onCreate生命周期中初始化
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.xxx);
        api = WXAPIFactory.createWXAPI(this, null); //初始化api
        api.registerApp(AppId);//注册 
    }

    //点击事件
    private void shareMiNiToWeChat(){
        WXMiniProgramObject miniProgram = new WXMiniProgramObject();
        miniProgram.webpageUrl=web链接; // 低版本或者pad使用这个链接,必填不然调不起微信
        miniProgram.userName=小程序原始Id; // 小程序原始Id
        miniProgram.path = 我是小程序页面地址; //小程序页面路径 需要参数直接 用?后面拼接
        WXMediaMessage mediaMessage = new WXMediaMessage(miniProgram);
        mediaMessage.title =我是一个标题;//分享出去后的标题
        mediaMessage.description = "";//描述
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.mini_speed_bg);//带图片分享
        Bitmap sendBitmap = Bitmap.createScaledBitmap(bitmap,200,200,true);
        bitmap.recycle();
        mediaMessage.thumbData = WXUtil.bmpToByteArray(sendBitmap,true); // 这行报错 bmpToByteArray()方法在下面
        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.transaction = "";
        req.scene = SendMessageToWX.Req.WXSceneSession;//分享到会话聊天
        req.message = mediaMessage;
        api.sendReq(req);
    }

    // 可以放到自己的工具类中 微信规定图片不能大于128kb
    public static byte[] bmpToByteArray(final Bitmap bmp, final boolean needRecycle) {
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        bmp.compress(CompressFormat.PNG, 100, output);
        if (needRecycle) {
            bmp.recycle();
        }
        
        byte[] result = output.toByteArray();
        try {
            output.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return result;
    }
二、分享到朋友圈

小程序类型分享只支持分享小程序类型消息至会话,暂不支持分享至朋友圈,所以没法通过改变scene来分享到朋友圈。

分享到对话: 
SendMessageToWX.Req.WXSceneSession 
分享到朋友圈: 
SendMessageToWX.Req.WXSceneTimeline ; 
分享到收藏: 
SendMessageToWX.Req.WXSceneFavorite

目前常见的作法是用分享图片小程序码的方式,那么我们需要准备的东西就是小程序码了,这个小程序码让后台生成返回就行。
生成小程序码文档地址:https://developers.weixin.qq.com/miniprogram/dev/api-backend/wxacode.getUnlimited.html

    // token 获取的方法自行百度   Getwxacodeunlimit  就是文档中的参数
    public static String getwxacodeunlimit(String access_token, Getwxacodeunlimit getwxacodeunlimit) {
        try {
            URL url = new URL("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="+access_token);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("POST");// 提交模式
//             conn.setConnectTimeout(10000);//连接超时 单位毫秒
//             conn.setReadTimeout(2000);//读取超时 单位毫秒
            // 发送POST请求必须设置如下两行
            httpURLConnection.setDoOutput(true);
            httpURLConnection.setDoInput(true);
            // 获取URLConnection对象对应的输出流
            PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());
            // 发送请求参数
            JSONObject paramJson = new JSONObject();
            if(!TextUtils.isEmpty(getwxacodeunlimit.getScene())){
                paramJson.put("scene", getwxacodeunlimit.getScene());
            }
            paramJson.put("page", getwxacodeunlimit.getPage());

            if(getwxacodeunlimit.getLine_color()!=null){
                JSONObject lineColor = new JSONObject();
                lineColor.put("r", getwxacodeunlimit.getLine_color().getR());
                lineColor.put("g", getwxacodeunlimit.getLine_color().getG());
                lineColor.put("b", getwxacodeunlimit.getLine_color().getB());
                paramJson.put("line_color", lineColor);

            }else{
                JSONObject lineColor = new JSONObject();
                lineColor.put("r", 41);
                lineColor.put("g", 191);
                lineColor.put("b", 141);
                paramJson.put("line_color", lineColor);
            }

            printWriter.write(paramJson.toString());
            // flush输出流的缓冲
            printWriter.flush();
            //开始获取数据
            BufferedInputStream bis = new BufferedInputStream(httpURLConnection.getInputStream());
            byte[] bytes = IOUtils.toByteArray(bis);
            String encoded = Base64.getEncoder().encodeToString(bytes);
            return encoded;
        } catch (Exception e) {
            e.printStackTrace();
        }
       return null;
    }

以上是获取微信小程序码图片的 base64 ,获取到后台返回的数据后可以到这个网站http://imgbase64.duoshitong.com/解析出图片,格式为:data:image/jpeg;base64, + 后台返回字符串
base64转图片代码如下,需要注意的是后台返回的字符串有开头没有 data:image/jpeg;base64,

/**
     * base64转bitmap
     * @param string
     * @return
     */
    public static Bitmap stringToBitmap(String string) {
        Bitmap bitmap = null;
        try {
            // 如果你的base64前面有data:image/jpeg;base64,  则使用 string.split(",")[1]
            byte[] bitmapArray = Base64.decode(string, Base64.DEFAULT);
            bitmap = BitmapFactory.decodeByteArray(bitmapArray, 0, bitmapArray.length);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bitmap;
    }

拿到小程序码的bitmap后就可以根据ui拼接出自己的分享海报了。

    // 分享到朋友圈 其实就是分享图片
    private void shareMiNiToTimeLine(){
        //图片资源
        Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.send_img);
        //初始化 WXImageObject 和 WXMediaMessage 对象
        WXImageObject imgObj = new WXImageObject(bmp);
        WXMediaMessage msg = new WXMediaMessage();
        msg.mediaObject = imgObj;

        //设置缩略图
        Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, THUMB_SIZE, THUMB_SIZE, true);
        bmp.recycle();
        msg.thumbData = WXUtil.bmpToByteArray(thumbBmp, true);

        //构造一个Req
        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.transaction = buildTransaction("img");
        req.message = msg;
        req.scene = SendMessageToWX.Req.WXSceneTimeline;
        //调用api接口,发送数据到微信
        api.sendReq(req);
    }
上一篇下一篇

猜你喜欢

热点阅读