微信分享也是一项很常用的功能了,以往都是用友盟或者mobShareSDK框架来实现的,这两者在微信官方的sdk基础上封装的很好,并且加入了一些很实用性的功能,不过这次因为只有微信平台的分享,而且微信登录也是基于微信官方的原生SDK的,所以我们就不用再去大费周章地使用友盟和mobsharesdk了,而且也可以学习些新的东西,经过一番折腾调试,成功地把分享集成成功了,期间也遇到了一些坑,而且微信官方的文档确实不太友好,因此这里对其进行下总结归纳。

有关微信原生登录的请看我另一篇博文

https://blog.csdn.net/u014078990/article/details/83752223

还是效果图走起来:

怎么样,不错吧,下来详述实现流程。

1.首先当然是去微信开放平台申请应用的appid和appkey了,这里我不再详述了。

2.新建wxapi包和WXEntryActivity及相关继承重写我在发布的《Android开发丶集成微信原生登录》这篇博文里已经有了说明,不再复述。

3.首先打开WXEntryActivity写微信分享的回调

这里比较重要的一点是(敲黑板!!!)

微信分享和微信登录的回调都走的onResp()方法,所以我们要加以辨别,否则会混淆一团,好在官方已经返回了相应的type值供我们判断

//请求回调结果处理
@Override
public void onResp(BaseResp baseResp) {switch (baseResp.errCode) {case BaseResp.ErrCode.ERR_OK:switch (baseResp.getType()){case ConstantsAPI.COMMAND_SENDAUTH:String code = ((SendAuth.Resp) baseResp).code;getAccessToken(code);Log.d("fantasychongwxlogin", code.toString()+ "");break;case ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX:Log.d("Fan22", "分享成功");Toast.makeText(getApplicationContext(), "分享成功", Toast.LENGTH_SHORT).show();finish();break;default:break;}break;case BaseResp.ErrCode.ERR_AUTH_DENIED://用户拒绝授权finish();break;case BaseResp.ErrCode.ERR_USER_CANCEL://用户取消finish();break;default:finish();break;}
}

4.回到启动分享的入口

这里以最常见的分享web网页为例

首先肯定是判断设备是否安装微信了

if (!api.isWXAppInstalled()) {Toast.makeText(WebViewActivity.this, "您的设备未安装微信客户端", Toast.LENGTH_SHORT).show();
}

当检测到有安装微信客户端,开始后续的方法。

当分享网页时,一般会由这三种控件构成,标题,描述,缩略图

那么问题来了,标题和描述官方都给了相应的参数设置,没什么问题,但是缩略图官方仅支持加载本地的bitmap

如果我们实际需求中是个图片url怎么办?

办法当然是有的,考虑后我们决定把这个网络图片下载到本地保存成bitmap不就可以了。(我太特么机智了)

5.这里就涉及到下载图片了,该方法调用时要放在子线程中,之后再通过runOnUiThread()方法操作UI线程即可,相关代码附上

/*** 把网络资源图片转化成bitmap* @param url 网络资源图片* @return Bitmap*/
public static Bitmap GetLocalOrNetBitmap(String url) {Bitmap bitmap = null;InputStream in = null;BufferedOutputStream out = null;try {in = new BufferedInputStream(new URL(url).openStream(), 1024);final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();out = new BufferedOutputStream(dataStream, 1024);copy(in, out);out.flush();byte[] data = dataStream.toByteArray();bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);data = null;return bitmap;} catch (IOException e) {e.printStackTrace();return null;}
}
private static void copy(InputStream in, OutputStream out)throws IOException {byte[] b = new byte[1024];int read;while ((read = in.read(b)) != -1) {out.write(b, 0, read);}
}private String buildTransaction(final String type) {return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
}

6.我们先检测下该网络图片是否保存成本地bitmap了,先用个imageview检测下

iv.setImageBitmap(bitmap);

有了,有了,红框的就是!

7.接下来设置相关分享参数

那么问题又来了,如果因为网络或者某些不可描述的问题导致图片没下下来咋整?

完全不慌,检测是否为空,如果空的话,加载本地的就可以了。

if (bitmap== null){bitmap= BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher_round);
}

接下来设置标题,网页等参数

WXWebpageObject webpage = new WXWebpageObject();
webpage.webpageUrl = "http://www.baidu.com";
WXMediaMessage msg = new WXMediaMessage(webpage);
msg.title = "这是网页标题";
msg.description = "这是网页描述";

将bitmap进行裁剪,赋值

thumbBmp = Bitmap.createScaledBitmap(bitmap, 150, 150, true);
if (bitmap != null && !bitmap.isRecycled()) {bitmap = null;
}
msg.thumbData = Util.getBitmapBytes(thumbBmp, true);
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("webpage");
req.message = msg;
//根据type设置分享情景
switch (type) {case TYPE_WECHAT://分享到微信好友req.scene = SendMessageToWX.Req.WXSceneSession;break;case TYPE_WECHAT_MOMENT://分享到微信朋友圈req.scene = SendMessageToWX.Req.WXSceneTimeline;break;
}
api.sendReq(req);

以上代码中,req.scene是设置分享对象的,决定微信好友还是朋友圈,因此我们可以通过在不同的入口传递不同的参数进行判断,决定分享的对象。

showShare(TYPE_WECHAT);
showShare(TYPE_WECHAT_MOMENT);

这里说明一下遇到的一些现象和问题:

1.如果不配置APPID和APPSECRET,微信客户端无法调起

private static final String APP_ID = "";//空值

解决办法:在申请到正式的APPID,可以先使用其余通过审核的应用的APPID值,新建一个测试项目与那个通过审核的应用的包名一致,签名文件一致,保证微信能正常调起以及流程正常跑通,之后把相关代码移植到正式项目中,最后在正式项目中更换正式APPID即可。

2.当微信未登陆时,点击分享可以调起客户端到登陆界面,登陆完成后一闪而过回到应用界面,无法分享到好友或者朋友圈。

解决办法:当前的配置的APPID值与包名不匹配。更换正式APPID值即可。

3.下载bitmap的方法GetLocalOrNetBitmap()必须在子线程中运行。

至此全部完成,demo附上!(因为某些不可描述的原因,本DEMO没有APPID和APPSECRET值,无法调起微信客户端,主要看流程即可)

资源下载

Android开发丶集成微信原生分享并于分享网页时加载网络缩略图相关推荐

  1. Android开发丶集成微信原生登录

    好久没写博客了,大概是与ReactNative大战半月已经有点疲惫了,说起集成微信三方登录,还记得上次实现功能还是刚参加工作时,用Mob的ShareSDK来集成实现的,该平台集成了数个主流平台的分享和 ...

  2. Android开发支付集成——微信集成

    支付宝支付传送门:https://www.cnblogs.com/dingxiansen/p/9208949.html 二.微信支付 1. 微信支付流程图 相比较而言,微信支付是要比支付宝麻烦一些,并 ...

  3. ShareSDK集成微信、QQ、微博分享

    1.前言 为什么要使用第三方的作为集成分享的工具呢?而不去用官方的呢?有什么区别么? 一个字"快",如果你使用官方的得一个个集成他们的SDK,相信这是一个痛苦的过程. 2.准备需要 ...

  4. android微信风格,Android开发实现模仿微信小窗口功能【Dialog对话框风格窗口】

    本文实例讲述了Android开发实现模仿微信小窗口功能.分享给大家供大家参考,具体如下: 运用方法: 将显示窗口的风格 设置为对话框风格即可 具体效果: 具体实现: 首先我们先定义布局文件: andr ...

  5. 2019 年美团点评高级 Android 开发寒冬跳槽涨薪经验掏心分享

    2019 年美团点评高级 Android 开发寒冬跳槽涨薪经验掏心分享 目录 个人简介 笔者的简要介绍 跳槽涨薪要考虑的方面有哪些? 你是正在拿着卖白菜的钱,操着卖白粉的心吗? 你真得觉得是时候跑路了 ...

  6. android仿微信图片上传进度,Android开发之模仿微信打开网页的进度条效果(高仿)...

    一,为什么说是真正的高仿? 阐述这个问题前,先说下之前网上的,各位可以复制这段字,去百度一下  "仿微信打开网页的进度条效果",你会看到有很多类似的文章,不过他们有个共同点,就是实 ...

  7. android仿微信 进度条,Android开发之模仿微信打开网页的进度条效果(高仿)

    一,为什么说是真正的高仿? 阐述这个问题前,先说下之前网上的,各位可以复制这段字,去百度一下  "仿微信打开网页的进度条效果" ,你会看到有很多类似的文章,不过他们有个共同点,就是 ...

  8. 【FastDev4Android框架开发】RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)...

    转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/49992269 本文出自:[江清清的博客] (一).前言: [好消息] ...

  9. 微信小程序开发之scroll-view上拉加载数据实现

    微信小程序开发之scroll-view上拉加载数据实现 一.开发思路 1.使用小程序的scroll-view组件中提供了一个bindscrolltolower属性监听组件的滑动到了底部 https:/ ...

最新文章

  1. 浅谈Service Mesh体系中的Envoy
  2. 【Pytorch学习】用pytorch搭建第一个神经网络
  3. Python中的函数递归
  4. 完课率最高 | 带学吴恩达《机器学习》课程和作业,带打Kaggle全球顶级大赛!...
  5. 你有一个向LiveVideoStackCon讲师提问的机会
  6. android UI
  7. ubuntu中将git 提交编译器nano 修改为vim
  8. cpu上干硅脂怎么清理_笔记本电脑散热硅脂的正确涂法
  9. 浅析Hibernate映射(五)——集合映射
  10. Android API中文文档(111) —— MailTo
  11. java inputstream长度_Java InputStream.available获取数据流字节长度大小
  12. 旁枝末梢(我好像稍微理解了mvc和mvvm)
  13. Linux安装nginx做端口映射
  14. su的2019面试准备
  15. 【Python基础教程】while循环用法详解
  16. win7 显示快捷方式扩展名 lnk
  17. jquery 蔚蓝网
  18. 百度翻译api和SpringBoot集成
  19. Echodyne为其行业领先的CUAS雷达EchoGuard拓展市场
  20. 区分H5调用手机相机与相册

热门文章

  1. H5手机端JS常用屏幕宽度和高度获取方法
  2. win7系统安装office 2010 visio 出现MSXML安装后依旧无法安装的解决办法
  3. esp8266实现coap协议。
  4. 在IOS上YUV NV21格式的CVPixelBufferRef转opencv的RGB格式cv::Mat的方法
  5. 浅谈三级管(PNP和NPN)导通基极(B)电位情况
  6. python将多个excel合并或拆分
  7. java导出的文件名带正斜杠_如何在名称中创建带正斜杠的注册表项
  8. ubuntu armv7l安装docker-comose
  9. TEC控温模块电路分析
  10. MapGIS IGServer开发平台学习版安装文档