二维码生成与扫描android_android 生成二维码硬件扫描 - CSDN
  • 不诗意的女程序猿不是好厨师~ 【转载请注明出处:From李诗雨】 目前在做一个和机顶盒相关的app,项目中需要使用二维码扫描来绑定机顶盒。 由于工期的原因,也没...②实现二维码生成 ③使用RxPermissions做了动态
    
    

    不诗意的女程序猿不是好厨师~

    【转载请注明出处:From李诗雨---http://blog.csdn.net/cjm2484836553/article/details/72774534

    目前在做一个和机顶盒相关的app,项目中需要使用二维码扫描来绑定机顶盒。
    由于工期的原因,也没时间细细研究,只是粗略集成了一下。
    在此,又重新写了一个demo,以示记录。


    源码demo:不含动态权限的源码

                       含动态权限的源码


    Demo所包含的功能说明:
    ①实现二维码的扫描

    ②实现二维码的生成

    ③使用RxPermissions添加动态权限

    效果图展示:

              


    话不多说,下面就让我们按照如下步骤来一步一步集成Zxing。


    第一步:将core-3.3.0.jar包考到libs目录下

    点击下载jar包:core-3.3.0.jar

                    


    第二步:将整个zxing包考过来

    将整个zxing包都拷贝过来,然后暂不做其他处理

                           


    第三步:拷贝相关资源文件

    将res下的相关的资源文件拷贝过来
    这里需要是在自己原有的文件内容的基础上进行叠加,而不是简单替换。
    具体点来说就是:
    ①drawble,drawable-hdpi,drawabl-xhdpi的全部内容都拷贝过来 layout中拷贝2个布局过来



    ②将raw文件夹都拷过去

                                                               


    ③values下的文件拷贝要小心一点!
    比如:对于colors.xml文件,我们需要把其中Zxing相关的代码考到自己的colors.xml中去, 而不是简单的替换,其他文件也类似!

                                                                  

                                         


    ④将以下的东西拷贝到res下

                                     


    第四步:拷贝manifest.xml文件中的相关权限和Activity

                       

     


    第五步先clean project,然后回过头来修改zxing包下报红的类

    这无非是包的问题,删了,重新导包即可


    第六步:记得将capture.xml下的ViewfinderView的全类名修改为正确的



    第七步:先不加动态权限测试一下集成的正确性

    先将build.gradle文件下的targetSdkVersion 改为22,
    我们先不加动态权限来初步验证一下集成的正确性

    MainActivity的布局:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.lishiyu.lsy_zxing_rxpermissions_demo.MainActivity">
    
        <!--扫描二维码-->
        <Button
            android:onClick="canningMethod"
            android:textSize="17sp"
            android:text="点击扫一扫"
            android:id="@+id/btn_scanning"
            android:layout_width="match_parent"
            android:layout_height="38dp"
             />
        
        <TextView
            android:id="@+id/tv_scanning_result"
            android:gravity="center"
            android:textSize="17sp"
            android:text="扫描结果:"
            android:layout_width="match_parent"
            android:layout_height="38dp" />
    
    
        <!--生成二维码-->
        <EditText
            android:textColorHint="#33000000"
            android:textColor="#99000000"
            android:hint="请输入你要生成的二维码内容"
            android:layout_marginTop="30dp"
            android:layout_width="match_parent"
            android:layout_height="38dp" />
    
        <Button
            android:onClick="makeErweimaMethod"
            android:textSize="17sp"
            android:text="点击生成二维码"
            android:id="@+id/btn_make_erweima"
            android:layout_width="match_parent"
            android:layout_height="38dp"
            />
    
        <ImageView
            android:layout_gravity="center_horizontal"
            android:id="@+id/result_img"
            android:layout_width="200dp"
            android:layout_height="200dp" />
    
    
    </LinearLayout>
    


    ①扫描二维码并返回扫描结果

     //点击跳转到扫描界面
        public void canningMethod(View v) {
            Intent intent = new Intent(MainActivity.this,
                    CaptureActivity.class);
            startActivityForResult(intent, SCANNING_CODE);
    
        }
    
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    
            super.onActivityResult(requestCode, resultCode, data);
            // 扫描二维码/条码回传
            if (requestCode == SCANNING_CODE && resultCode == RESULT_OK) {
                if (data != null) {
    
                    String content = data.getStringExtra(DECODED_CONTENT_KEY);
                    Bitmap bitmap = data.getParcelableExtra(DECODED_BITMAP_KEY);
    
                    tv_scanning_result.setText("扫描结果: " + content);
    
                }
            }
        }

    ②生成制定内容和logo的二维码

     //点击生成带图片的二维码
        public void makeErweimaMethod(View v) {
            String aimContent=et_erweima_content.getText().toString();
            Create2QR2(aimContent,result_img);
        }
        
        //生成二维码的方法
        private void Create2QR2(String urls,ImageView imageView) {
            String uri = urls;
            int mScreenWidth = 0;
            Bitmap bitmap;
            try {
                DisplayMetrics dm = new DisplayMetrics();
                getWindowManager().getDefaultDisplay().getMetrics(dm);
                mScreenWidth = dm.widthPixels;
    
                bitmap = BitmapUtil.createQRImage(uri, mScreenWidth,
                        BitmapFactory.decodeResource(getResources(), R.mipmap.me));//自己写的方法
    
                if (bitmap != null) {
                    imageView.setImageBitmap(bitmap);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }

    涉及到的一个工具类:

    public class BitmapUtil {
        //生成二维码图片(不带图片)
        public static Bitmap createQRCode(String url, int widthAndHeight)
                throws WriterException {
            Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
            BitMatrix matrix = new MultiFormatWriter().encode("lvu",
                    BarcodeFormat.QR_CODE, widthAndHeight, widthAndHeight);
    
            int width = matrix.getWidth();
            int height = matrix.getHeight();
            int[] pixels = new int[width * height];
            //画黑点
            for (int y = 0; y < height; y++) {
                for (int x = 0; x < width; x++) {
                    if (matrix.get(x, y)) {
                        pixels[y * width + x] = BLACK; //0xff000000
                    }
                }
            }
            Bitmap bitmap = Bitmap.createBitmap(width, height,
                    Bitmap.Config.ARGB_8888);
            bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
            return bitmap;
        }
    
    
        //带图片的二维码
        public static Bitmap createQRImage(String content, int heightPix, Bitmap logoBm) {
            try {
                //配置参数
                Map<EncodeHintType, Object> hints = new HashMap<>();
                hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
                //容错级别
                hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
                // 图像数据转换,使用了矩阵转换
                BitMatrix bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, heightPix, heightPix, hints);
                int[] pixels = new int[heightPix * heightPix];
                // 下面这里按照二维码的算法,逐个生成二维码的图片,
                // 两个for循环是图片横列扫描的结果
                for (int y = 0; y < heightPix; y++) {
                    for (int x = 0; x < heightPix; x++) {
                        if (bitMatrix.get(x, y)) {
                            pixels[y * heightPix + x] = 0xff000000;
                        } else {
                            pixels[y * heightPix + x] = 0xffffffff;
                        }
                    }
                }
    
                // 生成二维码图片的格式,使用ARGB_8888
                Bitmap bitmap = Bitmap.createBitmap(heightPix, heightPix, Bitmap.Config.ARGB_8888);
                bitmap.setPixels(pixels, 0, heightPix, 0, 0, heightPix, heightPix);
    
                if (logoBm != null) {
                    bitmap = addLogo(bitmap, logoBm);
                }
    
                //必须使用compress方法将bitmap保存到文件中再进行读取。直接返回的bitmap是没有任何压缩的,内存消耗巨大!
                return bitmap;
            } catch (WriterException e) {
                e.printStackTrace();
            }
    
            return null;
        }
    
        /**
         * 在二维码中间添加Logo图案
         */
        private static Bitmap addLogo(Bitmap src, Bitmap logo) {
            if (src == null) {
                return null;
            }
    
            if (logo == null) {
                return src;
            }
    
            //获取图片的宽高
            int srcWidth = src.getWidth();
            int srcHeight = src.getHeight();
            int logoWidth = logo.getWidth();
            int logoHeight = logo.getHeight();
    
            if (srcWidth == 0 || srcHeight == 0) {
                return null;
            }
    
            if (logoWidth == 0 || logoHeight == 0) {
                return src;
            }
    
            //logo大小为二维码整体大小的1/5
            float scaleFactor = srcWidth * 1.0f / 5 / logoWidth;
            Bitmap bitmap = Bitmap.createBitmap(srcWidth, srcHeight, Bitmap.Config.ARGB_8888);
            try {
                Canvas canvas = new Canvas(bitmap);
                canvas.drawBitmap(src, 0, 0, null);
                canvas.scale(scaleFactor, scaleFactor, srcWidth / 2, srcHeight / 2);
                canvas.drawBitmap(logo, (srcWidth - logoWidth) / 2, (srcHeight - logoHeight) / 2, null);
    
                canvas.save(Canvas.ALL_SAVE_FLAG);
                canvas.restore();
            } catch (Exception e) {
                bitmap = null;
                e.getStackTrace();
            }
    
            return bitmap;
        }
    
    
    }
    

    好了,到这里简单的①二维码扫描和②生成二维码功能就实现了。

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~华丽的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    下面让我来使用RxPermissions增加动态权限  :
    RxPermissions的github地址:https://github.com/tbruyelle/RxPermissions

    前提:
    现在将build.gradle文件下的targetSdkVersion 改为23,
    然后在manifest.xml中添加相关权限(这里我们只涉及到 相机 权限):

    接着RxPermissions就要正式登场了:
    第一步:在build.gradle中做如下配置

    即:


    第二步:使用


    第①步先创建一个RxPermissions实例:




    第②步代码中正式使用:
    在对应的点击事件的方法中添加动态权限的相关代码:
     rxPermissions
                    .request(Manifest.permission.CAMERA)
                    .subscribe(granted -> {
                        if (granted) { // Always true pre-M
                            //如果已经授权就直接跳转到二维码扫面界面
                            Intent intent = new Intent(MainActivity.this,
                                    CaptureActivity.class);
                            startActivityForResult(intent, SCANNING_CODE);
    
                            Toast.makeText(this, "扫一扫", Toast.LENGTH_SHORT).show();
                        } else { // Oups permission denied
                            Toast.makeText(this, "相机权限被拒绝,无法扫描二维码", Toast.LENGTH_SHORT).show();
                            return;
                        }
                    });

    这是你会发现报错了:Lambda expermission are not supported at this language level



    这是由于lambda表达式的使用出了问题
    解决办法
    在build.gradle文件中添加如下代码( 注意必须是1.8以上!)




    同步后发现就不再报错了:



    (注:卸载后再重新运行)
    运行后,点击“扫一扫”会出现下图的效果:



    好了,这样加动态权限的扫描二维码和生成带图标的二维码也完成了~

    源码demo:不含动态权限的源码

                       含动态权限的源码



    积累点滴,做好自己,晚安~











    展开全文
  • 0. 前言今天这篇文章主要描述二维码的生成与扫描...本篇旨在帮助有需求的同学快速完成二维码生成扫描的功能。本篇转载自:http://blog.csdn.net/hai_qing_xu_kong/article/details/51260428 1. Zxing的使用从gitHub

    0. 前言

    今天这篇文章主要描述二维码的生成与扫描,使用目前流行的Zxing,为什么要讲二维码,因为二维码太普遍了,随便一个Android APP都会有二维码扫描。本篇旨在帮助有需求的同学快速完成二维码生成和扫描的功能。

    本篇转载自:http://blog.csdn.net/hai_qing_xu_kong/article/details/51260428

     

    1.    Zxing的使用

    github上下载项目后,可以看到整体代码结构如下:

    这里写图片描述

    我们只需将Zxing包下的所有代码copy一份到我们的项目中去,除了这些还需要zxingjar包,最后相应的资源文件,包括values文件下的ids文件、raw文件中的资源文件(可以替换)、layout文件下的activity_capture.xml(可以进行相应的订制) 和图片资源。

     

    2.    生成二维码的实现

    等上面工作全部准备完毕后,就可以创建我们的二维码了。如何生成二维码?

    需要EncodingUtils这个二维码生成工具类。通过调用工具类中的createQRCode()方法来生成二维码。该方法参数介绍如下:

    /*
    * content:二维码内容
    * widthPix:二维码宽度
    * heightPix:二维码高度
    * logoBm:二维码中间的logo对应的Bitmap
    */
    public static Bitmap createQRCode(String content, int widthPix, int heightPix, Bitmap logoBm)
    

    下面完成的是生成的一个百度地址的二维码,中间LOGOAndroid小机器人。并保存图片到本地,方便后续测试二维码的本地读取功能。

    /**
         * 创建、展示二维码并将bitmap保存在本地
         */
        private void create() {
            int width = DensityUtil.dip2px(this, 200);
            Bitmap bitmap = EncodingUtils.createQRCode("http://www.baidu.com",
                    width, width, BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher));
            iv_zxing.setImageBitmap(bitmap);
            saveBitmap(bitmap);
        }
    
        /**
         * 将Bitmap保存在本地
         * 
         * @param bitmap
         */
        public void saveBitmap(Bitmap bitmap) {
            // 首先保存图片
            File appDir = new File(Environment.getExternalStorageDirectory(),"zxing_image");
            if (!appDir.exists()) {
                appDir.mkdir();
            }
            String fileName = "zxing_image" + ".jpg";
            File file = new File(appDir, fileName);
            try {
                FileOutputStream fos = new FileOutputStream(file);
                bitmap.compress(CompressFormat.JPEG, 100, fos);
                fos.flush();
                fos.close();
            } catch (Exception e) {
                e.printStackTrace();
            } 
    
            // 把文件插入到系统图库
            try {
                MediaStore.Images.Media.insertImage(this.getContentResolver(),file.getAbsolutePath(), fileName, null);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
    
            // 通知图库更新
            sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
                    Uri.parse("file://" + "/sdcard/namecard/")));
    }

    看到如下效果:

    这里写图片描述


    3.    读取二维码的实现

    3.1  摄像头扫描的方式

    二维码扫描需要借助于CaptureActivity这个类,打开CaptureActivity界面并进行扫描,扫描完毕后回调onActivityResult()方法,从onActivityResult()中得到扫描后的结果。效果就不演示的,因为使用的是模拟器。详细代码如下:

         /**
         * 打开二维码扫描
         */
        private void open() {
            config();
            startActivityForResult(new Intent(MainActivity.this,CaptureActivity.class), 0);
        }
        /**
         * 提高屏幕亮度
         */
        private void config() {
            WindowManager.LayoutParams lp = getWindow().getAttributes();
            lp.screenBrightness = 1.0f;
            getWindow().setAttributes(lp);
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (resultCode == RESULT_OK) {
                Bundle bundle = data.getExtras();
                String result = bundle.getString("result");
                tv_result.setText(result);
            }
    }
    


    3.2  本地图片扫描的方式

    扫描本地图片需要我们在CaptureActivity中进行相应的修改,为此我在扫描界面底部增加了一个按钮,用来选择本地图片。layout代码这里就不展示,我们直接看点击后的事件处理。

    /**
    * 打开本地图片
    */
    private void openLocalImage() {
        // 打开手机中的相册
        Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT); 
        innerIntent.setType("image/*");
        Intent wrapperIntent = Intent.createChooser(innerIntent, "选择二维码图片");
        this.startActivityForResult(wrapperIntent, 0x01);
    }
    

    打开系统图片库后选择图片,这时需要重写onActivityResult()方法用于返回图片信息。

    @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (resultCode == RESULT_OK) {
                switch (requestCode) {
                case 0x01:
                    // 获取选中图片的路径
                    Cursor cursor = getContentResolver().query(data.getData(),null, null, null, null);
                    if (cursor.moveToFirst()) {
                        photo_path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
                    }
                    cursor.close();
    
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            Result result = scanningImage(photo_path);
                            if (result != null) {
                                handleDecode(result, new Bundle());
                            }
                        }
                    }).start();
                    break;
                }
            }
    }
    

    获取图片路径photo_path,调用scanningImage()方法进行扫描Zxing源码中,扫描到的结果都是存放在Result结果集中。获取到Result后,就进行结果的回传,阅读CaptureActivity源码可以得知最后Result结果集会传递给handleDecode()方法

    /**
         * A valid barcode has been found, so give an indication of success and show
         * the results.
         * 
         * @param rawResult
         *            The contents of the barcode.
         * @param bundle
         *            The extras
         */
        public void handleDecode(Result rawResult, Bundle bundle) {
            inactivityTimer.onActivity();
            beepManager.playBeepSoundAndVibrate();
    
            Intent resultIntent = new Intent();
            bundle.putInt("width", mCropRect.width());
            bundle.putInt("height", mCropRect.height());
            bundle.putString("result", rawResult.getText());
            resultIntent.putExtras(bundle);
            this.setResult(RESULT_OK, resultIntent);
            CaptureActivity.this.finish();
    }
    

    获取到图片路径后需要将其二维码信息包装成Result对象,因此需要解析图片:

     /**
         * 扫描二维码图片的方法
         * 
         * @param path
         * @return
         */
        public Result scanningImage(String path) {
            if (TextUtils.isEmpty(path)) {
                return null;
            }
            Hashtable<DecodeHintType, String> hints = new Hashtable<DecodeHintType, String>();
            hints.put(DecodeHintType.CHARACTER_SET, "UTF8"); // 设置二维码内容的编码
    
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true; // 先获取原大小
            scanBitmap = BitmapFactory.decodeFile(path, options);
            options.inJustDecodeBounds = false; // 获取新的大小
            int sampleSize = (int) (options.outHeight / (float) 200);
            if (sampleSize <= 0)
                sampleSize = 1;
            options.inSampleSize = sampleSize;
            scanBitmap = BitmapFactory.decodeFile(path, options);
            int width = scanBitmap.getWidth();
            int height = scanBitmap.getHeight();
            int[] pixels = new int[width * height];
            scanBitmap.getPixels(pixels, 0, width, 0, 0, width, height);
            /**
             * 第三个参数是图片的像素
             */
            RGBLuminanceSource source = new RGBLuminanceSource(width, height,
                    pixels);
            BinaryBitmap bitmap1 = new BinaryBitmap(new HybridBinarizer(source));
            QRCodeReader reader = new QRCodeReader();
            try {
                return reader.decode(bitmap1, hints);
    
            } catch (NotFoundException e) {
                e.printStackTrace();
            } catch (ChecksumException e) {
                e.printStackTrace();
            } catch (FormatException e) {
                e.printStackTrace();
            }
            return null;
        }
    

    根据路径获取Bitmap,最后通过QRCodeReader 中的decode方法解析成Result对象并返回,最终传递给handleDecode方法。运行程序效果如下,扫描出来的是之前定义的百度地址。

    这里写图片描述

    最后不要忘了申明权限和CaptureActivity

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.VIBRATE"/>
    <activity android:name="com.example.zxingtest.zxing.activity.CaptureActivity"/>
    

    展开全文
  • 前言月底离开公司,准备月底休息一段时间,之前每天忙于工作,甚至连一些感兴趣的东西都没有研究过,趁着这段时间可以好好享受一下,今天这篇文章主要描述二维码生成与扫描,使用目前流行的Zxing,底部会给出整个...

    转载请标明出处:
    http://blog.csdn.net/hai_qing_xu_kong/article/details/51260428
    本文出自:【顾林海的博客】

    ##前言

    月底离开公司,准备月底休息一段时间,之前每天忙于工作,甚至连一些感兴趣的东西都没有研究过,趁着这段时间可以好好享受一下,今天这篇文章主要描述二维码的生成与扫描,使用目前流行的Zxing,底部会给出整个项目的gitHub地址,为什么要讲二维码,因为二维码太普遍了,随便一个APP都会有二维码扫描。

    ##Zxing使用

    从底部gitHub项目下载地址下载项目完后,可以看到整体代码结构如下:

    这里写图片描述

    这里写图片描述

    我们只需将zxing包下的所有代码copy一份到我们的项目中去,除了这写代码以外,还需要zxing的jar包,也从项目中直接copy一份

    全部copy完之后,还需要相应的资源文件

    1、values文件下的ids文件
    2、raw文件中的资源文件(可以替换)
    3、layout文件下的activity_capture.xml(可以进行相应的订制)
    4、图片资源

    ##生成二维码

    等上面工作全部准备完毕后,就可以创建我们的二维码了,如何生成二维码?这时需要EncodingUtils这个二维码生成工具类。通过调用工具类中的createQRCode方法来生成二维码。

    public static Bitmap createQRCode(String content, int widthPix, int heightPix, Bitmap logoBm)
    

    createQRCode方法参数如下:

    content:二维码内容
    widthPix:二维码宽度
    heightPix:二维码高度
    logoBm:二维码中间的logo

    	/**
    	 * 创建二维码并将图片保存在本地
    	 */
    	private void create() {
    		int width = DensityUtil.dip2px(this, 200);
    		Bitmap bitmap = EncodingUtils.createQRCode("http://www.baidu.com",
    				width, width, BitmapFactory.decodeResource(getResources(),
    						R.drawable.ic_launcher));
    		iv_zxing.setImageBitmap(bitmap);
    		saveBitmap(bitmap);
    	}
    
    	/**
    	 * 将Bitmap保存在本地
    	 * 
    	 * @param bitmap
    	 */
    	public void saveBitmap(Bitmap bitmap) {
    		// 首先保存图片
    		File appDir = new File(Environment.getExternalStorageDirectory(),
    				"zxing_image");
    		if (!appDir.exists()) {
    			appDir.mkdir();
    		}
    		String fileName = "zxing_image" + ".jpg";
    		File file = new File(appDir, fileName);
    		try {
    			FileOutputStream fos = new FileOutputStream(file);
    			bitmap.compress(CompressFormat.JPEG, 100, fos);
    			fos.flush();
    			fos.close();
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    
    		// 把文件插入到系统图库
    		try {
    			MediaStore.Images.Media.insertImage(this.getContentResolver(),
    					file.getAbsolutePath(), fileName, null);
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		}
    		// 通知图库更新
    		sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
    				Uri.parse("file://" + "/sdcard/namecard/")));
    	}
    
    

    这里生成的二维码内容是一个百度的地址,中间LOGO是默认的安卓小机器人。

    运行程序可以看到如下效果:

    这里写图片描述

    ##二维码扫描

    二维码扫描需要借助于我们的CaptureActivity这个类,打开CaptureActivity界面并进行扫描,扫描完毕后回调onActivityResult方法,也就是我们可以通过onActivityResult得到扫描后的结果。详细代码如下:

    	/**
    	 * 打开二维码扫描
    	 */
    	private void open() {
    		config();
    		startActivityForResult(new Intent(MainActivity.this,
    				CaptureActivity.class), 0);
    	}
    	/**
    	 * 提高屏幕亮度
    	 */
    	private void config() {
    		WindowManager.LayoutParams lp = getWindow().getAttributes();
    		lp.screenBrightness = 1.0f;
    		getWindow().setAttributes(lp);
    	}
    	
    	@Override
    	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    		super.onActivityResult(requestCode, resultCode, data);
    		if (resultCode == RESULT_OK) {
    			Bundle bundle = data.getExtras();
    			String result = bundle.getString("result");
    			tv_result.setText(result);
    		}
    	}
    

    效果就不演示的,因为使用的是模拟器。

    ##扫描本地图片

    扫描本地图片需要我们在CaptureActivity中进行相应的修改,为此我在扫描界面底部增加了一个按钮,用来选择本地图片。layout代码这里就不展示,我们直接看点击后的事件处理。

    	/**
    	 * 打开本地图片
    	 */
    	private void openLocalImage() {
    		// 打开手机中的相册
    		Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT); 
    		innerIntent.setType("image/*");
    		Intent wrapperIntent = Intent.createChooser(innerIntent, "选择二维码图片");
    		this.startActivityForResult(wrapperIntent, 0x01);
    	}
    

    打开系统图片库后选择图片,这时需要重写onActivityResult方法用于返回图片信息。

    	@Override
    	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    		super.onActivityResult(requestCode, resultCode, data);
    		if (resultCode == RESULT_OK) {
    			switch (requestCode) {
    			case 0x01:
    				// 获取选中图片的路径
    				Cursor cursor = getContentResolver().query(data.getData(),
    						null, null, null, null);
    				if (cursor.moveToFirst()) {
    					photo_path = cursor.getString(cursor
    							.getColumnIndex(MediaStore.Images.Media.DATA));
    				}
    				cursor.close();
    
    				new Thread(new Runnable() {
    					@Override
    					public void run() {
    						Result result = scanningImage(photo_path);
    						if (result != null) {
    							handleDecode(result, new Bundle());
    						}
    					}
    				}).start();
    
    				break;
    
    			}
    		}
    	}
    

    获取图片路径photo_path后,调用scanningImage方法进行扫描,zxing源码中,扫描到的结果都是存放在Result这个结果集中。获取到Result后,就进行结果的回传,阅读CaptureActivity源码,可以得知最后Result结果集会传递给handleDecode方法。

    	/**
    	 * A valid barcode has been found, so give an indication of success and show
    	 * the results.
    	 * 
    	 * @param rawResult
    	 *            The contents of the barcode.
    	 * @param bundle
    	 *            The extras
    	 */
    	public void handleDecode(Result rawResult, Bundle bundle) {
    		inactivityTimer.onActivity();
    		beepManager.playBeepSoundAndVibrate();
    
    		Intent resultIntent = new Intent();
    		bundle.putInt("width", mCropRect.width());
    		bundle.putInt("height", mCropRect.height());
    		bundle.putString("result", rawResult.getText());
    		resultIntent.putExtras(bundle);
    		this.setResult(RESULT_OK, resultIntent);
    		CaptureActivity.this.finish();
    	}
    

    获取到图片路径后需要将其二维码信息包装成Result对象,因此需要解析图片:

    	/**
    	 * 扫描二维码图片的方法
    	 * 
    	 * @param path
    	 * @return
    	 */
    	public Result scanningImage(String path) {
    		if (TextUtils.isEmpty(path)) {
    			return null;
    		}
    		Hashtable<DecodeHintType, String> hints = new Hashtable<DecodeHintType, String>();
    		hints.put(DecodeHintType.CHARACTER_SET, "UTF8"); // 设置二维码内容的编码
    
    		BitmapFactory.Options options = new BitmapFactory.Options();
    		options.inJustDecodeBounds = true; // 先获取原大小
    		scanBitmap = BitmapFactory.decodeFile(path, options);
    		options.inJustDecodeBounds = false; // 获取新的大小
    		int sampleSize = (int) (options.outHeight / (float) 200);
    		if (sampleSize <= 0)
    			sampleSize = 1;
    		options.inSampleSize = sampleSize;
    		scanBitmap = BitmapFactory.decodeFile(path, options);
    		int width = scanBitmap.getWidth();
    		int height = scanBitmap.getHeight();
    		int[] pixels = new int[width * height];
    		scanBitmap.getPixels(pixels, 0, width, 0, 0, width, height);
    		/**
    		 * 第三个参数是图片的像素
    		 */
    		RGBLuminanceSource source = new RGBLuminanceSource(width, height,
    				pixels);
    		BinaryBitmap bitmap1 = new BinaryBitmap(new HybridBinarizer(source));
    		QRCodeReader reader = new QRCodeReader();
    		try {
    			return reader.decode(bitmap1, hints);
    
    		} catch (NotFoundException e) {
    			e.printStackTrace();
    		} catch (ChecksumException e) {
    			e.printStackTrace();
    		} catch (FormatException e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    

    根据路径获取Bitmap,最后通过QRCodeReader 中的decode方法解析成Result对象并返回,最终传递给handleDecode方法。

    运行程序效果如下:

    这里写图片描述

    最后扫描出来的是之前定义的百度地址。

    ##权限与Activity

    当二维码的生成与扫描完成后,别忘了权限:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.zxingtest"
        android:versionCode="1"
        android:versionName="1.0" >
        
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
        
        <uses-permission android:name="android.permission.CAMERA"/>
        <uses-permission android:name="android.permission.VIBRATE"/>
    
        <uses-sdk
            android:minSdkVersion="15"
            android:targetSdkVersion="17" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name=".MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity android:name="com.example.zxingtest.zxing.activity.CaptureActivity"></activity>
        </application>
    
    </manifest>
    
    

    以下是完整的github项目地址
    github项目源码地址:点击【项目源码】

    展开全文
  • 基于Android studio开发Zxing,实现了二维码生成了读取.在移植代码时注意查看readme.doc 文件,修改相关配置文件.
  • Android二维码生成与扫描(生成带个性图片) 以前的例子现在用上了,现在需求嵌入logo图片,在以前那个domo上加了几句代码. 嵌入logo的像素建议不要太大,如果想要logo大点,相应的二维码生成的大小也要变大,否则生成的...
  • Android studio 生成二维码与扫描二维码点击libzing下载地址MainActivityimport android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.support.v7.app....

    Android studio 生成二维码与扫描二维码

    点击libzing下载地址

    MainActivity

    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.CheckBox;
    import android.widget.EditText;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    import com.xys.libzxing.zxing.activity.CaptureActivity;
    import com.xys.libzxing.zxing.encoding.EncodingUtils;
    
    public class MainActivity extends AppCompatActivity {
    
        private TextView mTv_Ruslet;
        private EditText mInput;
        private ImageView mImg;
        private CheckBox isLogo;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mTv_Ruslet= (TextView) findViewById(R.id.tv_ruselt);
            mInput= (EditText) findViewById(R.id.et_text);
            mImg= (ImageView) findViewById(R.id.img);
            isLogo= (CheckBox) findViewById(R.id.is_logo);
        }
    
        /**
         *生成二维码
         */
        public void make(View view){
            String input=mInput.getText().toString().trim();
            //生成二维码,然后为二维码增加logo
            Bitmap bitmap= EncodingUtils.createQRCode(input,500,500,
                    isLogo.isChecked()? BitmapFactory.decodeResource(getResources(),
                            R.mipmap.ic_launcher):null
            );
            mImg.setImageBitmap(bitmap);
        }
    
        /**
         *  扫描二维码
         */
        public void scan(View view){
            startActivityForResult(new Intent(MainActivity.this, CaptureActivity.class),0);
    
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            //Log.i("TAG","resultCode: "+resultCode+" result_ok: "+RESULT_OK);
            if (resultCode==RESULT_OK){
                Bundle bundle=data.getExtras();
                String result= bundle.getString("result");
                mTv_Ruslet.setText(result);
            } if(resultCode == RESULT_CANCELED) {
                mTv_Ruslet.setText("扫描出错");
            }
        }
    }
    

    布局代码

    xml文件

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:orientation="vertical"
        tools:context="com.bwie.test.wuxiaoruierweima.MainActivity">
    
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="start scan"
            android:onClick="scan"/>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Ruselt"
            android:textSize="26sp"/>
    
        <TextView
            android:id="@+id/tv_ruselt"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="26sp"/>
        <EditText
            android:id="@+id/et_text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="make"
            android:text="make QRCode"/>
        <CheckBox
            android:id="@+id/is_logo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="check"/>
        <ImageView
            android:id="@+id/img"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/ic_launcher"
            android:layout_gravity="center"/>
    </LinearLayout>
    展开全文
  • 那么今天我们就来看看怎么样在我们自己的App中集成二维码扫描与生成功能。OK,废话不多说,我们就开始做吧。二维码的使用我主要想分为两部分来给大家介绍,一部分就是二维码生成,这里的知识点都很简单,还有一...

    二维码,我们也称作QRCode,QR表示quick response即快速响应,在很多App中我们都能见到二维码的身影,最常见的莫过于微信了。那么今天我们就来看看怎么样在我们自己的App中集成二维码的扫描与生成功能。OK,废话不多说,我们就开始做吧。

    二维码的使用我主要想分为两部分来给大家介绍,一部分就是二维码的生成,这里的知识点都很简单,还有一部分是二维码的识别,这里稍微麻烦一些,不过细心来做其实也很简单。二维码的开发使用我们大多都是使用Google提供的zxing这个类库,使用这个类库我们需要先下载核心jar包,下载地址,如果我们只想生成二维码那么这个就够了,但是如果我们还想做二维码的识别,那么我们需要在刚才的基础上继续添加GitHub上的开源项目,这个我们在后面再说。

    1.二维码的生成

    先来看一张效果图:


    1.1  准备工作

    如果我们只做二维码的生成,那么只需要添加核心jar包即可,如下:


    1.2  二维码生成

    OK,添加完jar包之后我们就可以开始写二维码生成代码了,二维码本身就是一张Bitmap图片,所以我们这里主要就是看怎么样来生成这张图片,我在主界面添加一个按钮和一个ImageView,当点击按钮时生成一张二维码图片显示在ImageView上。布局如下:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="org.mobiletrain.qrwriter.MainActivity">
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="generate"
            android:text="生成二维码"/>
    
        <ImageView
            android:id="@+id/iv"
            android:layout_width="256dp"
            android:layout_height="256dp"
            android:layout_centerInParent="true"/>
    </RelativeLayout>

    当我点击按钮时生成二维码图片,那我们就来看看生成二维码图片的核心代码:

        private Bitmap generateBitmap(String content,int width, int height) {
            QRCodeWriter qrCodeWriter = new QRCodeWriter();
            Map<EncodeHintType, String> hints = new HashMap<>();
            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
            try {
                BitMatrix encode = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, width, height, hints);
                int[] pixels = new int[width * height];
                for (int i = 0; i < height; i++) {
                    for (int j = 0; j < width; j++) {
                        if (encode.get(j, i)) {
                            pixels[i * width + j] = 0x00000000;
                        } else {
                            pixels[i * width + j] = 0xffffffff;
                        }
                    }
                }
                return Bitmap.createBitmap(pixels, 0, width, width, height, Bitmap.Config.RGB_565);
            } catch (WriterException e) {
                e.printStackTrace();
            }
            return null;
        }

    首先这个方法接收三个参数,这三个参数分别表示生成二维码的文本内容(你要把哪一个文本用二维码图片表示出来),第二个和第三个参数分别表示生成的二维码图片的宽和高。在这里,我们首先要获得一个QRCodeWriter实例,该实例中有一个方法叫做encode,通过该方法对文本内容进行编码,该方法共有五个参数,第一个参数表示生成二维码的文本内容,第二个参数表示编码格式,第三个参数表示生成的二维码的宽度,第四个参数表示生成的二维码的高度,第五个参数可选,可以用来设置文本的编码,encode方法的返回值是一个BitMatrix,你可以把BitMatrix理解成一个二维数组,这个二维数组的每一个元素都表示一个像素点是否有数据。OK,接下来我们需要定义一个int数组用来存放Bitmap中所有像素点的颜色,可是我们又怎么知道每一个像素点是什么颜色呢?这个时候就需要我们遍历BitMatrix了,如果BitMatrix上的点表示 该点有数据,那么对应在Bitmap上的像素点就是黑色,否则就是白色。BitMatrix中的get方法的返回值为一个boolean类型,true表示该点有数据,false表示该点没有数据。通过两个嵌套的for循环将BitMatrix遍历一遍,然后给pixels数组都赋上值,OK,pixels数组有值之后,接下来调用Bitmap的createBitmap方法创建一个Bitmap出来就可以了,createBitmap方法共接收6个参数,第一个参数表示Bitmap中所有像素点的颜色,第二个参数表示像素点的偏移量,第三个参数表示Bitmap每行有多少个像素点,第四个参数表示生成的Bitmap的宽度,第五个参数表示生成的Bitmap的高度,第六个参数表示生成的Bitmap的色彩模式,因为二维码只有黑白两种颜色,所以我们可以不用考虑透明度,直接使用RGB_565即可。OK,这样的话我们就获取到了二维码的图片了,最后我们再来看看点击事件:

        public void generate(View view) {
            Bitmap qrBitmap = generateBitmap("http://www.csdn.net",400, 400);
            iv.setImageBitmap(qrBitmap);
        }

    效果图如下:


    1.3  给二维码中心添加Logo

    OK,如果你没有特殊的需求那么这样就OK了,但是我们见到的大多数二维码的正中心都有一个Logo,那么这个效果要怎么实现呢?这里就是图片绘制的内容了,我封装了一个方法专门来解决这个问题,代码如下:

        private Bitmap addLogo(Bitmap qrBitmap, Bitmap logoBitmap) {
            int qrBitmapWidth = qrBitmap.getWidth();
            int qrBitmapHeight = qrBitmap.getHeight();
            int logoBitmapWidth = logoBitmap.getWidth();
            int logoBitmapHeight = logoBitmap.getHeight();
            Bitmap blankBitmap = Bitmap.createBitmap(qrBitmapWidth, qrBitmapHeight, Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(blankBitmap);
            canvas.drawBitmap(qrBitmap, 0, 0, null);
            canvas.save(Canvas.ALL_SAVE_FLAG);
            float scaleSize = 1.0f;
            while ((logoBitmapWidth / scaleSize) > (qrBitmapWidth / 5) || (logoBitmapHeight / scaleSize) > (qrBitmapHeight / 5)) {
                scaleSize *= 2;
            }
            float sx = 1.0f / scaleSize;
            canvas.scale(sx, sx, qrBitmapWidth / 2, qrBitmapHeight / 2);
            canvas.drawBitmap(logoBitmap, (qrBitmapWidth - logoBitmapWidth) / 2, (qrBitmapHeight - logoBitmapHeight) / 2, null);
            canvas.restore();
            return blankBitmap;
        }

    addLogo这个方法接收两个参数,第一个参数就是我们在1.2节中生成的二维码的Bitmap图片,第二个参数就是我们的logo图片,在该方法中我先获取到两张Bitmap各自的宽高,然后创建一个新的空白的Bitmap,这个新的空白的Bitmap的宽高和二维码的宽高一致,然后创建一个Canvas对象,创建Canvas对象的时候将blankBitmap传入,这样我一会绘制的东西相当于都是绘制在了blankBitmap上了。canvas的drawBitmap方法接收四个参数,第一个是你要绘制的Bitmap对象,第二个和第三个是你要绘制的Bitmap的左上角的坐标,第四个参数是一个画笔,一般情况下我们给一个null就可以了,如果你要设置重复模式等等效果的时候可以不给null。我们使用drawBitmap方法先将原本的二维码图片绘制出来,绘制完成之后,调用canvas的save方法,将当前的绘制状态保存下来,然后对画布进行缩放,缩小画布之后我们来绘制Logo,一帮情况下logo的宽高为二维码原图宽高的1/5(中心logo图片不宜过大,否则会影响到二维码的识别),所以我们先通过一个while循环获得缩放比例,然后调用canvas的scale方法对画布进行缩放,前两个参数表示宽高的缩放比例,大于1表示放大,小于1表示缩小,后两个参数表示缩放的中心点。缩放完成之后我们就可以绘制logo了,logo绘制完成之后,调用canvas的restore方法将画布恢复为原来的状态,最后将blankBitmap返回。在点击事件中调用这个方法即可,代码如下:

        public void generate(View view) {
            Bitmap qrBitmap = generateBitmap("http://www.csdn.net",400, 400);
            Bitmap logoBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
            Bitmap bitmap = addLogo(qrBitmap, logoBitmap);
            iv.setImageBitmap(bitmap);
        }

    效果图如下:

    OK,至此,我们的二维码生成就说完了,就是这么简单。

    2.二维码的识别

    二维码的识别是一个稍微麻烦的事情,一般情况下,我们直接使用GitHub上的开源项目zxing即可,这个项目就是在我们之前的那个核心包的基础上完成的(下载地址)。当然,如果你需要自己定义相关的页面等等也都可以,这个我们到后面再说。这里我们先来看看怎么把GitHub上的开源项目引入到我们的项目中来。

    导入工程我们主要分为如下几个步骤:

    1.创建一个新的Project,命名为QRReader(这一步不是必须的,可以根据你的项目需求来)

    2.下载ZXing项目

    3.在新的Project中创建一个新的Module,在创建的过程中选择Android Library,如下图:

    4.在文件夹中打开我们的项目,找到第三步创建的Library,将第二步下载的ZXing项目中的android和android-core两个文件夹合并到library中,如下图:


    其中android文件夹中主要合并如下几个项目文件:

    合并完成之后再将我们之前下载的核心jar包夜拷贝到我们library的libs文件夹中,然后我们再来看看我们的library:

    5.在我们的项目中引用这个module,然后对项目进行编译。

    6.编译之后项目会报错,这个时候需要我们将library中所有的switch语句改为if...else if ...else if的形式。

    7.完成第6步之后还是会报错,这个时候需要我们将library的清单文件中Application节点的icon属性删除,再编译就没有任何问题了。

    OK,经过上面7个步骤这个开源项目就被我们成功的引入到我们自己的项目中了,在这个开源项目中有一个CaptureActivity,这个Activity专门用来扫描二维码,所以我们只需要在自己的项目中直接来启动这个Activity就可以了,另外,由于默认情况下CaptureActivity是启动项,所以我们要在library的清单文件中删除CaptureActivity作为启动项的配置。

    OK,现在我的项目中有一个按钮,点击这个按钮我就可以扫描二维码,代码如下:

        public void go(View view) {
            startActivity(new Intent(this, CaptureActivity.class));
        }

    OK,至此,一个简陋的二维码扫描就完成了,大家有木有觉得很麻烦啊?麻烦也就这一次,因为我把ZXing当作library使用的时候系统会自动生成一个aar包,有了这个aar包,以后的开发就会变得非常简单了,那么这个aar包在哪里呢?如下图:

    对应的文件夹路径大家自己去找,有了这个aar包之后,如果我再需要使用二维码扫描功能的时候就只需要如下几个简单的步骤:

    1.创建项目

    2.创建Module,在创建Module时选择Import .JAR/.AAR Package,然后选择刚刚的aar包

    3.在我的app中引用这个Module即可。



    最后,我将我自己生成的aar包提供给大家,可以直接在项目中使用,非常方便,不过建议还是大家自己尝试生成一个aar包,整个过程还是非常有意思。


    zxinglibrary-release.aar下载


    以上。


    展开全文
  • 1.添加依赖 先在 build.gradle(Project:XXXX) 的 repositories 添加: allprojects { repositories { google() jcenter() maven { url 'https://jitpack.io' } ...然后在 build.gradle(Mod...
  • Zxing使用 从底部gitHub项目下载地址下载项目完后,可以看到整体代码结构如下: 我们只需将zxing包下的所有代码copy一份到我们的项目中去,除了这写代码以外,还需要zxing的jar包,也从项目中直接copy一份 ...
  • QRcode二维码生成与扫描器(实现本地存储),加入欢迎页动画,和存储到本地
  • 实验项目需要二维码,在网上查了许多资料都讲的模糊不清,可能是第一次接触,各种bug,经过一番折腾终于自己捣鼓出来了。主要步骤如下:1.创建Android Studio工程项目,本文项目见:链接:...
  • Android 二维码生成扫描 生成二维码可带 LOGO。
  • 先在androidstudio上导入libzing的Module,然后再app上把那个libzing添加上去,这样我们的app就关联了那个libzing库了 然后我们就只在app这个工程下写代码就行了。activity_main.xml布局如下 xml version=...
  • 本文采用ZXing三方框架实现扫描二维码生成二维码的功能,具体实现参考转载博文
  • Android:简单粗暴的二维码生成与扫描 之前写项目的时候有需求要生成和扫描二维码,我想弄的简单点,在网上找了好久终于在一个大佬的博客里找到了我所期待的简单粗暴,在这里记录一下。 在app目录下的build.gradle...
  • android端快速即成微信扫一扫功能,并且根据自己的需求快速生成二维码
  • android二维码生成器 艺术二维码先看图 可生成圆点二维码,随机大小的圆点二维码,液化二维码,多边形二维码,多角形二维码,图像二维码,自定义的CaptureManager可以更加便捷的编写二维码扫描界面 解决...
  • 前面说过两种二维码扫描方式,现在说二维码生成,使用Google开源库Zxing,项目地址:https://github.com/ZBar/ZBar,我们只需要里面的jar包:core:x.x.x.jar,建议用core:3.3.0。 1.引入jar包 app build....
  • zxing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的接口;可以实现使用手机的内置的摄像头完成条形码和二维码扫描与解码;也可以实现条形码和二维码的编码解码。
  • android studio上使用zxing-android-embedded实现二维码生成扫描
1 2 3 4 5 ... 20
收藏数 7,703
精华内容 3,081
关键字:

二维码生成与扫描android