zxing解析二维码抛出com.google.zxing.NotFoundException

背景

因为公司的支付SDK只支持TV端须要在手机端扫描微信或者支付的二维码进行支付,可是好像TV端的应用不少都是兼容手机端的,这个时候若是去支付的话须要拿另外一部手机扫码支付,体验不太好,因此想着增长 一个按钮,若是用户使用的是手机点击以后,经过Zxing自动识别二维码调起支付,通过一顿操做猛如虎,发现微信二维码扫码以后的结果是一wexin://开头的Url,使用手机自带的浏览器是解析不了的,而支付宝解析出来的是https://开头的url,能够直接经过手机浏览器调起支付宝支付,因此初步选型只支持支付宝的移动端支付,这也就成为了本文产生的根源。浏览器

正文

具体本地图片转为bitmap的代码就不贴了,这个应该都知道,下面是经过zxing从bitmap解析二维码信息的代码:bash

/**
 * 将二维码解析为字符地址
 *
 * @param bitmap
 * @return
 */
public static String decodeFromBitmap(Bitmap bitmap) {
    try {

        // 获取bitmap的宽高,像素矩阵
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        int[] pixels = new int[width * height];
        bitmap.getPixels(pixels, 0, width, 0, 0, width, height);

        // 最新的库中,RGBLuminanceSource 的构造器参数不仅是bitmap了
        RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels);
        BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(source));
        Map<DecodeHintType, Object> hints = new LinkedHashMap<DecodeHintType, Object>();
        MultiFormatReader reader = new MultiFormatReader();
        Result result = reader.decode(binaryBitmap, hints);
        return result.getText();
    } catch (Exception e) {
        e.printStackTrace();
    }

    return "";
}复制代码

微信的支付二维码解析正常,但是一旦换成支付宝的支付二维码就报错com.google.zxing.NotFoundException,通过一番百度谷歌,搜索出来的结果相似下面这种都是无效的:微信

Map<DecodeHintType,Object> hints = new LinkedHashMap<DecodeHintType,Object>(); // 解码设置编码方式为:utf-8, 优化

hints.put(DecodeHintType.CHARACTER_SET, CHARSET); //优化精度 hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE); //复杂模式,开启PURE_BARCODE模式 hints.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE); ------ui

通过排查发现支付宝的二维码经过以下方式获取像素点时,pixels全为0:google

bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
复制代码

而微信的则是-1,结果又是一番百度谷歌未果,最后发现微信的二维码保存到本地没有信息的地方默认是白色,而支付宝除了中间的logo全黑,职业敏感性告诉咱们,这是解决问题的关键。又是一番百度谷歌发现bitmap没有颜色的位置使用的是黑色替代的这个时候像素值是0,因此会看到支付宝生成的图片是全黑的,而微信由于自己生成的图片没有颜色就是用白色填充的因此素值是-1。编码

       既然问题的缘由找到了那么怎么解决呢?做为一枚机智boy,这种问题怎么能难倒我呢?既然微信的二维码图片默认白色的没有问题,那么咱们就给支付宝的bitmap增长一个白色背景好了,而后在从新合成一个新的bitmap给zxing解析,那就涉及到两个问题,url

第一步

怎么生成一张白色背景的bitmap?so easyspa

/**
 * 生成一张空白的图片
 * @param width
 * @param height
 * @return
 */

public static Bitmap createWhiteBitMap(int width, int height) {
    Bitmap bitmap = Bitmap.createBitmap(width, height,
            Bitmap.Config.ARGB_8888);
    bitmap.eraseColor(Color.parseColor("#ffffff"));//填充颜色
    return bitmap;

}复制代码

第二步

怎么将两个bitmap合成一张?也是so easy:rest

/**
 * 将两个Bitmap合并成一个
 *
 * @param first
 * @param second
 * @param fromPoint 第二个Bitmap开始绘制的起始位置(相对于第一个Bitmap)
 * @return
 */
public static Bitmap mixtureBitmap(Bitmap first, Bitmap second,
                                   PointF fromPoint) {
    if (first == null || second == null || fromPoint == null) {
        return null;
    }
    Bitmap newBitmap = Bitmap.createBitmap(
            first.getWidth(),
            first.getHeight(), Config.ARGB_4444);
    Canvas cv = new Canvas(newBitmap);
    cv.drawBitmap(first, 0, 0, null);
    cv.drawBitmap(second, fromPoint.x, fromPoint.y, null);
    cv.save(Canvas.ALL_SAVE_FLAG);
    cv.restore();

    return newBitmap;
}
复制代码


通过一顿操做以后,bingo

相关文章
相关标签/搜索