微信分享 Android 11

发布时间:2024年01月24日

需求 微信分享图片:

消息参数?thumbData?传入图片转成二进制

  • 等比压缩图片到指定大小,目的压缩图片大小保持图片可以看清,同时保证不变形;
  • 降低图片质量直到图片大小达到32KB;

代码简单可以参考:Android图片分享问题采坑总结_android 微信分享图片-CSDN博客

thumbData 如果发到微信的图不清晰,图片尺寸设置的不要太小,可以质量压缩的低点
例如使用Glide来压缩

val options = RequestOptions()
    .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
    .encodeFormat(Bitmap.CompressFormat.JPEG)
    .encodeQuality(50)
Glide.with(context)
    .asBitmap()
    .load(url).apply(
        options
    )
    .fitCenter()
    .override(width, height)
    .into(target)

然后微信的api再做一次压缩

Bitmap bitmap = shareBean.shareBitmap;
WXImageObject imgObj = new WXImageObject(bitmap);
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = imgObj;
msg.setThumbImage(bitmap);
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("img");
req.message = msg;

当然这些只是缩略图配置而已。如果要求能传大图。

那么需要用到?imageObject.setImagePath(——); 来处理25M以内的图片

Bitmap bitmap = shareBean.shareBitmap;
WXImageObject imageObject = new WXImageObject();
imageObject.setImagePath(str);
WXMediaMessage msg = new WXMediaMessage(imageObject);
// 设置缩略图
Bitmap thumbBmp = Bitmap.createScaledBitmap(bitmap, 135, 240, true);
bitmap.recycle();
msg.thumbData = ImageUtils.compressBitmap(activity, thumbBmp, 100, true);
//构建一个Req
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("img");
req.message = msg;

str 是 文件路径 要配置 微信要求的file的格式? shareData? 并且Uri 带上?fileprovider?

要与`AndroidManifest.xml`里配置的`authorities`一致

获得str的实例代码:

public static String getFileUri(Context context, File file) {
    if (file == null || !file.exists()) {
        return null;
    }

    Uri contentUri = FileProvider.getUriForFile(context,
            context.getPackageName() + ".fileprovider",  
            file);

    // 授权给微信访问路径
    context.grantUriPermission("com.tencent.mm",  // 这里填微信包名
            contentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);

    return contentUri.toString();  
}
public static void getShareDataFilePath(@NonNull final Context context, @NonNull final Bitmap bitmap, WxCallBack callback) {
    TaskManager.Companion.ioTask(continuation -> {
        BufferedOutputStream outputStream = null;
        try {
            String fileName = "img_" + System.currentTimeMillis() + ".jpg";
            final File screenshotsDir = new File(context.getExternalFilesDir(null), "shareData");

            if (!screenshotsDir.exists()) { //如果该文件夹不存在,则进行创建
                screenshotsDir.mkdirs();//创建文件夹
            }else {
                for (File file : screenshotsDir.listFiles()) {
                    if (file.isFile()){
                        file.delete(); // 删除所有文件
                    }
                }
            }
            File screenshotFile = new File(screenshotsDir, fileName);
            outputStream = new BufferedOutputStream(new FileOutputStream(screenshotFile));
            bitmap.compress(Bitmap.CompressFormat.JPEG, 90, outputStream);
            outputStream.flush();
            callback.onResult(getFileUri(context,screenshotFile));
        } catch (final IOException e) {
            e.printStackTrace();
        } finally {
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (final IOException ignored) {
                    ignored.printStackTrace();
                }
            }

        }
        return null;
    });
}

ImageUtils.compressBitmap 构建缩略图 是bitmap转成字节而已,网上很多例子,转换的时候进行压缩

注意:

imageObject.setImagePath(str);这个方法只能在Android11以后使用,所以Android11之前还是只能用缩略图传图片

代码可以参考:https://www.jianshu.com/p/05c83a83d876

文章来源:https://blog.csdn.net/whs867712232/article/details/135829599
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。