二维码的生成与扫描

本文介绍了二维码的基本概念及其相对于条形码的优势,并详细讲解了如何使用Zxing库在Android平台上进行二维码的扫描、解析及生成。

二维码:
是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的;
在代码编制上巧妙的利用构成计算机内部逻辑基础的0和1比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图像输入设备或光电扫描设备自动识读以实现信息自动处理;
二维码能够在横向和纵向两个方位同时表达信息,因此能在很小的面积内表达大量的信息;
二维码相对于条形码的优势就是省空间;

zxing简介:
zxing是一个开放源码的,用java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的接口。
zxing可以实现使用手机的内置的摄像头完成条形码和二维码的扫描与解码。
zxing可以实现条形码和二维码的编码与解码。
zxing目前支持的的格式如下:
UPC-A,UPC-E
EAN-8,EAN-13
39码
93码
代码128
QR码

Android上zxing的使用:
这里使用的时候可以有两种形式:
1.将zxing的jar包放到工程的lib库中,然后还要拷贝相应的类源码到工程中去,整个文件夹拷贝过去也是很快的;
2.将已经弄好zxing的工程作为当前工程的依赖库,然后直接使用就可以了;

    <Button
        android:text="默认页面扫描"
        android:onClick="defaultScan"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />



    <Button
        android:text="选择图片解析"
        android:onClick="picScan"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:text="生成"
        android:onClick="shengCheng"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
public class MainActivity extends AppCompatActivity {

    private static final int REQUEST_CODE = 1001;
    private static final int REQUEST_IMAGE = 1002;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    /**
     *
     * @param view
     */
    public void defaultScan(View view) {
        //调用的是zxing自带的扫描页面
        Intent intent = new Intent(getApplication(), CaptureActivity.class);
        startActivityForResult(intent, REQUEST_CODE);
    }

    /**
     * 图片的解析
     * @param view
     */
    public void picScan(View view) {

        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_PICK);
        intent.setType("image/*");
        startActivityForResult(intent, REQUEST_IMAGE);
    }

    /**
     * 生成二维码
     * @param view
     */
    public void shengCheng(View view) {
        Intent intent = new Intent(this,ShengChengActivity.class);
        startActivity(intent);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == REQUEST_CODE) {
            //处理扫描结果(在界面上显示)
            if (null != data) {
                //拿到传递回来的数据
                Bundle bundle = data.getExtras();
                if (bundle == null) {
                    return;
                }

                if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS) {
                    //解析得到的结果
                    String result = bundle.getString(CodeUtils.RESULT_STRING);
                    Toast.makeText(this, "解析结果:" + result, Toast.LENGTH_LONG).show();
                } else if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED) {
                    Toast.makeText(MainActivity.this, "解析二维码失败", Toast.LENGTH_LONG).show();
                }
            }
        }else if (requestCode == REQUEST_IMAGE){
            //取回选中的那种图片uri路径
            Uri uri = data.getData();

            try {
                //解析图片的方法...ImageUtil.getImageAbsolutePath(this, uri)通过uri路径得到图片在手机中的绝对路径
                CodeUtils.analyzeBitmap(ImageUtil.getImageAbsolutePath(this, uri), new CodeUtils.AnalyzeCallback() {
                    //Bitmap mBitmap 解析的那张图片, String result解析的结果
                    @Override
                    public void onAnalyzeSuccess(Bitmap mBitmap, String result) {
                        Toast.makeText(MainActivity.this, "解析结果:" + result, Toast.LENGTH_LONG).show();
                    }

                    @Override
                    public void onAnalyzeFailed() {
                        Toast.makeText(MainActivity.this, "解析二维码失败", Toast.LENGTH_LONG).show();
                    }
                });
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }
}
生成二维码
public class ShengChengActivity extends AppCompatActivity {

    private EditText editText;
    private ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sheng_cheng);

        editText = findViewById(R.id.edit_text_01);
        imageView = findViewById(R.id.image_view);

    }

    /**
     * 普通的
     * @param view
     */
    public void normal(View view) {
        String s = editText.getText().toString();
        if (s==""){
            return;
        }

        Bitmap bitmap = CodeUtils.createImage(s, 300, 300, null);
        imageView.setImageBitmap(bitmap);
    }

    public void logoQR(View view) {

        String s = editText.getText().toString();
        if (s==""){
            return;
        }
        //logo
        Bitmap bitmap = CodeUtils.createImage(s, 300, 300, BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher));
        imageView.setImageBitmap(bitmap);

    }
}
在写完上面的代码后还要初始化一下,如果不初始化的话那就使用不了
public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        //初始化zxing库
        ZXingLibrary.initDisplayOpinion(this);
    }
}
这就是二维码的初始化
写完二维码还要调用权限
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />

    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />

    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值