<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">本文主要讲关于安卓的二维码的使用:扫描二维码,生成简单的二维码</span>
进入正题:二维码扫描需要一个相关的框架,谷歌官方提供了一个很好的框架: ZXing 框架,用起来也比较简单便捷
平台:android studio,首先是添加依赖,两种方式,直接在依赖中的搜索ZXing选择goodle 框架
或者可以选择 lib 添加依赖这里自己在 github 上找到一个库(可到https://github.com/yzbbanban查看相关项目,关于二维码的),这里就直接引入 lib 库,引入方式,现将 lib 导入 android 项目中
然后是添加依赖
这是添加之后的结果
代码部分就很简单了,布局文件就用一个 Button+TextView,TextView 用于显示扫描之后的结果
布局代码:
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:onClick="scan"
android:layout_height="wrap_content"
android:text="扫描" />
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:textColor="@color/colorAccent"
android:textSize="24sp" />
Button 加入 onClick 事件
public void scan(View view) {
startActivityForResult(new Intent(MainActivity.this, CaptureActivity.class), 0);
}
直接启动扫描二维码相关的的CaptureActivity,也不需要在注册文件中加入权限(库中已加入相机权限),只需要直接调用即可,并且我们扫描之后需要获取返回值,所以需要 startActivityForResult 获取一个返回值
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
Bundle bundle = data.getExtras();
String text = bundle.getString("result");
Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
tv.setText(text);
}
}
获取返回值呈现相关数据,其中 resultCode 中获取的参数为 lib 中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();
}
即获取的的值是一个 bundle,我们就需要在 onActivityResult 中利用 bundle 回去相关参数
这样就完成了一个简单的扫描二维码的程序,可将二维码回去的结果生成一个字符串
线面介绍一下由文字生成二维码的代码:同样也是利用框架中的方法,稍微解释下就行
布局代码:
<EditText
android:id="@+id/et"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btn_make"
android:text="生成二维码"
android:onClick="make"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<ImageView
android:id="@+id/iv"
android:src="@mipmap/my_logo"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
一个输入框,一个生成按钮,一个现实图片(Linnerlayout 布局)
方法很简单,获取输入框的数据,然后调用 EncodingUtils 中的creatorCode()方法,参数依次为:输入的内容,图片宽度,图片高度,logo 的图片(Bitmap)
public void make(View view) {
String intput = et.getText().toString().trim();
if ("".equals(intput)) {
Toast.makeText(this, "输入不为空", Toast.LENGTH_SHORT).show();
} else {
Bitmap b = EncodingUtils.createQRCode(intput, 500, 500, logo);
iv.setImageBitmap(b
);
}
}
然后就是主要代码的完整代码:
package com.wangban.yzbbanban.myapplication;
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.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.xys.libzxing.zxing.activity.CaptureActivity;
import com.xys.libzxing.zxing.encoding.EncodingUtils;
public class MainActivity extends AppCompatActivity {
private TextView tv;
private EditText et;
private ImageView iv;
private Bitmap logo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
et = (EditText) findViewById(R.id.et);
iv = (ImageView) findViewById(R.id.iv);
logo = BitmapFactory.decodeResource(getResources(), R.mipmap.my_logo);
}
public void scan(View view) {
startActivityForResult(new Intent(MainActivity.this, CaptureActivity.class), 0);
}
public void make(View view) {
String intput = et.getText().toString().trim();
if ("".equals(intput)) {
Toast.makeText(this, "输入不为空", Toast.LENGTH_SHORT).show();
} else {
Bitmap b = EncodingUtils.createQRCode(intput, 500, 500, logo);
iv.setImageBitmap(b
);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
Bundle bundle = data.getExtras();
String text = bundle.getString("result");
Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
tv.setText(text);
}
}
}