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