Android Zxing二维码的生成与使用

在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以上的话,则需要考虑敏感权限二次获取的问题,具体的实现方式可以自己查找资料,本文不再对此进行详细介绍了。

以上就是我今天给大家分享的全部内容,喜欢的话就收藏一下吧。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值