最近的项目中结合到了微信分享的功能,今天就来记录一下我的集成过程以及遇到的“坑”,项目中一开始集成的Mob平台的shareSDk,但是我们的测试人员很厉害发现的一个shareSDk的bug,比如:第一次分享朋友圈(没有分享) --切到后台--再切换回系统--点击微信好友--调出来的是微信朋友圈分享的界面。由于这个bug 咨询了一下Mob平台的客服,客服回答说这个一个正常现象,So,我换成了微信开发平台的微信分享。
1.第一步就是注册登录申请 appId和appSecret。
2.在app下的build.gradle中添加依赖
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
3.开始使用
附上官方平台链接点击进入
图文分享
// 通过appId得到IWXAPI这个对象
IWXAPI wxapi = WXAPIFactory.createWXAPI(context, appId);
// 检查手机或者模拟器是否安装了微信
if (!wxapi.isWXAppInstalled()) {
ToastUtil.makeText("您还没有安装微信");
return;
}
// 初始化一个WXWebpageObject对象
WXWebpageObject webpageObject = new WXWebpageObject();
// 填写网页的url
webpageObject.webpageUrl = webUrl;
// 用WXWebpageObject对象初始化一个WXMediaMessage对象
WXMediaMessage msg = new
WXMediaMessage(webpageObject);
// 填写网页标题、描述、位图
msg.title = title;
msg.description = content;
// 如果没有位图,可以传null,会显示默认的图片
msg.setThumbImage(bitmap);
// 构造一个Req
SendMessageToWX.Req req = new SendMessageToWX.Req();
// transaction用于唯一标识一个请求(可自定义)
req.transaction = "webpage";
// 上文的WXMediaMessage对象
req.message = msg;
// SendMessageToWX.Req.WXSceneSession是分享到好友会话
// SendMessageToWX.Req.WXSceneTimeline是分享到朋友圈
req.scene = SendMessageToWX.Req.WXSceneSession;
// 向微信发送请求
wxapi.sendReq(req);
图片分享
本地的图片好分享,如果是网络图片的链接呢,在项目中我直接将url转成bitmap
// 通过appId得到IWXAPI这个对象
IWXAPI wxapi = WXAPIFactory.createWXAPI(context, appId);
// 检查手机或者模拟器是否安装了微信
if (!wxapi.isWXAppInstalled()) {
ToastUtil.ToastUtil(context, "您还没有安装微信");
return;
}
Bitmap bmp = getBitMBitmap(imagePath); //URL转Bitmap
//初始化 WXImageObject 和 WXMediaMessage 对象
WXImageObject imgObj = new WXImageObject(bmp);
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = imgObj;
//构造一个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;//朋友圈
}
// 向微信发送请求
wxapi.sendReq(req);
/**
* 通过图片url生成Bitmap对象
*
* @param urlpath
* @return Bitmap
* 根据图片url获取图片对象
*/
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有个方法可以直接异步获取网络图片的位图
Glide.with(this).asBitmap().load("图片url").into(new SimpleTarget<Bitmap>() {
/**
* 成功的回调
*/
@Override
public void onResourceReady(Bitmap bitmap, Transition<? super Bitmap> transition) {
// 下面这句代码是一个过度dialog,因为是获取网络图片,需要等待时间
mDialog.dismiss();
// 调用方法微信方法,传入bitmap
}
/**
* 失败的回调
*/
@Override
public void onLoadFailed(@Nullable Drawable errorDrawable) {
super.onLoadFailed(errorDrawable);
mDialog.dismiss();
}
});
最后
在app模块包的根目录下新建一个wxapi的包,在这个包下面新建一个WXEntryActivity,这两步缺一不可,而且名字也要一模一样,不要问我为什么,微信规定的。
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);
}
/**
* 微信发送请求到第三方应用时,会回调到该方法
*/
@Override
public void onReq(BaseReq baseReq) {
// 这里不作深究
}
/**
* 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法
* app发送消息给微信,处理返回消息的回调
*/
@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:
// 只是做了简单的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:
// 错误返回
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;
}
}
}
这样还没完,最后需要在manifests文件中申明这个Activity
<activity
// 下面三行代码必须要有
android:name=".wxapi.WXEntryActivity"
android:exported="true"
android:launchMode="singleTop"
// 下面两行代码可有可无
android:screenOrientation="portrait"
// 指定一个主题,这里是无标题、半透明的主题
android:theme="@style/NoTitleTranslucent80Theme"/>
至此,一个完整的微信分享功能就实现了。
Last :分享的图片大小不能大于32KB,最好压缩一下图片。