Github项目解析(十)–>几行代码快速集成二维码扫描库 - CSDN博客 http://blog.csdn.net/qq_23547831/article/details/52037710

自行添加了条形码的生成功能,图片路径获取代码。
效果图:

**

准备工作

**:
1.添加权限

<!-- 对存储设备的读写权限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /><!-- 相机 --><uses-permission android:name="android.permission.CAMERA" /><!-- 振动 --><uses-permission android:name="android.permission.VIBRATE" />

2.添加依赖:

compile 'cn.yipianfengye.android:zxing-library:2.2'

准备就绪了,马上开干啦。最开始解析本地含二维码的图片时,获取图片路径总报错,我就把它单独放出来进行测试了,现在当然是没问题啦~
所以首界面的功能就是:二维码的扫描、生成(有无logo)、条形码的生成,解析图片界面的功能就只是解析本地包含二维码的图片而已。说了这么多的废话了,是时候亮家伙了
**

功能

**

1.首页布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:id="@+id/tv_parse_image"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="26sp"android:layout_gravity="bottom"android:layout_marginTop="15dp"android:textColor="@color/colorAccent"android:text="解析二维码图片"/><TextViewandroid:id="@+id/tv_scan"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="26sp"android:layout_marginTop="15dp"android:text="扫描二维码"/><TextViewandroid:id="@+id/tv_parse_result"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="20sp"android:layout_marginTop="15dp"android:paddingLeft="5dp"android:text="扫描解析结果:"/><EditTextandroid:id="@+id/ed_input"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="15dp"android:hint="请输入"/><TextViewandroid:id="@+id/tv_make_code"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="26sp"android:layout_marginTop="15dp"android:text="生成有logo的二维码"/><TextViewandroid:id="@+id/tv_make_code_no_logo"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="26sp"android:layout_marginTop="15dp"android:text="生成无logo的二维码"/><TextViewandroid:id="@+id/tv_make_bar_code"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="26sp"android:layout_marginTop="15dp"android:text="生成条形码"/><ImageViewandroid:id="@+id/img_code"android:layout_marginTop="15dp"android:layout_width="wrap_content"android:layout_height="wrap_content" /></LinearLayout>

2.activity代码

我喜欢写很多注释,这样方便自己复习功能时,直接看代码就可以看到很多相关的知识点,但也许这篇的注释并不多,因为不需要啊。
注意,需要先执行初始化操作ZXingLibrary.initDisplayOpinion(this);


/*** 扫描二维码* 解析图片二维码* 根据输入的文字生成有无logo的二维码* 根据输入的文字生成条形码*/
public class HomeActivity extends AppCompatActivity {private TextView tvScan;private TextView tvParseResult;private TextView tvMakeCode;private TextView tvMakeCodeNoLogo;private TextView tvMakeBarCode;private EditText edInput;private ImageView imgCode;private Bitmap mBitmap;private TextView tvParseImage;private static final int REQUEST_CODE = 1001;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_home);//初始化ZXingLibrary.initDisplayOpinion(this);tvScan = (TextView) this.findViewById(R.id.tv_scan);tvParseResult  =  (TextView) this.findViewById(R.id.tv_parse_result);edInput = (EditText) this.findViewById(R.id.ed_input);tvMakeCode = (TextView) this.findViewById(R.id.tv_make_code);tvMakeCodeNoLogo = (TextView) this.findViewById(R.id.tv_make_code_no_logo);tvMakeBarCode = (TextView) this.findViewById(R.id.tv_make_bar_code);imgCode = (ImageView) this.findViewById(R.id.img_code);tvParseImage =  (TextView) this.findViewById(R.id.tv_parse_image);//解析二维码图片tvParseImage.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent(HomeActivity.this,ActParseImage.class);startActivity(intent);}});//扫描二维码tvScan.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent(HomeActivity.this, CaptureActivity.class);startActivityForResult(intent, REQUEST_CODE);}});//生成有logo的二维码图片tvMakeCode.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {String textContent = edInput.getText().toString();if (TextUtils.isEmpty(textContent)) {Toast.makeText(HomeActivity.this, "您的输入为空!", Toast.LENGTH_SHORT).show();return;}mBitmap = CodeUtils.createImage(textContent, 400, 400, BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));imgCode.setImageBitmap(mBitmap);}});//生成无logo的二维码图片tvMakeCodeNoLogo.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {String textContent = edInput.getText().toString();if (TextUtils.isEmpty(textContent)) {Toast.makeText(HomeActivity.this, "您的输入为空!", Toast.LENGTH_SHORT).show();return;}mBitmap = CodeUtils.createImage(textContent, 400, 400, null);imgCode.setImageBitmap(mBitmap);}});tvMakeBarCode.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String textContent = edInput.getText().toString();if (TextUtils.isEmpty(textContent)) {Toast.makeText(HomeActivity.this, "您的输入为空!", Toast.LENGTH_SHORT).show();return;}makeBarCode(textContent);}});}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {switch (requestCode){case 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);tvParseResult.setText("扫描解析结果:" + result);} else if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED) {Toast.makeText(HomeActivity.this, "解析二维码失败", Toast.LENGTH_LONG).show();}}break;}}/*** 制作条形码*/public void makeBarCode(String barCode){int size = barCode.length();for (int i = 0; i < size; i++) {int c = barCode.charAt(i);if ((19968 <= c && c < 40623)) {Toast.makeText(HomeActivity.this, "生成条形码的时刻不能是中文", Toast.LENGTH_SHORT).show();return;}}Bitmap bmp = null;try {if (!TextUtils.isEmpty(barCode)) {bmp = CreateOneDCode(barCode);}} catch (WriterException e) {e.printStackTrace();}if (bmp != null) {imgCode.setImageBitmap(bmp);}}/*** 用于将给定的内容生成成一维条码 注:目前生成内容为中文的话将直接报错,要修改底层jar包的内容** @param content 将要生成一维条码的内容* @return 返回生成好的一维条码bitmap* @throws WriterException WriterException异常*/public Bitmap CreateOneDCode(String content) throws WriterException {// 生成一维条码,编码时指定大小,不要生成了图片以后再进行缩放,这样会模糊导致识别失败int imgWidth = this.getResources().getDisplayMetrics().widthPixels - 40;int imgHeight = imgWidth / 5 * 2;BitMatrix matrix = new MultiFormatWriter().encode(content,BarcodeFormat.CODE_128, imgWidth, imgHeight);int width = matrix.getWidth();int height = matrix.getHeight();int[] pixels = new int[width * height];for (int y = 0; y < height; y++) {for (int x = 0; x < width; x++) {if (matrix.get(x, y)) {pixels[y * width + x] = 0xff000000;}}}Bitmap bitmap = Bitmap.createBitmap(width, height,Bitmap.Config.ARGB_8888);// 通过像素数组生成bitmap,具体参考apibitmap.setPixels(pixels, 0, width, 0, 0, width, height);return bitmap;}
}

3.解析二维码图片布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/tv_parse_image"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="26sp"android:layout_marginTop="15dp"android:text="解析二维码图片"/><TextViewandroid:id="@+id/tv_parse_result"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="20sp"android:layout_marginTop="15dp"android:paddingLeft="5dp"android:text="解析结果:"/><ImageViewandroid:id="@+id/img_code"android:layout_marginTop="15dp"android:layout_width="wrap_content"android:layout_height="wrap_content" /></LinearLayout>

4.解析二维码图片activity

注意哦,Android6.0及以上不仅要声明权限,还需要在使用的时候,自动询问,此处读取本地图片是必须要进行这样的操作的,但我在这偷了个懒,我没有写自动询问权限,直接去设置里面全部授予了

public class ActParseImage extends AppCompatActivity{private TextView tvParseImage;private TextView tvParseResult;private ImageView imgCode;private static final int REQUEST_IMAGE = 1102;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_act_parseimage);//初始化ZXingLibrary.initDisplayOpinion(this);tvParseImage =  (TextView) this.findViewById(R.id.tv_parse_image);tvParseResult  =  (TextView) this.findViewById(R.id.tv_parse_result);imgCode = (ImageView) this.findViewById(R.id.img_code);//解析二维码图片tvParseImage.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {tvParseResult.setText("");Intent intent = new Intent(Intent.ACTION_GET_CONTENT);intent.addCategory(Intent.CATEGORY_OPENABLE);intent.setType("image/*");startActivityForResult(intent, REQUEST_IMAGE);}});}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {switch (requestCode){case REQUEST_IMAGE:if (data != null) {String imagePath = "";//获得图片路径Uri uri = data.getData();imagePath = getRealPathFromUri(this,uri);try {CodeUtils.analyzeBitmap(imagePath, new CodeUtils.AnalyzeCallback() {@Overridepublic void onAnalyzeSuccess(Bitmap mBitmap, String result) {tvParseResult.setText("解析结果:" + result);imgCode.setImageBitmap(mBitmap);}@Overridepublic void onAnalyzeFailed() {Toast.makeText(ActParseImage.this, "解析二维码失败", Toast.LENGTH_LONG).show();}});} catch (Exception e) {e.printStackTrace();}}break;}}/*** 根据Uri获取图片的绝对路径** @param context 上下文对象* @param uri     图片的Uri* @return 如果Uri对应的图片存在, 那么返回该图片的绝对路径, 否则返回null*/public static String getRealPathFromUri(Context context, Uri uri) {int sdkVersion = Build.VERSION.SDK_INT;if (sdkVersion >= 19) { // api >= 19return getRealPathFromUriAboveApi19(context, uri);} else { // api < 19return getRealPathFromUriBelowAPI19(context, uri);}}/*** 适配api19以下(不包括api19),根据uri获取图片的绝对路径** @param context 上下文对象* @param uri     图片的Uri* @return 如果Uri对应的图片存在, 那么返回该图片的绝对路径, 否则返回null*/private static String getRealPathFromUriBelowAPI19(Context context, Uri uri) {return getDataColumn(context, uri, null, null);}/*** 适配api19及以上,根据uri获取图片的绝对路径** @param context 上下文对象* @param uri     图片的Uri* @return 如果Uri对应的图片存在, 那么返回该图片的绝对路径, 否则返回null*/@SuppressLint("NewApi")private static String getRealPathFromUriAboveApi19(Context context, Uri uri) {String filePath = null;if (DocumentsContract.isDocumentUri(context, uri)) {// 如果是document类型的 uri, 则通过document id来进行处理String documentId = DocumentsContract.getDocumentId(uri);if (isMediaDocument(uri)) { // MediaProvider// 使用':'分割String id = documentId.split(":")[1];String selection = MediaStore.Images.Media._ID + "=?";String[] selectionArgs = {id};filePath = getDataColumn(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection, selectionArgs);} else if (isDownloadsDocument(uri)) { // DownloadsProviderUri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(documentId));filePath = getDataColumn(context, contentUri, null, null);}} else if ("content".equalsIgnoreCase(uri.getScheme())){// 如果是 content 类型的 UrifilePath = getDataColumn(context, uri, null, null);} else if ("file".equals(uri.getScheme())) {// 如果是 file 类型的 Uri,直接获取图片对应的路径filePath = uri.getPath();}return filePath;}/*** 获取数据库表中的 _data 列,即返回Uri对应的文件路径* @return*/private static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {String path = null;String[] projection = new String[]{MediaStore.Images.Media.DATA};Cursor cursor = null;try {cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);if (cursor != null && cursor.moveToFirst()) {int columnIndex = cursor.getColumnIndexOrThrow(projection[0]);path = cursor.getString(columnIndex);}} catch (Exception e) {if (cursor != null) {cursor.close();}}return path;}/*** @param uri the Uri to check* @return Whether the Uri authority is MediaProvider*/private static boolean isMediaDocument(Uri uri) {return "com.android.providers.media.documents".equals(uri.getAuthority());}/*** @param uri the Uri to check* @return Whether the Uri authority is DownloadsProvider*/private static boolean isDownloadsDocument(Uri uri) {return "com.android.providers.downloads.documents".equals(uri.getAuthority());}}

条形码、二维码的生成与扫描、解析本地二维码相关推荐

  1. QR Code 二维码的生成与扫描

    前言 现在大街小巷.各大网站都有二维码的踪迹,不管是IOS.Android.WP都有相关支持的软件. 最近因为工作需要使用相关技术,所以做了初步了解.今天主要是讲述如何使用ZXing库,在项目中要使用 ...

  2. IOS 开发笔记——二维码的生成和扫描

    开发当中我们经常遇到二维码的生成或者说是扫描,但是苹果官方给我们准备好了这些 API,那么接下来作者为大家详细讲述一下二维码 在二维码的生成中,我们要用到一个类CIFilter,这是系统的一个滤镜类, ...

  3. 二维码的生成和扫描识别

    一.二维码的生成  1 #import "ViewController.h"  2 #import "QRCodeGenerator.h"  3   4 @in ...

  4. 五合一收款码在线生成多模板免安装网站源码

    介绍: 五合一收款码在线生成网站源码]PayPal五合一收款+HTML单页版多模板免安装 五合一收款码在线生成,40个模板 支持微信支付.支付宝支付.手机QQ支付.京东钱包.百度钱包,PayPal五合 ...

  5. Android 使用Zxing实现二维码的生成,扫描

    在项目中要使用到二维码的相关内容,百度(原谅我还在用)之后得知一半都是使用Google的开源库 Zxing,但是网上多半的使用教程都是比较早的,这里给出我总结的一些基础代码和使用规则: 首先要一定要先 ...

  6. 使用zxing包生成和扫描二维码和一维码

    在开发之前要先下载zxing包对其简化,新建一个android工程,把zxing包中的android和android-code中的文件复制到相应的文件夹里面 其中的libs文件夹里需要zxing包中的 ...

  7. Android之二维码生成与扫描

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/51260428 本文出自:[顾林海的博客] ##前言 月底离开公司,准备 ...

  8. Android开发——Android中的二维码生成与扫描

    0. 前言 今天这篇文章主要描述二维码的生成与扫描,使用目前流行的Zxing,为什么要讲二维码,因为二维码太普遍了,随便一个Android APP都会有二维码扫描.本篇旨在帮助有需求的同学快速完成二维 ...

  9. Android中的二维码生成与扫描

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/51260428 本文出自:[顾林海的博客] 前言 月底离开公司,准备月底 ...

最新文章

  1. 万物皆对象java_又一次认识java(一) ---- 万物皆对象
  2. 「消息队列」看过来!
  3. Java23-day14【函数式接口(Supplier\Consumer\Predicate\Function)、Stream流(生产方式\中间方法\终结方法)】
  4. tesseract-ocr的安装及使用
  5. 当执行进程ctrl+c关闭不了的时候的解决方法
  6. Linux 性能检查命令总结
  7. 2017.09.21学习总结
  8. 随机样本一致性:一种用于图像分析和自动制图的模型拟合模型(5)--(P4P的解析解)
  9. 编译安装imagick出错:make: *** [imagick_class.lo] Error 1
  10. js获取td的html,js中获取 table节点各tr及td的内容简单实例
  11. 【codevs1506】传话
  12. python 如何加密_Python如何玩转加密?
  13. JLINK 驱动 V7.00a 更新导致JLINK V9无法使用问题解决
  14. 测试方法-正交实验法/场景法
  15. 自行设计开源的pdf转word软件(python开发设计)
  16. 什么是单页应用SPA
  17. 最全UnityHub下载链接Unity2022~2017各版本+Unity5.x【间歇性更新】
  18. 思科交换机创建子接口
  19. Linux服务器出现方向键、退格键乱码等现象解决
  20. HDU 6555 The Fool

热门文章

  1. 内容创作浪潮来临时,谁能共潮而生?
  2. 你在 B 站看番剧,别人在 B 站学 Python !
  3. 真正的十大暴利商品 成本曝光
  4. nginx allow deny
  5. Python 基础练习题
  6. 如何制作MacOS系统启动盘
  7. Power BI——切片器
  8. 安卓系统刷机怎么刷机_安卓5.0系统如何刷机 安卓5.0系统刷机步骤介绍【教程】...
  9. 向前努力,才能不堕落
  10. [金融之王:毁了世界的银行家]