微信图片分享支持url,缩略图支持url |
您所在的位置:网站首页 › 安卓怎么配置环境 › 微信图片分享支持url,缩略图支持url |
微信图片分享支持url,缩略图支持url
在集成微信分享的过程中,如果缩略图是url形式,或者大图分享的图片是个url,就需要我们先把图片下载下来,然后依据微信的要求对图片做一些压缩操作,最后将图片的数据设置给要分享的对象即可。 我们一般需要支持的分享类型主要有文字类型(WXTextObject)、图片类型(WXImageObject)和网页类型(WXWebpageObject),具体请看分享与收藏功能-Android开发手册。 缩略图支持url拿我们常见的网页分享举例,msg.thumbData对应的就是缩略图对象,具体代码如下: //初始化一个WXWebpageObject,填写url WXWebpageObject webpage = new WXWebpageObject(); webpage.webpageUrl ="网页url"; //用 WXWebpageObject 对象初始化一个 WXMediaMessage 对象 WXMediaMessage msg = new WXMediaMessage(webpage); msg.title ="网页标题 "; msg.description ="网页描述"; Bitmap thumbBmp = BitmapFactory.decodeResource(getResources(), R.drawable.send_music_thumb); msg.thumbData =Util.bmpToByteArray(thumbBmp, true); //构造一个Req SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = buildTransaction("webpage"); req.message =msg; req.scene =mTargetScene; req.userOpenId = getOpenId(); //调用api接口,发送数据到微信 api.sendReq(req);示意图如下: 我们看下thumbData的定义,如下图所示: thumbData的类型是字节数组byte[],并且大小不超过32kb。 一般情况下,thumbData设置的是应用内置的icon,通过BitmapFactory.decodeResource即可获取到对应的Bitmap对象,接着对bitmap进行压缩,最后将Bitmap的对应的字节数组设置给thumbData即可。 如果thumbData的数据来源是url,则我们需要先下载图片,再进行后续的操作。经过研究,我们可以通过glide提供的api来下载图片url对应的字节数组,接着将字节数组压缩到32k以内,最后将压缩后的字节数组设置给thumbData即可。 1、下载图片url对应的字节数组 byte[] bytes = Glide.with(context) .load(url) .asBitmap() .toBytes() .into(150, 150) .get(); 2、将字节数组压缩到32kb以内 /** * 将Bitmap的字节流压缩为目标大小 * * @param src * @param targetSize 单位B * @return */ private static byte[] compressBitmapBytes2TargetSize(byte[] src, int targetSize) { // 将字节数据转换成临时bitmap对象,为压缩做准备 Bitmap bmp = BitmapFactory.decodeByteArray(src, 0, src.length); byte[] result = getBytesFromCompressBitmap(bmp, targetSize); // 回收不用的Bitmap if (!bmp.isRecycled()) { bmp.recycle(); } return result; } /** * 压缩bitmap的字节数据,quality每次减少5 * @param bitmap * @param targetSize * @return */ private static byte[] getBytesFromCompressBitmap(Bitmap bitmap, int targetSize) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 默认quality为100,quality取值范围[0, 100] int quality = 100; bitmap.compress(Bitmap.CompressFormat.PNG, quality, baos); byte[] bytes = baos.toByteArray(); while (bytes.length > targetSize && quality >= 5) { quality -= 5; if (quality < 0) { quality = 0; } // 重置,不然会累加 baos.reset(); // 将数据写入ByteArrayOutputStream对象中 bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos); // 将流转换成字节数组 bytes = baos.toByteArray(); } // 关闭流 try { baos.close(); } catch (Exception e) { e.printStackTrace(); } return bytes; }具体调用: // 略缩图byte[]小于32k msg.thumbData = compressBitmapBytes2TargetSize(bytes, 32 * 1024); 3、异步处理下载过程由于下载url的字节数据这个操作是io操作,所以我们需要放到子线程中来完成,下载完成后再在主线程中进行处理即可。完整版代码如下: Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(ObservableEmitter emitter) throws Exception { try { byte[] bytes = Glide.with(context) .load(url) .asBitmap() .toBytes() .into(150, 150) .get(); emitter.onNext(bytes); emitter.onComplete(); } catch (Exception e) { e.printStackTrace(); emitter.onError(new Throwable("下载略缩图失败")); } } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(byte[] bytes) { if (bytes != null) { // 略缩图byte[]小于32k msg.thumbData = compressBitmapBytes2TargetSize(bytes, 32 * 1024); } else { // 设置默认的缩略图,这里一般使用应用logo } // 发送分享请求 } @Override public void onError(Throwable e) { // 设置默认的缩略图,这里一般使用应用logo // 发送分享请求 } @Override public void onComplete() { } });这里使用了RxJava做的切换线程的操作。当然了,这里的压缩bitmap数据也属于io操作,也应该放在子线程中完成,这个细节有待完善。 大图分享支持url与缩略图的处理方式不同,缩略图我们是知道最终要显示的大小的(150,来自微信官方demo),所以我们直接通过下载byte[]进行后续即可。而我们这里要分享的大图的大小和宽高等信息都是未知的,在下载完成之前我们无法通过url获取更多信息,所以我们还是需要先将图片下载下来。 由于下载byte[]的api必须指定宽高,所以我们换另一个不需要指定宽高的api,直接下载bitmap对象,具体代码如下: Glide.with(mContext) .load(url) .asBitmap() .into(new SimpleTarget() { @Override public void onResourceReady(Bitmap resource, GlideAnimation |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |