webp图片格式转换,以及安卓使用webp图片导致的友盟分享失败(友盟6.X SDK)的坑

本身公司的项目,图片展示居多,服务器压力也比较大,所以使用webp格式图片也就提上了日程。webp省流量省空间,不过你要来找到现在这篇关于友盟分享失败的文章的话,相信webp格式图片也已经有过了解,就不再多说。
google在4.0后已经支持了(4.0-4.2.1不支持无损以及透明度webp图片)webp格式 ,所以其实需要做转换的地方其实很少。但是有一些第三方SDK对webp支持的不是很好,所以有了本文。
友盟分享实用的是自定义的 UMImage

 UMImage umImage= new UMImage(mActivity, myBitmap);
//具体的分享方法
new ShareAction(mActivity)
   .withTitle(title)
   .withText(text)
   .withTargetUrl(targetUrl)
   .withMedia(umImage)
   .setPlatform(shareMedia)
   .setCallback(umShareListener)
   .share();

由于不是讲分享的,所以上面值列出简单的实现部分代码。
然后可以看一下具体UMImage的方法,虽然已经混淆,但是大概可以看出来UMImage支持分享的参数类型:(a 方法就是混淆后的 UMImage构造方法)

  private void a(Context var1, Object var2) {
        if(var2 instanceof File) {
            this.e = new UMImage.FileConvertor((File)var2);
        } else if(var2 instanceof String) {
            this.e = new UMImage.UrlConvertor((String)var2);
        } else if(var2 instanceof Integer) {
            this.e = new UMImage.ResConvertor(var1, ((Integer)var2).intValue());
        } else if(var2 instanceof byte[]) {
            this.e = new UMImage.BinaryConvertor((byte[])((byte[])var2));
        } else {
            if(!(var2 instanceof Bitmap)) {
                throw new RuntimeException("Don\'t support type");
            }
            this.e = new UMImage.BitmapConvertor((Bitmap)var2);
        }
        this.e.setConfig(new UMImage.ConvertConfig(var1));
    }

可以看到支持的种类是,文件,uri(网络地址,进方法查看就是下载编译后进行设置,不再展开来说了),资源文件,byte[],其他种类会走最后的else方法,但是不是bitmap的话就会抛异常,提示不支持的分享类型。所以在我们传递一个webp的地址或者webp格式图片的时候就会报错。
所以如果想要继续使用那就只有转换webp格式图片后使用。所以当有了图片地址后,很容易想到的就是下载然后转换为bitmap/file等类型。所以我去找了很多webp格式转换的方式,但是都要引入jar包之类的,增加安装包体积不说,使用还挺麻烦。但是安卓又已经列出来是支持webp的。
后来找到一个简单的方式。就一句话

Bitmap bmp = BitmapFactory.decodeFile(webp);

bitmap工厂,是可以直接decode webp图片为bitmap的,就跟你放入一个jpg的图片一样使用。
所以第一种方式

File file=down(url);//项目的下载文件的方法,可能每个人封装的不同,我就简单描述下

 new Thread(){
            @Override
            public void run() {
                Bitmap bmp = BitmapFactory.decodeFile(flie);
                image = new UMImage(mActivity, bmp);
            }
        }.start();

用这个写完之后感觉会很麻烦,还要考虑4.0之前的用户(虽然并不会有4.0前的用户了),毕竟是图片下载嘛,还要考虑图片缓存啥等乱七八糟的,不然每次一个页面每启动一次分享都要下载一张图片也是挺傻的事儿。所以想到了项目中使用的Glide,那么有没有glide自带方法来完成这次操作的呢?
其实我们要做的,就是1 下载 2 decode为byte[]/bitmap 所以只要glide满足下载操作或者编译操作就可以了
参考Glide downloadonly
需要注意的是,后面一个方法

Bitmap myBitmap = Glide.with(applicationContext)
    .load(yourUrl)
    .asBitmap()
    .centerCrop()
    .into(500, 500)
    .get()

写的比较清楚的是,Although[into(int, int)]works well on background threads, note that you must not use it on the main thread. Even if the synchronous version of into did not throw an exception when used on the main thread, calling get() would block the main thread, reducing the performance and responsiveness of your app.简单说就是要写在子线程中。
所以方法2,Glide下载文件,使用上面提到的文件方式设置。

final FutureTarget<File> future = Glide.with(mActivity)
        .load(picUrl)
        .downloadOnly(500, 500);
    new Thread(){
        @Override
        public void run() {
            File cacheFile = null;
            try {
                cacheFile = future.get();
                umImage = new UMImage(mActivity, cacheFile);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
    }.start();

方式3,使用Glide下载并decode图片为bitmap再进行设置给友盟

new Thread(){
    @Override
    public void run() {
        try {
            Bitmap myBitmap = Glide.with(myActivity)
                    .load(picUrl)
                    .asBitmap()
                    .centerCrop()
                    .into(500, 500)
                    .get();
            umImage= new UMImage(mActivity, myBitmap);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}.start();

除此之外,需要注意的点还有,方式一,BitmapFactory.decode是一个比较耗时的操作,虽然可能写在MainThread也可能不会出错(实际上会偶尔失败),但是还是强烈建议写在子线程中。

最后,敬业福哪里搞?

Paste_Image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 227,748评论 6 531
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,165评论 3 414
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 175,595评论 0 373
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,633评论 1 309
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,435评论 6 405
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 54,943评论 1 321
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,035评论 3 440
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,175评论 0 287
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,713评论 1 333
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,599评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,788评论 1 369
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,303评论 5 358
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,034评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,412评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,664评论 1 280
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,408评论 3 390
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,747评论 2 370

推荐阅读更多精彩内容