因爲公司的支付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