集成第三方分享功能在app中基本是标配,集成SDK步骤这里就不讲了,注意微信分享测试需要签名apk才可以成功哦。在集成过程中遇到了一些坑,特别是在微信的文档写得真是坑爹的时候。。所以如现在把分享关键代码分享出来,如下:
/**
* 分享到微信:聊天界面、朋友圈
*
* @param api api注册
* @param pos 类型:微信好友、朋友圈
* @param title 标题
* @param description 描述
* @param img 图片地址
* @param url 链接地址
*/
public void share_to_wx(final IWXAPI api, final int pos, final String title, final String description, final String img, final String url) {
if (!api.isWXAppInstalled()) {
ToastUtil.showToast("微信未安装,请先安装微信APP");
remove_share();
return;
}
// 线程必须开,不然界面卡死无法调起微信
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
LogUtils.i(TAG, "weichart pos:" + pos + "title:" + title + "description:" + description);
Bitmap bitmap = null;
try {
// 压缩图像
bitmap = ImageUtil.zoomBitmap(BitmapFactory.decodeStream(new URL(img).openStream()), 80, 80);
} catch (Exception e) {
e.printStackTrace();
}
if (bitmap == null) {
bitmap = BitmapFactory.decodeResource(BaseApplication.getAppContext().getResources(), R.mipmap.ic_launcher);
}
WXWebpageObject webpage = new WXWebpageObject();
webpage.webpageUrl = url;
WXMediaMessage msg = new WXMediaMessage(webpage);
msg.title = title;
msg.description = description;
msg.thumbData = bmpToByteArray(bitmap, true);// 设置缩略图
if (bitmap != null) {
bitmap.recycle();// 释放图像所占用的图片内存资源
}
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("webpage");
req.message = msg;
req.scene = pos;
api.sendReq(req);
}
});
thread.start();
}
/***
* 分享到qq空间
*
* @param title
* @param description
* @param img
* @param url
*/
public void share_to_qzone(String title, String description, String img, String url) {
Bundle params = new Bundle();
params.putInt(QzoneShare.SHARE_TO_QZONE_KEY_TYPE, QzoneShare.SHARE_TO_QZONE_TYPE_IMAGE_TEXT);
params.putString(QzoneShare.SHARE_TO_QQ_TITLE, "" + title);
params.putString(QQShare.SHARE_TO_QQ_SUMMARY, "" + description);
params.putString(QQShare.SHARE_TO_QQ_TARGET_URL, url);
ArrayList<String> list = new ArrayList<>(); //多图片支持
list.add(img);
params.putStringArrayList(QQShare.SHARE_TO_QQ_IMAGE_URL, list);
params.putString(QQShare.SHARE_TO_QQ_APP_NAME, "蜜藕");
mTencent.shareToQzone(ShareUtil.this, params, mListener);
}
/***
* 分享到qq
*
* @param title
* @param description
* @param img
* @param url
*/
public void share_to_qq(String title, String description, String img, String url) {
Bundle params = new Bundle();
params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT);
params.putString(QQShare.SHARE_TO_QQ_TITLE, "" + title);
params.putString(QQShare.SHARE_TO_QQ_SUMMARY, "" + description);
params.putString(QQShare.SHARE_TO_QQ_TARGET_URL, url);
params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, img);
params.putString(QQShare.SHARE_TO_QQ_APP_NAME, "蜜藕");
mTencent.shareToQQ(ShareUtil.this, params, mListener);
}
/**
* 分享到微博
*
* @param title
* @param description
* @param img
* @param url
* @return
*/
public SendMultiMessageToWeiboRequest share_to_weibo(String title, String description, String img, String url) {
// 2. 初始化从第三方到微博的消息请求
SendMultiMessageToWeiboRequest request = new SendMultiMessageToWeiboRequest();
try {
WeiboMultiMessage weiboMultiMessage = new WeiboMultiMessage();
//文字
TextObject textObject = new TextObject();
textObject.text = title + url;
//图片
ImageObject imageObject = new ImageObject();
//设置缩略图。 注意:最终压缩过的缩略图大小不得超过 32kb。
Bitmap bitmap = null;
try {
// 压缩图像
bitmap = ImageUtil.zoomBitmap(BitmapFactory.decodeStream(new URL(img).openStream()), 120, 120);
} catch (Exception e) {
e.printStackTrace();
}
if (bitmap == null) {
bitmap = BitmapFactory.decodeResource(BaseApplication.getAppContext().getResources(), R.mipmap.ic_launcher);
}
imageObject.setImageObject(bitmap);
weiboMultiMessage.textObject = textObject;
weiboMultiMessage.imageObject = imageObject;
// 用transaction唯一标识一个请求
request.transaction = String.valueOf(System.currentTimeMillis());
request.multiMessage = weiboMultiMessage;
if (mWeiboShareAPI.isWeiboAppInstalled()) {
mWeiboShareAPI.sendRequest(ShareUtil.this, request);
} else {
AuthInfo authInfo = new AuthInfo(this, Constant.SINAAPPID, Constant.SINA_REDIRECT_URL, "all");
Oauth2AccessToken accessToken = AccessTokenKeeper.readAccessToken(getApplicationContext());
String token = "";
if (accessToken != null) {
token = accessToken.getToken();
}
mWeiboShareAPI.sendRequest(this, request, authInfo, token, new WeiboAuthListener() {
@Override
public void onWeiboException(WeiboException arg0) {
ToastUtil.showToast("认证失败!");
remove_share();
}
@Override
public void onComplete(Bundle bundle) {
Oauth2AccessToken newToken = Oauth2AccessToken.parseAccessToken(bundle);
AccessTokenKeeper.writeAccessToken(getApplicationContext(), newToken);
ToastUtil.showToast("认证成功!");
remove_share();
}
@Override
public void onCancel() {
ToastUtil.showToast("认证取消!");
remove_share();
}
}
);
}
} catch (Exception e) {
e.printStackTrace();
}
return request;
}
分享这种功能在应用中最好原子化,因为肯定不是一个地方需要这个功能,所以最好是封装在这个基础上封装一下。分享数据来源可以从后台或者本地获取都可以,根据需求,有分享问题请留言,谢谢