今天介绍一下,实现二维码扫描的webView
可以实现二维码扫描的在度娘上有很多,今天这个呢其实和网上的差不多,只是我们的webView是一直在使用的,如果用网上的话,会改动很大,影响很多代码,所以我就在网上的基础上了做了一下修改,可以实现很轻松的使用。下面是自定义的webView
/**
* Created by swh123118 on 2017/12/20.
* 带长按扫描二维码功能的webview
*/
public class CustomWebView extends WebView implements OnLongClickListener{
private LongClickCallBack mCallBack;
public CustomWebView(Context context) {
super(context);
initListener();
}
public CustomWebView(Context context, AttributeSet attrs){
super(context,attrs,0);
initListener();
}
public CustomWebView(Context context, AttributeSet attrs,int defStyle){
super(context,attrs,defStyle);
initListener();
}
// 实现长按点击事件
private void initListener() {
setOnLongClickListener(this);
}
@Override
public boolean onLongClick(View v) {
// 长按事件监听(注意:需要实现LongClickCallBack接口并传入对象)
final HitTestResult htr = getHitTestResult();//获取所点击的内容
if (htr.getType() == WebView.HitTestResult.IMAGE_TYPE) {//判断被点击的类型为图片
mCallBack.onLongClickCallBack(htr.getExtra());
}
return false;
}
/**
* 长按事件回调接口,传递图片地址
* @author swh123118
*/
public interface LongClickCallBack{
/**用于传递图片地址*/
void onLongClickCallBack(String imgUrl);
}
/**
* 设置长按事件回调接口
* @author swh123118
*/
public void setLongClickCallBackListener(LongClickCallBack callBack){
this.mCallBack = callBack;
}
}
使用 :和普通的自定义View差不多,可以在布局中使用,也可以在代码中直接添加,
接着来说一下具体使用吧,我这边扫描使用的是zxing
1 添加依赖:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.google.zxing:core:3.2.0'
}
2 添加权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
3 布局引入
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.xxxx.view.CustomWebView
android:id="@+id/custom_webview"
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.xxxx.view.CustomWebView>
</LinearLayout>
4 获取点击的image并下载到本地
public Bitmap getBitmap(String sUrl){
try {
URL url = new URL(sUrl);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
if(conn.getResponseCode() == 200){
InputStream inputStream = conn.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
saveMyBitmap(bitmap,"code");//先把bitmap生成jpg图片
return bitmap;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
5 检查url并返回结果
public static Result handleQRCodeFormBitmap(Bitmap bitmap) {
Hashtable<DecodeHintType, String> hints =new Hashtable<DecodeHintType,String>();
hints.put(DecodeHintType.CHARACTER_SET, "utf-8");
RGBLuminanceSource source =new RGBLuminanceSource(bitmap);
BinaryBitmap bitmap1 = new BinaryBitmap(new HybridBinarizer(source));
QRCodeReader reader2= new QRCodeReader();
Result result = null;
try {
try {
result = reader2.decode(bitmap1,hints);
} catch (ChecksumException e) {
e.printStackTrace();
} catch (FormatException e) {
e.printStackTrace();
}
} catch (NotFoundException e) {
e.printStackTrace();
}
return result;
}
6 根据结果判断是否显示扫描二维码
private Handler handler = new Handler(){
public void handleMessage(Message msg) {
if (msg.what == 0){
if (isQR){
adapter.add("识别图中二维码");
}
adapter.notifyDataSetChanged();
}
};
};
下面来看一下主要代码
public class ScanCodeActivity extends Activity{
private CustomWebView mCustomWebView;
private CustomDialog mCustomDialog;
private ArrayAdapter<String> adapter;
private boolean isQR;//判断是否为二维码
private Result result;//二维码解析结果
private File file;
@SuppressLint("HandlerLeak")
private Handler handler = new Handler(){
public void handleMessage(Message msg) {
if (msg.what == 0){
if (isQR){
adapter.add("识别图中二维码");
}
adapter.notifyDataSetChanged();
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scan_code);
initWebView();
}
private void initWebView() {
mCustomWebView = (CustomWebView) findViewById(R.id.custom_webview);
mCustomWebView.loadUrl("https://mp.weixin.qq.com/s/DyfRn3Ox2cuFZX4etF2LSQ");//加载页面
mCustomWebView.setFocusable(true);
mCustomWebView.setFocusableInTouchMode(true);
WebSettings mSettings = mCustomWebView.getSettings();
mSettings.setJavaScriptEnabled(true);//开启javascript
mSettings.setDomStorageEnabled(true);//开启DOM
mSettings.setDefaultTextEncodingName("utf-8");//设置字符编码
//设置web页面
mSettings.setAllowFileAccess(true);//设置支持文件流
mSettings.setSupportZoom(true);// 支持缩放
mSettings.setBuiltInZoomControls(true);// 支持缩放
mSettings.setUseWideViewPort(true);// 调整到适合webview大小
mSettings.setLoadWithOverviewMode(true);// 调整到适合webview大小
mSettings.setDefaultZoom(WebSettings.ZoomDensity.FAR);// 屏幕自适应网页,如果没有这个,在低分辨率的手机上显示可能会异常
mSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);
//提高网页加载速度,暂时阻塞图片加载,然后网页加载好了,在进行加载图片
mSettings.setBlockNetworkImage(true);
mSettings.setAppCacheEnabled(true);//开启缓存机制
//实现监听回调
mCustomWebView.setLongClickCallBackListener(new MyonLongClickCallBack());
mCustomWebView.setWebViewClient(new MyWebViewClient());
}
//这里可以不加,直接在原有基础上实现方法onScaleChanged即可
private class MyWebViewClient extends WebViewClient {
/**
* 加载过程中 拦截加载的地址url
* @param view
* @param url 被拦截的url
* @return
*/
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return super.shouldOverrideUrlLoading(view, url);
}
/**
* 页面加载过程中,加载资源回调的方法
* @param view
* @param url
*/
@Override
public void onLoadResource(WebView view, String url) {
super.onLoadResource(view, url);
}
/**
* 页面加载完成回调的方法
* @param view
* @param url
*/
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
// 关闭图片加载阻塞
view.getSettings().setBlockNetworkImage(false);
}
/**
* 页面开始加载调用的方法
* @param view
* @param url
* @param favicon
*/
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
}
@Override
public void onScaleChanged(WebView view, float oldScale, float newScale) {
super.onScaleChanged(view, oldScale, newScale);
view.requestFocus();
view.requestFocusFromTouch();
}
}
private class MyonLongClickCallBack implements CustomWebView.LongClickCallBack{
@Override
public void onLongClickCallBack(final String imgUrl) {
// 获取到图片地址后做相应的处理
new Thread(){
public void run() {
decodeImage(imgUrl);
handler.sendEmptyMessage(0);
};
}.start();
showDialog();
}
}
/**
* 判断是否为二维码
* @param
* @return
*/
private boolean decodeImage(String sUrl){
result = DecodeImage.handleQRCodeFormBitmap(getBitmap(sUrl));
if(result == null){
isQR = false;
}else {
isQR = true;
}
return isQR;
}
/**
* 根据地址获取网络图片
* @param sUrl 图片地址
* @return
* @throws IOException
*/
public Bitmap getBitmap(String sUrl){
try {
URL url = new URL(sUrl);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
if(conn.getResponseCode() == 200){
InputStream inputStream = conn.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
saveMyBitmap(bitmap,"code");//先把bitmap生成jpg图片
return bitmap;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 显示Dialog
* @param
*/
private void showDialog() {
adapter = new ArrayAdapter<String>(this,R.layout.item_dialog);
adapter.add("发送给朋友");
adapter.add("保存到手机");
adapter.add("收藏");
mCustomDialog = new CustomDialog(this, R.layout.custom_dialog) {
@Override
public void initViews() {
// 初始CustomDialog化控件
ListView mListView = (ListView) findViewById(R.id.lv_dialog);
mListView.setAdapter(adapter);
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// 点击事件
switch (position) {
case 0:
sendToFriends();
Toast.makeText(ScanCodeActivity.this, "已发送给朋友", Toast.LENGTH_LONG).show();
closeDialog();
break;
case 1:
saveImageToGallery(ScanCodeActivity.this);
Toast.makeText(ScanCodeActivity.this, "已保存到手机", Toast.LENGTH_LONG).show();
closeDialog();
break;
case 2:
Toast.makeText(ScanCodeActivity.this, "已收藏", Toast.LENGTH_LONG).show();
closeDialog();
break;
case 3:
goIntent();
Toast.makeText(ScanCodeActivity.this, "二维码识别结果: " + result.toString(), Toast.LENGTH_LONG).show();
closeDialog();
break;
}
}
});
}
};
mCustomDialog.show();
}
/**
* 发送给好友
*/
private void sendToFriends() {
Intent intent=new Intent(Intent.ACTION_SEND);
Uri imageUri= Uri.parse(file.getAbsolutePath());
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_STREAM, imageUri);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(Intent.createChooser(intent, getTitle()));
}
/**
* bitmap 保存为jpg 图片
* @param mBitmap 图片源
* @param bitName 图片名
*/
public void saveMyBitmap(Bitmap mBitmap,String bitName) {
file= new File( Environment.getExternalStorageDirectory()+"/"+bitName + ".jpg");
FileOutputStream fOut = null;
try {
fOut = new FileOutputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
try {
fOut.flush();
} catch (IOException e) {
e.printStackTrace();
}
try {
fOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 先保存到本地再广播到图库
* */
public void saveImageToGallery(Context context) {
// 其次把文件插入到系统图库
try {
MediaStore.Images.Media.insertImage(context.getContentResolver(), file.getAbsolutePath(), "code", null);
// 最后通知图库更新
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + file)));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
/**
* 实现url的条状
* 也可以直接在本页面打开
* mCustomWebView.loadUrl(result.toString());//加载页面
* */
public void goIntent(){
Uri uri = Uri.parse(result.toString());
Intent intent = new Intent(Intent.ACTION_VIEW,uri);
startActivity(intent);
}
}
以上就是实现全部内容,欢迎大家知错