在Android项目中,会有自己生成二维码的需求,其实实现这样的需求很简单,今天我来给大家分享一下Android Zxing二维码的生成与使用。
准备工作:
首先导入以下依赖:
implementation ‘cn.yipianfengye.android:zxing-library:2.2’
然后在清单文件中加入以下权限:
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.HARDWARE_TEST"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.FLASHLIGHT"/>
最后在项目自定义的Application类(需继承Application类)中进行初始化,准备工作完成。
ZXingLibrary.initDisplayOpinion(this);
开始使用:
对于这个框架的使用,我们主要分两部分,第一是如何扫描二维码并获取扫描结果;第二是如何生成一个二维码,下面我将对这两种情况的使用进行逐一分析:
1. 如何扫描二维码并获取扫描结果
首先,我们可以使用以下代码来调用框架内提供的二维码扫描界面:
Intent intent = new Intent(MainActivity.this, CaptureActivity.class);
startActivityForResult(intent,REQUEST_CODE);
然后在当前Activity中处理返回数据(重写onActivityResult方法):
if (requestCode == REQUEST_CODE && data != null) {
//获取二维码解析结果的对象
Bundle bundle = data.getExtras();
if (bundle != null) {
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();
}
}
}
注:以上处理方式仅供参考,具体可根据自己需求来定制自己的处理方式。
上面的方式,是直接扫描一张纸质的二维码图片,通过扫描该图片获取的二维码信息,那如果是手机相册内存储的图片呢,我们也可以实现这个需求,具体操作如下:
第一步:先导入UriTofilePath工具类,该类的代码如下:
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
public class UriTofilePath {
public static String getFilePathByUri(Context context, Uri uri) {
String path = null;
// 4.4及之后的 是以 content:// 开头的,比如 content://com.android.providers.media.documents/document/image%3A235700
if (ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())
&& Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (DocumentsContract.isDocumentUri(context, uri)) {
if (isExternalStorageDocument(uri)) {
// ExternalStorageProvider
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("primary".equalsIgnoreCase(type)) {
path = Environment.getExternalStorageDirectory() + "/" + split[1];
return path;
}
} else if (isDownloadsDocument(uri)) {
final String id = DocumentsContract.getDocumentId(uri);
if (id.startsWith("raw:")) {
return id.replaceFirst("raw:", "");
}
final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),
Long.valueOf(id));
path = getDataColumn(context, contentUri, null, null);
return path;
} else if (isMediaDocument(uri)) {
// MediaProvider
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
final String selection = "_id=?";
final String[] selectionArgs = new String[]{split[1]};
path = getDataColumn(context, contentUri, selection, selectionArgs);
return path;
}
}
}else {
// 以 file:// 开头的
if (ContentResolver.SCHEME_FILE.equals(uri.getScheme())) {
path = uri.getPath();
return path;
}
// 以 content:// 开头的,比如 content://media/extenral/images/media/17766
if (ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())
&& Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
Cursor cursor = context.getContentResolver().query(uri,
new String[]{MediaStore.Images.Media.DATA}, null, null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
if (columnIndex > -1) {
path = cursor.getString(columnIndex);
}
}
cursor.close();
}
return path;
}
}
return null;
}
private static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
Cursor cursor = null;
final String column = "_data";
final String[] projection = {column};
try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
if (cursor != null && cursor.moveToFirst()) {
final int column_index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(column_index);
}
} finally {
if (cursor != null)
cursor.close();
}
return null;
}
private static boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri.getAuthority());
}
private static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}
private static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority());
}
}
您可将该类所有代码进行复制粘贴即可。
第二步:使用以下代码打开系统图库:
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
startActivityForResult(intent, REQUEST_IMAGE);
第三步:在图库页面选择好一张二维码图片后,我们可以使用如下代码进行处理:
if (requestCode == REQUEST_IMAGE && data != null) {
//处理扫描结果(在界面上显示)
Uri uri = data.getData();
String filePath = UriTofilePath.getFilePathByUri(MainActivity.this, uri);
try{
CodeUtils.analyzeBitmap(filePath, new CodeUtils.AnalyzeCallback() {
@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();
}
}
注:以上处理方式仅供参考,具体可根据自己需求来定制自己的处理方式。
2. 如何生成一个二维码
对于这个需求,我们可以通过以下代码来实现:
//生成带Logo的二维码
Bitmap = CodeUtils.createImage(textContent, 400, 400, BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
imageView.setImageBitmap(Bitmap);
//生成不带Logo的二维码
Bitmap = CodeUtils.createImage(textContent, 400, 400, null);
imageView.setImageBitmap(Bitmap);
这里我们调用了CodeUtils.createImage方法来生成,其中的参数有:
要生成二维码所包含的内容;
二维码图片宽度;
二维码图片高度;
二维码Logo(位于二维码中心的图片)。
以上四个参数中,第四个参数如不想要Logo图片可以将该值置为null,其他参数为必传参数。调用该方法后,我们会得到一个二维码图片的Bitmap对象,如需展示该图片,就可以使用图片控件的setImageBitmap方法来实现,当然也可以实现上传和保存,具体流程就不在这里叙述了,大家可以自行查找相关资料进行研究。
到此,本库的使用方法已经介绍完毕,最后再注意一点,如果当前手机的Android系统版本在6.0以上的话,则需要考虑敏感权限二次获取的问题,具体的实现方式可以自己查找资料,本文不再对此进行详细介绍了。
以上就是我今天给大家分享的全部内容,喜欢的话就收藏一下吧。