本身公司的項目,圖片展示居多猪叙,服務(wù)器壓力也比較大澳叉,所以使用webp格式圖片也就提上了日程。webp省流量省空間沐悦,不過你要來找到現(xiàn)在這篇關(guān)于友盟分享失敗的文章的話成洗,相信webp格式圖片也已經(jīng)有過了解,就不再多說藏否。
google在4.0后已經(jīng)支持了(4.0-4.2.1不支持無損以及透明度webp圖片)webp格式 瓶殃,所以其實需要做轉(zhuǎn)換的地方其實很少。但是有一些第三方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();
由于不是講分享的,所以上面值列出簡單的實現(xiàn)部分代碼淆储。
然后可以看一下具體UMImage的方法冠场,雖然已經(jīng)混淆,但是大概可以看出來UMImage支持分享的參數(shù)類型:(a 方法就是混淆后的 UMImage構(gòu)造方法)
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(網(wǎng)絡(luò)地址,進(jìn)方法查看就是下載編譯后進(jìn)行設(shè)置点额,不再展開來說了)舔株,資源文件,byte[]还棱,其他種類會走最后的else方法载慈,但是不是bitmap的話就會拋異常,提示不支持的分享類型珍手。所以在我們傳遞一個webp的地址或者webp格式圖片的時候就會報錯办铡。
所以如果想要繼續(xù)使用那就只有轉(zhuǎn)換webp格式圖片后使用辞做。所以當(dāng)有了圖片地址后,很容易想到的就是下載然后轉(zhuǎn)換為bitmap/file等類型寡具。所以我去找了很多webp格式轉(zhuǎn)換的方式凭豪,但是都要引入jar包之類的,增加安裝包體積不說晒杈,使用還挺麻煩。但是安卓又已經(jīng)列出來是支持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稼钩,那么有沒有g(shù)lide自帶方法來完成這次操作的呢顾稀?
其實我們要做的,就是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下載文件抚笔,使用上面提到的文件方式設(shè)置。
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再進(jìn)行設(shè)置給友盟
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也可能不會出錯(實際上會偶爾失敗)矫夯,但是還是強烈建議寫在子線程中鸽疾。
最后,敬業(yè)福哪里搞训貌?