准备:
- 微信开放平台:https://open.weixin.qq.com。
- 需要拿到的参数:AppId、小程序原始Id。
- 接入指南:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=1417751808&token=&lang=zh_CN。
- 微信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);
}