Android之二维码扫描和生成
一:效果图
二:实现步骤
1.导入第三方架包,下载地址:
http://download.csdn.net/detail/android_cll/9784977
2.在项目build.gradle文件下加入相应的包
compile 'cn.yipianfengye.android:zxing-library:2.1'
3.一个图片的Util工具类
package com.uuch.android_zxinglibrary;import android.annotation.TargetApi;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;/*** 文 件 名: ImageUtil* 创 建 人: 曹刘浪* 创建日期: 2017-3-18 12:12*/public class ImageUtil {/*** 根据Uri获取图片绝对路径,解决Android4.4以上版本Uri转换** @param context* @param imageUri*/@TargetApi(19)public static String getImageAbsolutePath(Context context, Uri imageUri) {if (context == null || imageUri == null)return null;if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT && DocumentsContract.isDocumentUri(context, imageUri)) {if (isExternalStorageDocument(imageUri)) {String docId = DocumentsContract.getDocumentId(imageUri);String[] split = docId.split(":");String type = split[0];if ("primary".equalsIgnoreCase(type)) {return Environment.getExternalStorageDirectory() + "/" + split[1];}} else if (isDownloadsDocument(imageUri)) {String id = DocumentsContract.getDocumentId(imageUri);Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));return getDataColumn(context, contentUri, null, null);} else if (isMediaDocument(imageUri)) {String docId = DocumentsContract.getDocumentId(imageUri);String[] split = docId.split(":");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;}String selection = MediaStore.Images.Media._ID + "=?";String[] selectionArgs = new String[]{split[1]};return getDataColumn(context, contentUri, selection, selectionArgs);}} // MediaStore (and general)else if ("content".equalsIgnoreCase(imageUri.getScheme())) {// Return the remote addressif (isGooglePhotosUri(imageUri))return imageUri.getLastPathSegment();return getDataColumn(context, imageUri, null, null);}// Fileelse if ("file".equalsIgnoreCase(imageUri.getScheme())) {return imageUri.getPath();}return null;}public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {Cursor cursor = null;String column = MediaStore.Images.Media.DATA;String[] projection = {column};try {cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);if (cursor != null && cursor.moveToFirst()) {int index = cursor.getColumnIndexOrThrow(column);return cursor.getString(index);}} finally {if (cursor != null)cursor.close();}return null;}/*** @param uri The Uri to check.* @return Whether the Uri authority is ExternalStorageProvider.*/public static boolean isExternalStorageDocument(Uri uri) {return "com.android.externalstorage.documents".equals(uri.getAuthority());}/*** @param uri The Uri to check.* @return Whether the Uri authority is DownloadsProvider.*/public static boolean isDownloadsDocument(Uri uri) {return "com.android.providers.downloads.documents".equals(uri.getAuthority());}/*** @param uri The Uri to check.* @return Whether the Uri authority is MediaProvider.*/public 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 Google Photos.*/public static boolean isGooglePhotosUri(Uri uri) {return "com.google.android.apps.photos.content".equals(uri.getAuthority());}
}
4.第一个界面的xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/button1"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="20dp"android:layout_marginRight="20dp"android:layout_marginTop="20dp"android:background="#ff0000"android:text="二维码扫描"android:textColor="#fff" /><Buttonandroid:id="@+id/button4"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/button1"android:layout_marginLeft="20dp"android:layout_marginRight="20dp"android:layout_marginTop="20dp"android:background="#ff0000"android:text="二维码生成"android:textColor="#fff" /></RelativeLayout>
5.MainActivity
package com.uuch.android_zxinglibrary;import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;import com.uuzuche.lib_zxing.activity.CaptureActivity;
import com.uuzuche.lib_zxing.activity.CodeUtils;import java.util.List;import pub.devrel.easypermissions.AfterPermissionGranted;
import pub.devrel.easypermissions.AppSettingsDialog;
import pub.devrel.easypermissions.EasyPermissions;public class MainActivity extends Activity implements EasyPermissions.PermissionCallbacks{/*** 扫描跳转Activity RequestCode*/public static final int REQUEST_CODE = 111;/*** 选择系统图片Request Code*/public static final int REQUEST_IMAGE = 112;public Button button1 = null;public Button button4 = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);/*** 初始化组件*/initView();}/*** 初始化组件*/private void initView() {button1 = (Button) findViewById(R.id.button1);button4 = (Button) findViewById(R.id.button4);/*** 二维码扫描界面*** 生成二维码图片*/button1.setOnClickListener(new ButtonOnClickListener(button1.getId()));button4.setOnClickListener(new ButtonOnClickListener(button4.getId()));}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {/*** 处理二维码扫描结果*/if (requestCode == 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);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();}}}/*** 选择系统图片并解析*/else if (requestCode == REQUEST_IMAGE) {if (data != null) {Uri uri = data.getData();try {CodeUtils.analyzeBitmap(ImageUtil.getImageAbsolutePath(this, uri), new CodeUtils.AnalyzeCallback() {@Overridepublic void onAnalyzeSuccess(Bitmap mBitmap, String result) {Toast.makeText(MainActivity.this, "解析结果:" + result, Toast.LENGTH_LONG).show();}@Overridepublic void onAnalyzeFailed() {Toast.makeText(MainActivity.this, "解析二维码失败", Toast.LENGTH_LONG).show();}});} catch (Exception e) {e.printStackTrace();}}}else if (requestCode == REQUEST_CAMERA_PERM) {Toast.makeText(this, "从设置页面返回...", Toast.LENGTH_SHORT).show();}}/*** 请求CAMERA权限码*/public static final int REQUEST_CAMERA_PERM = 101;/*** EsayPermissions接管权限处理逻辑* @param requestCode* @param permissions* @param grantResults*/@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);// Forward results to EasyPermissionsEasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);}@AfterPermissionGranted(REQUEST_CAMERA_PERM)public void cameraTask(int viewId) {if (EasyPermissions.hasPermissions(this, Manifest.permission.CAMERA)) {// Have permission, do the thing!onClick(viewId);} else {// Ask for one permissionEasyPermissions.requestPermissions(this, "需要请求camera权限",REQUEST_CAMERA_PERM, Manifest.permission.CAMERA);}}@Overridepublic void onPermissionsGranted(int requestCode, List<String> perms) {Toast.makeText(this, "执行onPermissionsGranted()...", Toast.LENGTH_SHORT).show();}@Overridepublic void onPermissionsDenied(int requestCode, List<String> perms) {Toast.makeText(this, "执行onPermissionsDenied()...", Toast.LENGTH_SHORT).show();if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {new AppSettingsDialog.Builder(this, "当前App需要申请camera权限,需要打开设置页面么?").setTitle("权限申请").setPositiveButton("确认").setNegativeButton("取消", null /* click listener */).setRequestCode(REQUEST_CAMERA_PERM).build().show();}}/*** 按钮点击监听*/class ButtonOnClickListener implements View.OnClickListener{private int buttonId;public ButtonOnClickListener(int buttonId) {this.buttonId = buttonId;}@Overridepublic void onClick(View v) {if (v.getId() == R.id.button4) {Intent intent = new Intent(MainActivity.this, ThreeActivity.class);startActivity(intent);} else {cameraTask(buttonId);}}}/*** 按钮点击事件处理逻辑* @param buttonId*/private void onClick(int buttonId) {switch (buttonId) {case R.id.button1:Intent intent = new Intent(getApplication(), CaptureActivity.class);startActivityForResult(intent, REQUEST_CODE);break;default:break;}}
}
6.二维码生成界面的xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:fitsSystemWindows="true"><EditTextandroid:id="@+id/edit_content"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="20dp"android:layout_marginRight="20dp"android:layout_marginTop="20dp"android:minLines="3" /><Buttonandroid:id="@+id/button_content"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/edit_content"android:layout_marginLeft="20dp"android:layout_marginRight="20dp"android:layout_marginTop="20dp"android:text="生成logo二维码图片"android:visibility="gone" /><Buttonandroid:id="@+id/button1_content"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/button_content"android:layout_marginLeft="20dp"android:layout_marginRight="20dp"android:layout_marginTop="20dp"android:text="生成普通二维码图片" /><ImageViewandroid:id="@+id/image_content"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/button1_content"android:layout_centerHorizontal="true"android:layout_marginTop="20dp" /></RelativeLayout>
7.二维码生成ThreeActivity
package com.uuch.android_zxinglibrary;import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;import com.uuzuche.lib_zxing.activity.CodeUtils;public class ThreeActivity extends Activity {public EditText editText = null;public Button button1 = null;public ImageView imageView = null;public Bitmap mBitmap = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_three);initView();}/*** 初始化组件*/private void initView() {editText = (EditText) findViewById(R.id.edit_content);button1 = (Button) findViewById(R.id.button1_content);imageView = (ImageView) findViewById(R.id.image_content);/*** 生成不带logo的二维码图片*/button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String textContent = editText.getText().toString();if (TextUtils.isEmpty(textContent)) {Toast.makeText(ThreeActivity.this, "您的输入为空!", Toast.LENGTH_SHORT).show();return;}editText.setText("");mBitmap = CodeUtils.createImage(textContent, 400, 400, null);imageView.setImageBitmap(mBitmap);}});}}
8.去AppLication初始化
package com.uuch.android_zxinglibrary;import android.app.Application;import com.uuzuche.lib_zxing.activity.ZXingLibrary;public class MApplication extends Application{@Overridepublic void onCreate() {super.onCreate();ZXingLibrary.initDisplayOpinion(this);}
}
9.在AndroidManifest.xml文件中加上权限
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" /><uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" /><uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
------------------------到这应该都已经写完了这个功能,大神勿喷,不会的或者想节约时间的可以下载源码、
源码地址:http://download.csdn.net/detail/android_cll/9785625
Android之二维码扫描和生成相关推荐
- Android zxing 二维码扫描和生成方法(简单版)
前言 二维码大家都见识过,这里就不废话了,直接来干货. 步骤 导入依赖 compile 'com.google.zxing:core:3.2.1' //zxing核心依赖compile 'com.jo ...
- Android zxing,轻松实现二维码扫描、生成
Android zxing,轻松实现二维码扫描.生成 一.二维码与条形码工作原理 目前的很多应用上都有扫码功能,当时微信推出二维码扫码功能时,觉得imagine,通过一张简单的图片就能扫描添加还有, ...
- Android实现二维码扫描功能(四)-ZXing识别图片二维码,相册选图
简介 上一篇 Android实现二维码扫描功能(三)-闪光灯控制介绍了光线较弱情况下开启闪光灯来辅助二维码识别的方法. 本篇我们介绍如何识别相册中的图片(含二维码) 动态演示 使用模拟器录制了动画演示 ...
- Android Zxing二维码扫描优化
关于Zxing的使用,网上有大量优秀的文章讲解,本文不再叙述. 用过Zxing的童鞋都知道Zxing扫描识别率较低,速度较慢.这里介绍一个第三方库,github地址为: https://github. ...
- Android实现二维码扫描功能-ZXing识别图片二维码,相册选图
文章目录 1.演示 2.权限问题 3.实现步骤 4.工具类 5.图片Uri处理(重要更新) 1.演示 2.权限问题 部分朋友在打开相册时遇到读写权限未授权的问题,我在开发的时候没有遇到,也没有注册读写 ...
- iOS 原生二维码扫描和生成
代码地址如下: http://www.demodashi.com/demo/12551.html 一.效果预览: 功能描述:WSLNativeScanTool是在利用原生API的条件下封装的二维码扫描 ...
- Android实现二维码扫描功能(一)ZXing插件接入
简介 关于Android扫描二维码的功能实现,网上有很多相关资料.在对比之后,选用了前辈了修改过的ZXing直接接入到项目中,特制作此demo,介绍整个过程. (最新更新)本篇文章讲解的接入方法对部分 ...
- 2022-02-18 Android app 二维码扫描demo,用zxing库,实测ok,记录一下所参考有价值的文章,有生成二维码的demo,但没有亲测。
一.Android中二维码扫描的最常用库是zxing和zbar,这里用zxing. 二.实测效果图,扫描完成后会以Toast方式显示结果. 三.测试代码的架构 四.代码不细说,想看源码的可以downl ...
- Android Studio二维码扫描
转载:http://blog.csdn.net/ryantang03/article/details/7831826# 工程概述 Android Studio开发二维码扫描真不容易,参考了很多资料,这 ...
最新文章
- 1.10 卷积神经网络示例-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
- 从菜鸟到专家的五步编程语言学习法
- 史上最有趣的Readme
- java实现压缩图片的方法
- append生成新变量的时候,没有如预期(It's a feature,not a bug?)
- Python global文件的全局变量使用
- 信息学奥赛一本通 1331:【例1-2】后缀表达式的值
- 红黑树原件 及其插入、删除(附图说明)
- git+repo 代码提交
- Python入门--流程控制语句break
- Spring Controller – Spring MVC控制器
- android emoji unicode编码表,unicode编码
- smarty 模板php,Smarty模板快速入门
- C# 汉字转拼音(支持GB2312字符集中所有汉字)
- 一文看懂抢注域名的相关问题解答
- Flurry、友盟、TalkingData移动应用统计分析对比
- MPQ文件结构和Partial MPQ文件结构
- Mysql 当前月每天累计统计,Mysql 本月第一天
- 手机测试中的ICCID是什么?
- 可视化系列汇总——相关关系图形
热门文章
- Vant 日历组件改造,增加农历,左右点击按钮上一个月,下一个月
- AMP 创新型电动汽车充电解决方案采用 Wolfspeed E-系列碳化硅器件
- opporeno5k双系统设置教程分享
- matlab求解系统的差分方程图形,用MATLAB仿真散系统差分方程.doc
- 挑战运营商?创业公司的N种活法
- 明尼苏达量表结果分析_明尼苏达多项人格测验(MMPI) 结果分析
- 你永远不知道擦身而过的“耳机党”在做什么
- Linux审计与日志安全加固
- apt-get和aptitude
- Matlab 基础应用02 wind 股票数据介绍和使用案例: