今年换完工作后一直比较卷,虽然草稿箱存了几篇,但是还是先选了这篇发出来

我那些关于WebView的回忆 ~ 包含入门使用优化加载样式监听加载状态、各场景后退键处理、俩端交互流程headeruseragent传值、交互常见问题、较全API整合

业务实战

该篇由来:主要是在使用mPass H5容器前端交互时,需要上传图片前端,所以最终采用图片base64编码的方式完成了任务

基础认知

常规在移动端上传图片,主要有以下俩种方式

Androidutil包中提供了android.util.Base64类,该类提供了四个编码方法,分别是

public static byte[] encode(byte[] input, int flags)
public static byte[] encode(byte[] input, int offset, int len, int flags)
public static String encodeToString(byte[] input, int flags)
public static String encodeToString(byte[] input, int offset, int len, int flags)

提供了三个解码

public static byte[] decode(String str, int flags)
public static byte[] decode(byte[] input, int flags)
public static byte[] decode(byte[] input, int offset, int len, int flags)

我们发现,四个编码方法都有一个flags参数,这就是编码标志位,或者编码标准

编码标准有以下几种

编码 含义
CRLF Win风格换行符,意思就是使用CR和LF这一对作为一行的结尾而不是Unix风格的LF。
CRLF 是Carriage-Return Line-Feed的缩写,意思是回车(r)换行(n)。也就是说,Window风格的行结束标识符rn,Unix风格的行结束标识符是n。
DEFAULT 这个参数默认使用默认的方法来加密
NO_PADDING 这个参数是略去加密字符串最后的”=”
NO_WRAP 这个参数意思是略去所有的换行符设置后CRLF就没用了)
URL_SAFE 这个参数意思是加密时不使用对URL和文件名特殊意义的字符来作为加密字符,具体就是以-和_取代+和/。
NO_CLOSE 通常与Base64OutputStream一起使用,是传递给Base64OutputStream的标志指示它不应关闭正在包装输出流。

实现方式
Bitmap 转 Base64

场景:移动端拍照或相册选取图片后,转为base64字符串传给H5前端

亲测可用

    /**
     * bitmap转为base64
     *
     * @param bitmap
     * @return
     */
    public static String bitmapToBase64(Bitmap bitmap) {
        String result = null;
        ByteArrayOutputStream baos = null;
        try {
            if (bitmap != null) {
                baos = new ByteArrayOutputStream();
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);

                baos.flush();
                baos.close();

                byte[] bitmapBytes = baos.toByteArray();
                result = Base64.encodeToString(bitmapBytes, Base64.DEFAULT);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (baos != null) {
                    baos.flush();
                    baos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }
Base64 转 Bitmap

场景获取前端传递的base64图片串,存储本地相册

亲测可用

    /**
     * base64转为bitmap
     *
     * @param base64Data
     * @return
     */
    public static Bitmap base64ToBitmap(String base64Data) {
        byte[] bytes = Base64.decode(base64Data, Base64.DEFAULT);
        return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
    }
File 转 Base64

场景:拍照后将File转为Base64传给前端
亲测可用

    /**
     * 将图片转换成Base64编码的字符串
     */
    public static String fileToBase64(String path) {
        if (TextUtils.isEmpty(path)) {
            return null;
        }
        InputStream is = null;
        byte[] data = null;
        String result = null;
        try {
            is = new FileInputStream(path);
            //创建个字符大小数组
            data = new byte[is.available()];
            //写入数组
            is.read(data);
            //用默认的编码格式进行编码
            result = Base64.encodeToString(data, Base64.NO_CLOSE);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != is) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
        return result;
    }

注意:未亲测

代码
/*
url, 本地路径
ext, 图片后缀
width, 图片宽度
height, 图片高度
callback 回调函数 用来取值
*/
 getUrlBase64(url, ext, width, height, callback) {
            var canvas = document.createElement("canvas"); 
            var ctx = canvas.getContext("2d");
            var img = new Image();
            img.crossOrigin = "Anonymous"; 
            img.src = url;
            img.onload = function () {
                canvas.height = height; 
                canvas.width = width; 
                ctx.drawImage(img, 0, 0, width, height); 
                var dataURL = canvas.toDataURL("image/" + ext);
                callback.call(this, dataURL); 
                canvas = null;
            };
        },
 getUrl(val) {
     // val:图片的base64路径
 },

调用
        this.getUrlBase64(
            require("@/assets/img/bg-01.png"),
            "png",
            470,
            348,
            this.getUrl
        );

未亲测 - 应用场景:图片上传服务器指定目录,前端请求返回base64字符串直接显示浏览图片

/**
 * 图片转化成base64字符串,返回string可以直接在src显示
 * @param file   图片文件
 * @param fileType  图片格式
 * @return
 * @throws IOException
 */
public static String getImageStr(File file, String fileType) throws IOException {
    String fileContentBase64 = null;
    String base64Str = "data:" + fileType + ";base64,";
    String content = null;
    //将图片文件转化为字节数组字符串,并对其进行Base64编码处理
    InputStream in = null;
    byte[] data = null;
    //读取图片字节数组
    try {
        in = new FileInputStream(file);
        data = new byte[in.available()];
        in.read(data);
        in.close();
        //对字节数组Base64编码
        if (data == null || data.length == 0) {
            return null;
        }
        content = Base64.encodeBytes(data);
        if (content == null || "".equals(content)) {
            return null;
        }
        fileContentBase64 = base64Str + content;
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (in != null) {
            in.close();
        }
    }
    return fileContentBase64;
}
Base64 转 图片文件

注意:未亲测

    /**
     * 将Base64编码转换为图片
     *
     * @param base64Str
     * @param path
     * @return true
     */
    public static boolean base64ToFile(String base64Str, String path) {
        byte[] data = Base64.decode(base64Str, Base64.NO_WRAP);
        for (int i = 0; i < data.length; i++) {
            if (data[i] < 0) {
                //调整异常数据
                data[i] += 256;
            }
        }
        OutputStream os = null;
        try {
            os = new FileOutputStream(path);
            os.write(data);
            os.flush();
            os.close();
            return true;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return false;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

注意:未亲测

public final class Base64Util {
    private static final String TAG = "Base64Utils";

    public Base64Util() {
    }

    public static byte[] decode(String var0) {
        byte[] var1 = new byte[0];

        try {
            return var0 != null ? Base64.decode(var0, 0) : var1;
        } catch (IllegalArgumentException var3) {
            Log.e(TAG, "decode failed : " + var3.getMessage());
            return var1;
        }
    }

    public static byte[] decodeUrlSafe(String var0) {
        byte[] var1 = new byte[0];

        try {
            return var0 != null ? Base64.decode(var0, 10) : var1;
        } catch (IllegalArgumentException var3) {
            Log.e(TAG, "decodeUrlSafe failed : " + var3.getMessage());
            return var1;
        }
    }

    public static byte[] decodeUrlSafeNoPadding(String var0) {
        byte[] var1 = new byte[0];

        try {
            return var0 != null ? Base64.decode(var0, 11) : var1;
        } catch (IllegalArgumentException var3) {
            Log.e(TAG, "decodeUrlSafeNoPadding failed : " + var3.getMessage());
            return var1;
        }
    }

    public static String encode(byte[] var0) {
        return var0 != null ? Base64.encodeToString(var0, 0) : null;
    }

    public static String encodeUrlSafe(byte[] var0) {
        return var0 != null ? Base64.encodeToString(var0, 10) : null;
    }

    public static String encodeUrlSafeNoPadding(byte[] var0) {
        return var0 != null ? Base64.encodeToString(var0, 11) : null;
    }

    /**
     * base64转化成图片文件
     *
     * @param base64
     * @param imgFilePath
     * @return
     */
    public static boolean generateImage(String base64, String imgFilePath) {// 对字节数组字符串进行Base64解码并生成图片
        if (base64 == null) // 图像数据为空
            return false;
        try {
            // Base64解码

            byte[] bytes = Base64Util.decode(base64);
            for (int i = 0; i < bytes.length; ++i) {
                if (bytes[i] < 0) {// 调整异常数据
                    bytes[i] += 256;
                }
            }
            // 生成jpeg图片
            OutputStream out = new FileOutputStream(imgFilePath);
            out.write(bytes);
            out.flush();
            out.close();
            return true;
        } catch (Exception e) {
            Log.e(TAG, e.getMessage());
            return false;
        }
    }
 }

转换工具测试校验

很多时候我们需要判断图片转换base64或base64转图是否正常、正确,那么就可以借用以下工具

菜鸟工具-在线图片转Base64编码

在这里插入图片描述

图片转base64

在这里插入图片描述

BASE64转图片

在这里插入图片描述


所遇问题
bad base–64

大致异常java.lang.IllegalargumentException:bad base–64

其实主要原因就是你的base64编码有问题可以看看格式如下红框内的数据就是多余的,需要及时删除

解决方法 – 具体如下

在这里插入图片描述

原文地址:https://blog.csdn.net/qq_20451879/article/details/125043136

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_29400.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注