webview长按图片识别二维码
第一次写博客,主要是做这个功能是临时让加的功能,当时一头雾水,就想着用zxing,但是具体怎么做也不太清楚,然后就查了很多资料,所以在此记录一下。
导入zxing包
implementation 'com.google.zxing:core:3.3.3'
首先是长按webview里面的图片,实现长按监听功能
/**
* 长按webview图片
*/
webView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
final WebView.HitTestResult htr = ((WebView) v).getHitTestResult();//获取所点击的内容
if (htr.getType() == WebView.HitTestResult.IMAGE_TYPE //判断被点击的类型为图片
|| htr.getType() == WebView.HitTestResult.IMAGE_ANCHOR_TYPE
|| htr.getType() == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
imagePath = htr.getExtra();
getDecodeAbleBitmap(imagePath);
}
return false;
}
});
然后就是将获取到的网络图片下载下来,通过流转成Bitmap,注意的是,必须在子线程中实现网络下载
/**
*
* @param picturePath 网络图片文件路径
* @return
*/
private void getDecodeAbleBitmap(final String picturePath) {
new Thread(new Runnable() {
@Override
public void run() {
try {
URL url = new URL(picturePath);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
//这里就简单的设置了网络的读取和连接时间上线,如果时间到了还没成功,那就不再尝试
httpURLConnection.setReadTimeout(8000);
httpURLConnection.setConnectTimeout(8000);
if(httpURLConnection.getResponseCode()==200) {
InputStream inputStream = httpURLConnection.getInputStream();
//这里直接就用bitmap取出了这个流里面的图片,哈哈,其实整篇文章不就主要是这一句嘛
Bitmap bm = BitmapFactory.decodeStream(inputStream);
//下面这是把图片携带在Message里面,简单,不多说
Message message = Message.obtain();
message.obj = bm;
handler.sendMessage(message);
inputStream.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
***
在handler中进行解码操作
//使用Handler更新主线程(UI线程)
private Handler handler = new Handler(){
public void handleMessage(Message msg) {
Bitmap bitmap=(Bitmap) msg.obj;
final Result ret = parsePic(bitmap);
if (null == ret) {
ToastUtil.show(act,"未解析到结果");
} else {
if (ret.toString().startsWith("http://")||ret.toString().startsWith("https://")){
AlertDialog.Builder builder = new AlertDialog.Builder(act);
builder.setMessage(ret.toString());
builder.setTitle("识别成功");
builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//用默认浏览器打开扫描得到的地址
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
Uri url = Uri.parse(ret.toString());
intent.setData(url);
startActivity(intent);
dialog.dismiss();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
}else{
ToastUtil.show(act,ret.toString());
}
}
}
};
以下才是重点,解码方法。利用zxing
/**
* 解析二维码图片
* @return
*/
public Result parsePic(Bitmap bitmap) {
//解析转换类型UTF-8
Hashtable<DecodeHintType, String> hints = new Hashtable<DecodeHintType, String>();
hints.put(DecodeHintType.CHARACTER_SET, "utf-8");
//新建一个RGBLuminanceSource对象,将bitmap图片传给此对象
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int[] data = new int[width * height];
bitmap.getPixels(data, 0, width, 0, 0, width, height);
RGBLuminanceSource rgbLuminanceSource = new RGBLuminanceSource(width,height,data);
//将图片转换成二进制图片
BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(rgbLuminanceSource));
//初始化解析对象
QRCodeReader reader = new QRCodeReader();
//开始解析
Result result = null;
try {
result = reader.decode(binaryBitmap, hints);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
好了,所有用到的方法都在此了,希望有此需求的少走弯路