準(zhǔn)備:
- 微信開(kāi)放平臺(tái):https://open.weixin.qq.com。
- 需要拿到的參數(shù):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);//注冊(cè)
}
//點(diǎn)擊事件
private void shareMiNiToWeChat(){
WXMiniProgramObject miniProgram = new WXMiniProgramObject();
miniProgram.webpageUrl=web鏈接; // 低版本或者pad使用這個(gè)鏈接,必填不然調(diào)不起微信
miniProgram.userName=小程序原始Id; // 小程序原始Id
miniProgram.path = 我是小程序頁(yè)面地址; //小程序頁(yè)面路徑 需要參數(shù)直接 用?后面拼接
WXMediaMessage mediaMessage = new WXMediaMessage(miniProgram);
mediaMessage.title =我是一個(gè)標(biāo)題;//分享出去后的標(biāo)題
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); // 這行報(bào)錯(cuò) bmpToByteArray()方法在下面
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = "";
req.scene = SendMessageToWX.Req.WXSceneSession;//分享到會(huì)話聊天
req.message = mediaMessage;
api.sendReq(req);
}
// 可以放到自己的工具類中 微信規(guī)定圖片不能大于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;
}
二、分享到朋友圈
小程序類型分享只支持分享小程序類型消息至?xí)?,暫不支持分享至朋友圈,所以沒(méi)法通過(guò)改變scene來(lái)分享到朋友圈。
分享到對(duì)話:
SendMessageToWX.Req.WXSceneSession
分享到朋友圈:
SendMessageToWX.Req.WXSceneTimeline ;
分享到收藏:
SendMessageToWX.Req.WXSceneFavorite
目前常見(jiàn)的作法是用分享圖片小程序碼的方式,那么我們需要準(zhǔn)備的東西就是小程序碼了,這個(gè)小程序碼讓后臺(tái)生成返回就行。
生成小程序碼文檔地址:https://developers.weixin.qq.com/miniprogram/dev/api-backend/wxacode.getUnlimited.html
// token 獲取的方法自行百度 Getwxacodeunlimit 就是文檔中的參數(shù)
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);//連接超時(shí) 單位毫秒
// conn.setReadTimeout(2000);//讀取超時(shí) 單位毫秒
// 發(fā)送POST請(qǐng)求必須設(shè)置如下兩行
httpURLConnection.setDoOutput(true);
httpURLConnection.setDoInput(true);
// 獲取URLConnection對(duì)象對(duì)應(yīng)的輸出流
PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());
// 發(fā)送請(qǐng)求參數(shù)
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();
//開(kāi)始獲取數(shù)據(jù)
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 ,獲取到后臺(tái)返回的數(shù)據(jù)后可以到這個(gè)網(wǎng)站http://imgbase64.duoshitong.com/解析出圖片,格式為:data:image/jpeg;base64, + 后臺(tái)返回字符串。
base64轉(zhuǎn)圖片代碼如下,需要注意的是后臺(tái)返回的字符串有開(kāi)頭沒(méi)有 data:image/jpeg;base64,
/**
* base64轉(zhuǎn)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后就可以根據(jù)ui拼接出自己的分享海報(bào)了。
// 分享到朋友圈 其實(shí)就是分享圖片
private void shareMiNiToTimeLine(){
//圖片資源
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.send_img);
//初始化 WXImageObject 和 WXMediaMessage 對(duì)象
WXImageObject imgObj = new WXImageObject(bmp);
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = imgObj;
//設(shè)置縮略圖
Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, THUMB_SIZE, THUMB_SIZE, true);
bmp.recycle();
msg.thumbData = WXUtil.bmpToByteArray(thumbBmp, true);
//構(gòu)造一個(gè)Req
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("img");
req.message = msg;
req.scene = SendMessageToWX.Req.WXSceneTimeline;
//調(diào)用api接口,發(fā)送數(shù)據(jù)到微信
api.sendReq(req);
}