最近的項(xiàng)目中結(jié)合到了微信分享的功能幌绍,今天就來(lái)記錄一下我的集成過(guò)程以及遇到的“坑”,項(xiàng)目中一開(kāi)始集成的Mob平臺(tái)的shareSDk,但是我們的測(cè)試人員很厲害發(fā)現(xiàn)的一個(gè)shareSDk的bug,比如:第一次分享朋友圈(沒(méi)有分享) --切到后臺(tái)--再切換回系統(tǒng)--點(diǎn)擊微信好友--調(diào)出來(lái)的是微信朋友圈分享的界面。由于這個(gè)bug 咨詢了一下Mob平臺(tái)的客服,客服回答說(shuō)這個(gè)一個(gè)正常現(xiàn)象廊遍,So,我換成了微信開(kāi)發(fā)平臺(tái)的微信分享贩挣。
1.第一步就是注冊(cè)登錄申請(qǐng) appId和appSecret喉前。
2.在app下的build.gradle中添加依賴
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
3.開(kāi)始使用
附上官方平臺(tái)鏈接點(diǎn)擊進(jìn)入
圖文分享
// 通過(guò)appId得到IWXAPI這個(gè)對(duì)象
IWXAPI wxapi = WXAPIFactory.createWXAPI(context, appId);
// 檢查手機(jī)或者模擬器是否安裝了微信
if (!wxapi.isWXAppInstalled()) {
ToastUtil.makeText("您還沒(méi)有安裝微信");
return;
}
// 初始化一個(gè)WXWebpageObject對(duì)象
WXWebpageObject webpageObject = new WXWebpageObject();
// 填寫(xiě)網(wǎng)頁(yè)的url
webpageObject.webpageUrl = webUrl;
// 用WXWebpageObject對(duì)象初始化一個(gè)WXMediaMessage對(duì)象
WXMediaMessage msg = new
WXMediaMessage(webpageObject);
// 填寫(xiě)網(wǎng)頁(yè)標(biāo)題、描述王财、位圖
msg.title = title;
msg.description = content;
// 如果沒(méi)有位圖卵迂,可以傳null,會(huì)顯示默認(rèn)的圖片
msg.setThumbImage(bitmap);
// 構(gòu)造一個(gè)Req
SendMessageToWX.Req req = new SendMessageToWX.Req();
// transaction用于唯一標(biāo)識(shí)一個(gè)請(qǐng)求(可自定義)
req.transaction = "webpage";
// 上文的WXMediaMessage對(duì)象
req.message = msg;
// SendMessageToWX.Req.WXSceneSession是分享到好友會(huì)話
// SendMessageToWX.Req.WXSceneTimeline是分享到朋友圈
req.scene = SendMessageToWX.Req.WXSceneSession;
// 向微信發(fā)送請(qǐng)求
wxapi.sendReq(req);
圖片分享
本地的圖片好分享绒净,如果是網(wǎng)絡(luò)圖片的鏈接呢见咒,在項(xiàng)目中我直接將url轉(zhuǎn)成bitmap
// 通過(guò)appId得到IWXAPI這個(gè)對(duì)象
IWXAPI wxapi = WXAPIFactory.createWXAPI(context, appId);
// 檢查手機(jī)或者模擬器是否安裝了微信
if (!wxapi.isWXAppInstalled()) {
ToastUtil.ToastUtil(context, "您還沒(méi)有安裝微信");
return;
}
Bitmap bmp = getBitMBitmap(imagePath); //URL轉(zhuǎn)Bitmap
//初始化 WXImageObject 和 WXMediaMessage 對(duì)象
WXImageObject imgObj = new WXImageObject(bmp);
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = imgObj;
//構(gòu)造一個(gè)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;//朋友圈
}
// 向微信發(fā)送請(qǐng)求
wxapi.sendReq(req);
/**
* 通過(guò)圖片url生成Bitmap對(duì)象
*
* @param urlpath
* @return Bitmap
* 根據(jù)圖片url獲取圖片對(duì)象
*/
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有個(gè)方法可以直接異步獲取網(wǎng)絡(luò)圖片的位圖
Glide.with(this).asBitmap().load("圖片url").into(new SimpleTarget<Bitmap>() {
/**
* 成功的回調(diào)
*/
@Override
public void onResourceReady(Bitmap bitmap, Transition<? super Bitmap> transition) {
// 下面這句代碼是一個(gè)過(guò)度dialog,因?yàn)槭谦@取網(wǎng)絡(luò)圖片挂疆,需要等待時(shí)間
mDialog.dismiss();
// 調(diào)用方法微信方法改览,傳入bitmap
}
/**
* 失敗的回調(diào)
*/
@Override
public void onLoadFailed(@Nullable Drawable errorDrawable) {
super.onLoadFailed(errorDrawable);
mDialog.dismiss();
}
});
最后
在app模塊包的根目錄下新建一個(gè)wxapi的包,在這個(gè)包下面新建一個(gè)WXEntryActivity缤言,這兩步缺一不可宝当,而且名字也要一模一樣,不要問(wèn)我為什么胆萧,微信規(guī)定的今妄。
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);
}
/**
* 微信發(fā)送請(qǐng)求到第三方應(yīng)用時(shí),會(huì)回調(diào)到該方法
*/
@Override
public void onReq(BaseReq baseReq) {
// 這里不作深究
}
/**
* 第三方應(yīng)用發(fā)送到微信的請(qǐng)求處理后的響應(yīng)結(jié)果鸳碧,會(huì)回調(diào)到該方法
* app發(fā)送消息給微信,處理返回消息的回調(diào)
*/
@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:
// 只是做了簡(jiǎn)單的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:
// 錯(cuò)誤返回
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;
}
}
}
這樣還沒(méi)完瞻离,最后需要在manifests文件中申明這個(gè)Activity
<activity
// 下面三行代碼必須要有
android:name=".wxapi.WXEntryActivity"
android:exported="true"
android:launchMode="singleTop"
// 下面兩行代碼可有可無(wú)
android:screenOrientation="portrait"
// 指定一個(gè)主題,這里是無(wú)標(biāo)題乒裆、半透明的主題
android:theme="@style/NoTitleTranslucent80Theme"/>
至此套利,一個(gè)完整的微信分享功能就實(shí)現(xiàn)了。
Last :分享的圖片大小不能大于32KB,最好壓縮一下圖片鹤耍。