天天看点

扫一扫——Zxing彩蛋!!

有些代码不应该被忘记,也没有源代码不应该被记住(来自csdn首页)

在我们平常生活中,我们经常会使用到扫一扫这一手机功能

比如:

使用支付宝或微信的扫一扫功能想别人付钱;

使用微信的扫一扫功能加别人为好友或关注某一公众号;

使用摩拜单车的扫一扫功能解锁自行车;

使用UC浏览器的扫一扫功能打开某个网页;

我们发现,我们离不开手机的扫一扫这一功能了!

那么,这篇文章我们就一起通过一个例子学习一下Android的解析二维码 和生成二维码 是如何实现的!

1.Zxing

其实,我们自己实现扫一扫的功能是相当麻烦的

但是大神们早就做出了一个性能不错的集成库——Zxing

Zxing是一个开放源码的,用Java实现的多种格式的1D、2D条码图像处理库

它包含了联系到其他语言的端口,也就是说它可以在不同的语言中,其中就包括Android

Zxing可以实现使用手机内置的摄像头完成条形码的扫描及解码

也就是说,我们只需要调用Zxing封装好的方法就可以完成一系列诸如打开摄像头、解析二维码、生成二维码的操作了

这里我们提供一下Zxing官方的GitHub项目地址:

https://github.com/zxing/zxing

我们将Zxing 在GitHub 上的项目下载下来

其实在我们下载的压缩包里,是有多种语言的一个整合的代码

但是,我们这里只需要Android端的源码

怎么办呢,其实,我们网上的资源是相当丰富的

有一些技术大神为我们提取出来android端使用的代码

我把它上传到了我的百度云盘当中,点击下载,密码:f3wx

2.将Zxing导入到项目中

首先我们将刚才下载的libzxing解压后备用

然后我们在AS中新建项目QRCodeDemo

这里我们要注意,在我们新建项目时一定要选择MinimunSDK 版本为16,如图:

扫一扫——Zxing彩蛋!!

因为我们的zxing支持的4.1及4.1以上的安卓版本

好,项目新建完成,接下来我们就要导入libzxing了

1.点击File ——>New ——>Import Module

2.在弹出的下图中的对话框中点击”…”按钮,选择libzxing文件夹,点击Finish

扫一扫——Zxing彩蛋!!

3.依次点击下图中的按钮

扫一扫——Zxing彩蛋!!

4.点击“+”后选择Module dependency,然后选择libzxing,点击OK就导入完成了!

3.查看学习libzxing中的代码

下面我们看一下Xzing中的代码,以便我们更灵活的使用它

首先我们找到并打开CaptureActivity的代码

其实我们CaptureActivity就是我们扫描界面的Activity

我们在具体实现扫一扫功能的时候,只需要打开CaptureActivity,然后将扫描结果拿到就可以了

我们可以在CaptureActivity中找到以下代码:

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();
}
           

我们可以看到handleDecode方法会通过Intent返回一个键为result的结果

其实这就是我们扫描二维码之后需要拿到的结果

在实际操作中我们就可以通过result键拿到数据

然后我们看一下libzxing的AndroidManifest文件,我们可以看到以下权限:

其实,这样个权限就是相机和震动的权限,也就是说我们在自己的代码中中也不需要声明任何权限,是不是很方便

我们在找到并打开EncodingUtils文件

从注释中我们可以看到,这是一个二维码生成工具类

我们在实现生成二维码的时候,只需要调用这个工具类中的方法就可以了!

好,下面我们具体实现学一下功能!

4.解析二维码

首先,我们配置一下MainActivity的xml文件,代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
tools:context="win.yuanhongbao.www.qrcodedemo.MainActivity">

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:onClick="scan"
    android:text="Start Scan" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Result :"
    android:textSize="28sp" />

<TextView
    android:id="@+id/tv_result"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="28sp" />
</LinearLayout>
           

这里我们简单定义了一个开始扫描的Button,并为其添加了一个onClick属性,一个显示结果的TextView

然后我们实例化一下显示结果的TextView,代码如下:

private TextView mTvResult;

mTvResult = (TextView) findViewById(R.id.tv_result);
           

好,下面我们就要实现一下开始扫描的点击事件,代码如下:

public void scan(View view) {
    startActivityForResult(new Intent(MainActivity.this, CaptureActivity.class), 0);
}
           

这里我们使用了一个startActivityForResult方法,打开CaptureActivity

为什么要使用startActivityForResult方法而不是直接startActivity呢

很简单,是因为我们是需要拿到CaptureActivity返回的结果的

然后我们需要调用一个

onActivityResult

方法来接返回的结果,代码如下:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        Bundle bundle = data.getExtras();
        String str_result = bundle.getString("result");
        mTvResult.setText(str_result);
    }
}
           

从代码中我们可以看到我们进行了一个判断,当结果解析成功后,我们通过result键,获取到了结果,并将值赋给了显示结果的TextView,很简单吧

接下来我们运行程序,点击Start Scan:

扫一扫——Zxing彩蛋!!

扫描界面成功打开!

这里我们可以使用“草料文本二维码生成器”制作二维码后扫描试一下!

成功了没有?反正我是成功了!

如果点击Start Scan提示Camera error时,说明你的系统是android6.0以上,这里需要打开手机的权限管理,手动打开权限!

好,这样我们的解析二维码就讲解完了,接下来我们一起学习一下生成二维码!

5.生成二维码

首先,我们先配置一下MainActivity的xml文件,添加一下代码:

<EditText
    android:id="@+id/et_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="Input" />

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:onClick="make"
    android:text="Make QRCode" />

<CheckBox
    android:id="@+id/cb_logo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="logo"/>

<ImageView
    android:id="@+id/img_result"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:background="@mipmap/ic_launcher" />
           

这里我们定义了一个EditText,用来获取用户输入的文字,根据文字生成相应的二维码

我们还定义了一个开始生成的Button,并为其添加了点击事件

定义了一个CheckBox用来选择是否为二维码添加logo

定义了一个ImageView用来显示二维码

然后,我们实例化一下控件:

rivate EditText mInput;
private ImageView mImgResult;
private CheckBox mCbLogo;

mInput = (EditText) findViewById(R.id.et_text);
mImgResult = (ImageView) findViewById(R.id.img_result);
mCbLogo = (CheckBox) findViewById(R.id.cb_logo);
           

然后,我们就可以实现一下Button的点击事件,代码如下:

public void make(View view) {
    String str_input = mInput.getText().toString();
    if (str_input.equals("")) {
        Toast.makeText(MainActivity.this, "输入不能为空", Toast.LENGTH_SHORT).show();
    } else {
        Bitmap bitmap = EncodingUtils.createQRCode(str_input, 500, 500,
                mCbLogo.isChecked() ? BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher) : null);//三目表达式
        mImgResult.setImageBitmap(bitmap);
    }
}
           

首先,我们先获取了一下用户输入的文字

然后,我们进行了一个判断,如果输入为空,我们就提示用户输入文字

如果不为空,我们就执行生成二维码的操作

在生成二维码的操作中,我们使用一个Bitmap对象来接收二维码生成工具类生成的二维码

我们可以看到EncodingUtils类的createQRCode方法有四个参数:

1.第一个参数:二维码对应的扫描结果;

2.第二、三个参数:二维码的宽高;

3.第三个参数:二维码的logo

在第三个参数中,我们使用了一个三目表达式

当checkbox选中的时候,我们就把ic_launcher这个图片作为二维码的logo,如果没有选中,我们就将logo设为null

好,这样我们的生成二维码的功能就完成了,我们运行

在输入框中输入Hello_Word,分别选中和不选中checkbox,点击Make QRCode,显示如下:

扫一扫——Zxing彩蛋!!

是不是很简单!

到此,我们对二维码的解析和生成功能就学习完成了!

彩蛋!!

看到这里的朋友你有福利了!我的个人微信公众号上线了!众多热门技术文章,众多有趣好玩的脑洞,请扫描下方二维码关注!

扫一扫——Zxing彩蛋!!

程序猿干货分享,欢迎您的到来!

继续阅读