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

相關文章
相關標籤/搜索