原因
钉钉对本地图片的大小有限制,最大500KB,超过以后就会失败。
分享本地图片到其他平台,要放置在公共目录下。否则在高版本的android系统中也会失败。
代码
ImageUtil
package com.trs.nmip.common.ui.base.web.option.wendu;
import static android.os.Environment.DIRECTORY_PICTURES;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Environment;
import com.blankj.utilcode.util.ToastUtils;
import com.trs.news.ui.TRSApp;
import com.trs.nmip.common.util.FileUtil;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.UUID;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
/**
* <pre>
* Created by zhuguohui
* Date: 2023/4/26
* Time: 11:04
* Desc:
* </pre>
*/
public class ImageUtil {
public static void download(Context context, Bitmap bitmap) {
Disposable disposable = io.reactivex.Observable.create(new ObservableOnSubscribe<File>() {
@Override
public void subscribe(ObservableEmitter<File> emitter) throws Exception {
String path = saveImageGetPath(bitmap);
String filePath = copyFileToDownloadDirectory(path);
emitter.onNext(new File(filePath));
}
}).subscribeOn(Schedulers.io())
.subscribe(saveFile -> {
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(saveFile)));
ToastUtils.showLong("保存成功 保存在[" + saveFile.getAbsolutePath() + "]");
}, e -> {
e.printStackTrace();
ToastUtils.showLong("保存失败[" + e.getMessage() + "]");
});
}
public static String copyFileToDownloadDirectory(String filePath){
File file = new File(filePath);
String fileName = file.getName();
String path = Environment.getExternalStoragePublicDirectory(DIRECTORY_PICTURES).getPath();
File saveFile = new File(path + "/" + fileName);
FileUtil.copy(file, saveFile);
return saveFile.getPath();
}
public static String saveImageGetPath(Bitmap bmp){
return saveImageGetPath(bmp,100);
}
/**
*
* @param bmp
* @param quality 压缩率 0-100 100表示不压缩
* @return
*/
public static String saveImageGetPath(Bitmap bmp,int quality) {
File f = new File(TRSApp.app().getCacheDir() + "/" + System.currentTimeMillis() + "_" + UUID.randomUUID().toString() + ".png");
if (f.exists()) {
return f.getPath();
}
try {
f.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
FileOutputStream fOut = null;
try {
fOut = new FileOutputStream(f);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
bmp.compress(Bitmap.CompressFormat.JPEG, quality, fOut);
try {
fOut.flush();
} catch (IOException e) {
e.printStackTrace();
}
try {
fOut.close();
} catch (IOException e) {
e.printStackTrace();
}
return f.getPath();
}
}
示例代码
String platformName = getPlatformName(cardShareTo.getShareTarget());
boolean isDingDing= Dingding.NAME.equals(platformName);
//因为钉钉分享图片,超过500KB就会失败,所以将压缩率设置为50
String path = saveImageGetPath(bitmap,isDingDing?50:100);
//图片必须放在公共目录才能被分享
path= ImageUtil.copyFileToDownloadDirectory(path);
WebShareInfo webShareInfo=new CardWebShareInfo();
webShareInfo.setLink(webViewModel.getShareInfo().getLink());
webShareInfo.setImagePath(path);
//此处为什么调用,webViewModel而不直接使用ShareUtil
//是因为webViewModel中还有关于分享成功以后的回调,比如加积分等
webViewModel.setTempShareInfo(webShareInfo);
webViewModel.share(platformName);