带长按扫描二维码功能的WebView,实现类似微信效果

今天介绍一下,实现二维码扫描的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);
    }
}

以上就是实现全部内容,欢迎大家知错

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值