当前位置:   article > 正文

Android开发学习之基于ZBar实现微信扫一扫

mcamerainfo.facing

蛰伏半月有余,一直在准备期末考试,期间抽空研究了一些Android的源代码,现在我就把在这其中的一些收获分享给大家。

今天想分享给大家的是二维码扫描。说起二维码,大家一定不会陌生,尤其是微信火了以后,在我们的生活中几乎随处都可以看到二维码的影

子。相关科技媒体甚至把二维码当成是未来移动互联网的入口,因此研究二维码的相关技术就显得意义非凡。目前在移动开发领域,使用最为广泛的二

维码库有两个,分别是ZXing和ZBar,其中ZXing在Android开发中较为常见,而ZBar则在IOS开发中较为常见,更重要的一点是,这两个库都是开源

的,因此我们可以从源代码中获得很多有用的东西。关于ZXing,网上有很多关的博文,我今天不想多说,我今天想说的是ZBar,你可能会说,ZBar

不是用在IOS中,怎么今天要说ZBar呢?其实我是从这两个库使用的难易程度来选择的,ZXing功能强大,但是使用起来比较繁琐,网上有很多简化的

教程,大家可以自行前去研究。相比较而言,ZBar则比较简单,使用起来容易上手,因此我们今天选择了ZBar作为我们的库来使用。


一、准备工作

下载ZBar的SDK:由于ZBar的项目托管在sourceforge,所以在这里给出下载地址:http://download.csdn.net/detail/qinyuanpei/6794713


二、导入项目

下载完成后,我们直接解压,可以看到下面的目录结构

打开android文件夹,我们可以找到一个Example的文件夹,这是官方给出的示例代码,我们下面的所有工作都是基于这个示例程序而来。我们

自行创建一个Android项目,并将这两个文件拷贝到我们的项目中,同时引入ZBar相关的库文件。


三、建立布局

首先建立主界面,即扫描二维码的界面,界面布局代码如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:orientation="vertical"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent">
  7. <RelativeLayout
  8. android:layout_width="match_parent"
  9. android:layout_height="40dp"
  10. android:background="@drawable/title_bg" >
  11. <TextView
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"
  14. android:layout_centerHorizontal="true"
  15. android:layout_centerVertical="true"
  16. android:text="@string/Scan"
  17. android:textColor="#ffffff"
  18. android:textSize="18sp" />
  19. <Button
  20. android:id="@+id/BtnAbout"
  21. android:layout_width="wrap_content"
  22. android:layout_height="wrap_content"
  23. android:layout_alignParentRight="true"
  24. android:layout_alignParentTop="true"
  25. android:text="@string/BtnAbout" />
  26. </RelativeLayout>
  27. <FrameLayout
  28. android:id="@+id/cameraPreview"
  29. android:layout_width="match_parent"
  30. android:layout_height="0dip"
  31. android:layout_weight="1"/>
  32. </LinearLayout>

实现的布局效果如下图所示:


接下里,我们在来设计一个用于显示结果的界面,界面布局代码如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:background="#ffffff"
  6. android:orientation="vertical" >
  7. <RelativeLayout
  8. android:layout_width="match_parent"
  9. android:layout_height="40dp"
  10. android:background="@drawable/title_bg" >
  11. <TextView
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"
  14. android:layout_centerHorizontal="true"
  15. android:layout_centerVertical="true"
  16. android:textSize="18sp"
  17. android:textColor="#ffffff"
  18. android:text="@string/Result" />
  19. <Button
  20. android:id="@+id/BtnBack"
  21. android:layout_width="wrap_content"
  22. android:layout_height="wrap_content"
  23. android:layout_alignParentLeft="true"
  24. android:layout_alignParentTop="true"
  25. android:text="@string/BtnBack" />
  26. </RelativeLayout>
  27. <TextView
  28. android:id="@+id/TextResult"
  29. android:layout_width="match_parent"
  30. android:layout_height="wrap_content"
  31. android:textColor="#000000"
  32. android:layout_margin="8dp"
  33. android:textIsSelectable="true"/>
  34. </LinearLayout>

实现的界面效果如图所示:


四、编写代码

首先我们来写一个用于扫描的相机预览视图CameraPreview,此文件由ZBar的SDK提供,这里我做了下简单的修改

  1. package com.Android.ZBar4Android;
  2. import java.io.IOException;
  3. import android.util.Log;
  4. import android.view.SurfaceView;
  5. import android.view.SurfaceHolder;
  6. import android.annotation.SuppressLint;
  7. import android.content.Context;
  8. import android.graphics.Canvas;
  9. import android.hardware.Camera;
  10. import android.hardware.Camera.Parameters;
  11. import android.hardware.Camera.PreviewCallback;
  12. import android.hardware.Camera.AutoFocusCallback;
  13. //此类由ZBar项目的SDK提供,我做了下修改
  14. @SuppressLint("ViewConstructor")
  15. public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback
  16. {
  17. private SurfaceHolder mHolder;
  18. private Camera mCamera;
  19. private PreviewCallback mPreviewCallBack;
  20. private AutoFocusCallback mAutoFocusCallBack;
  21. public CameraPreview(Context context, Camera camera,
  22. PreviewCallback previewCb,
  23. AutoFocusCallback autoFocusCb) {
  24. super(context);
  25. mCamera = camera;
  26. mPreviewCallBack = previewCb;
  27. mAutoFocusCallBack = autoFocusCb;
  28. /*
  29. * 自动聚焦
  30. * 要求API版本>9
  31. */
  32. Camera.Parameters parameters = camera.getParameters();
  33. for (String f : parameters.getSupportedFocusModes()) {
  34. if (f == Parameters.FOCUS_MODE_CONTINUOUS_PICTURE) {
  35. parameters.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
  36. mAutoFocusCallBack = null;
  37. break;
  38. }
  39. }
  40. // Install a SurfaceHolder.Callback so we get notified when the
  41. // underlying surface is created and destroyed.
  42. mHolder = getHolder();
  43. mHolder.addCallback(this);
  44. // deprecated setting, but required on Android versions prior to 3.0
  45. mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  46. }
  47. public void surfaceCreated(SurfaceHolder holder) {
  48. // The Surface has been created, now tell the camera where to draw the preview.
  49. try {
  50. mCamera.setPreviewDisplay(holder);
  51. } catch (IOException e) {
  52. Log.d("DBG", "Error setting camera preview: " + e.getMessage());
  53. }
  54. }
  55. public void surfaceDestroyed(SurfaceHolder holder) {
  56. // Camera preview released in activity
  57. }
  58. public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
  59. /*
  60. * If your preview can change or rotate, take care of those events here.
  61. * Make sure to stop the preview before resizing or reformatting it.
  62. */
  63. if (mHolder.getSurface() == null){
  64. // preview surface does not exist
  65. return;
  66. }
  67. // stop preview before making changes
  68. try {
  69. mCamera.stopPreview();
  70. } catch (Exception e){
  71. // ignore: tried to stop a non-existent preview
  72. }
  73. try {
  74. // Hard code camera surface rotation 90 degs to match Activity view in portrait
  75. mCamera.setDisplayOrientation(90);
  76. mCamera.setPreviewDisplay(mHolder);
  77. mCamera.setPreviewCallback(mPreviewCallBack);
  78. mCamera.startPreview();
  79. mCamera.autoFocus(mAutoFocusCallBack);
  80. } catch (Exception e){
  81. Log.d("DBG", "Error starting camera preview: " + e.getMessage());
  82. }
  83. }
  84. /*
  85. * 绘制校准框
  86. * 修改:秦元培
  87. * 时间:2013年11月22日
  88. *
  89. */
  90. @Override
  91. protected void onDraw(Canvas mCanvas)
  92. {
  93. //这里不会写了?
  94. }
  95. }

接下来,我们来编写主界面的逻辑代码,在这里我们需要搞清楚的几个问题有:

1、相机的获取及相机的交互处理

2、二维码图片的获取

3、二维码图片的解析

对于第一个问题,需要我们深入地了解相机的工作原理,即我们需要了解Camera类。

获取相机的代码如下:

  1. //获取照相机的方法
  2. public static Camera getCameraInstance()
  3. {
  4. Camera mCamera = null;
  5. try
  6. {
  7. mCamera = Camera.open();
  8. //没有后置摄像头,尝试打开前置摄像头*******************
  9. if (mCamera == null)
  10. {
  11. Camera.CameraInfo mCameraInfo = new Camera.CameraInfo();
  12. int cameraCount = Camera.getNumberOfCameras();
  13. for (int camIdx = 0; camIdx < cameraCount; camIdx++)
  14. {
  15. Camera.getCameraInfo(camIdx, mCameraInfo);
  16. if (mCameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT)
  17. {
  18. mCamera = Camera.open(camIdx);
  19. }
  20. }
  21. }
  22. }
  23. catch (Exception e)
  24. {
  25. e.printStackTrace();
  26. }
  27. return mCamera;
  28. }

释放照相机的方法

  1. //释放照相机
  2. private void releaseCamera()
  3. {
  4. if (mCamera != null)
  5. {
  6. IsPreview = false;
  7. mCamera.setPreviewCallback(null);
  8. mCamera.release();
  9. mCamera = null;
  10. }
  11. }


相机反馈的方法,即扫描到二维码后的处理

  1. PreviewCallback previewCb = new PreviewCallback()
  2. {
  3. public void onPreviewFrame(byte[] data, Camera camera)
  4. {
  5. Camera.Parameters parameters = camera.getParameters();
  6. //获取扫描图片的大小
  7. Size mSize = parameters.getPreviewSize();
  8. //构造存储图片的Image
  9. Image mResult = new Image(mSize.width, mSize.height, "Y800");//第三个参数不知道是干嘛的
  10. //设置Image的数据资源
  11. mResult.setData(data);
  12. //获取扫描结果的代码
  13. int mResultCode = mScanner.scanImage(mResult);
  14. //如果代码不为0,表示扫描成功
  15. if (mResultCode != 0)
  16. {
  17. //停止扫描
  18. IsPreview = false;
  19. mCamera.setPreviewCallback(null);
  20. mCamera.stopPreview();
  21. //开始解析扫描图片
  22. SymbolSet Syms = mScanner.getResults();
  23. for (Symbol mSym : Syms)
  24. {
  25. //mSym.getType()方法可以获取扫描的类型,ZBar支持多种扫描类型,这里实现了条形码、二维码、ISBN码的识别
  26. if (mSym.getType() == Symbol.CODE128 || mSym.getType() == Symbol.QRCODE ||
  27. mSym.getType() == Symbol.CODABAR || mSym.getType() == Symbol.ISBN10 ||
  28. mSym.getType() == Symbol.ISBN13|| mSym.getType()==Symbol.DATABAR ||
  29. mSym.getType()==Symbol.DATABAR_EXP || mSym.getType()==Symbol.I25)
  30. {
  31. //添加震动效果,提示用户扫描完成
  32. Vibrator mVibrator=(Vibrator)getSystemService(VIBRATOR_SERVICE);
  33. mVibrator.vibrate(400);
  34. Intent intent=new Intent(MainActivity.this,ResultActivity.class);
  35. intent.putExtra("ScanResult", "扫描类型:"+GetResultByCode(mSym.getType())+"\n"+ mSym.getData());
  36. //这里需要注意的是,getData方法才是最终返回识别结果的方法
  37. //但是这个方法是返回一个标识型的字符串,换言之,返回的值中包含每个字符串的含义
  38. //例如N代表姓名,URL代表一个Web地址等等,其它的暂时不清楚,如果可以对这个进行一个较好的分割
  39. //效果会更好,如果需要返回扫描的图片,可以对Image做一个合适的处理
  40. startActivity(intent);
  41. IsScanned = true;
  42. }
  43. else
  44. {
  45. //否则继续扫描
  46. IsScanned = false;
  47. mCamera.setPreviewCallback(previewCb);
  48. mCamera.startPreview();
  49. IsPreview = true;
  50. mCamera.autoFocus(autoFocusCB);
  51. }
  52. }
  53. }
  54. }
  55. };

对于第二个问题,从上面的代码中我们可以看出,Image类用于获取二维码图片,ImageScanner类用于对图片的初步解析,而图片的最终解析是在SymbolSet类和

Symbol中去实现的,由此,第三个问题得以解答。下面给出完整代码:

  1. /*
  2. * ZBar4Android
  3. * 作者:秦元培
  4. * 时间:2013年12月21日
  5. * 需要解决的问题有:
  6. * 1、返回内容的正则解析
  7. * 2、如果锁屏后打开程序会报错
  8. * 3、没有校正框,画不出来啊,郁闷
  9. * 4、可能会与其它相机应用冲突,如微信
  10. * 5、条形码还是读不出来
  11. */
  12. package com.Android.ZBar4Android;
  13. import com.Android.ZBar4Android.CameraPreview;
  14. import com.Android.ZBar4Android.R;
  15. import android.app.Activity;
  16. import android.app.AlertDialog;
  17. import android.content.DialogInterface;
  18. import android.content.Intent;
  19. import android.content.pm.ActivityInfo;
  20. import android.os.Bundle;
  21. import android.os.Handler;
  22. import android.os.Vibrator;
  23. import android.view.LayoutInflater;
  24. import android.view.View;
  25. import android.view.ViewGroup.LayoutParams;
  26. import android.view.Window;
  27. import android.view.View.OnClickListener;
  28. import android.widget.FrameLayout;
  29. import android.widget.Button;
  30. import android.widget.PopupWindow;
  31. import android.hardware.Camera;
  32. import android.hardware.Camera.PreviewCallback;
  33. import android.hardware.Camera.AutoFocusCallback;
  34. import android.hardware.Camera.Size;
  35. import net.sourceforge.zbar.ImageScanner;
  36. import net.sourceforge.zbar.Image;
  37. import net.sourceforge.zbar.Symbol;
  38. import net.sourceforge.zbar.SymbolSet;
  39. import net.sourceforge.zbar.Config;
  40. public class MainActivity extends Activity
  41. {
  42. //关于按钮
  43. private Button BtnAbout;
  44. //相机
  45. private Camera mCamera;
  46. //预览视图
  47. private CameraPreview mPreview;
  48. //自动聚焦
  49. private Handler mAutoFocusHandler;
  50. //图片扫描器
  51. private ImageScanner mScanner;
  52. //弹出窗口
  53. private PopupWindow mPopupWindow;
  54. //是否扫描完毕
  55. private boolean IsScanned = false;
  56. //是否处于预览状态
  57. private boolean IsPreview = true;
  58. //是否显示弹出层
  59. private boolean IsShowPopup=false;
  60. //加载iconvlib
  61. static
  62. {
  63. System.loadLibrary("iconv");
  64. }
  65. public void onCreate(Bundle savedInstanceState)
  66. {
  67. super.onCreate(savedInstanceState);
  68. //去除标题栏
  69. requestWindowFeature(Window.FEATURE_NO_TITLE);
  70. setContentView(R.layout.layout_main);
  71. //设置屏幕方向为竖屏
  72. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  73. //自动聚焦线程
  74. mAutoFocusHandler = new Handler();
  75. //获取相机实例
  76. mCamera = getCameraInstance();
  77. if(mCamera == null)
  78. {
  79. //在这里写下获取相机失败的代码
  80. AlertDialog.Builder mBuilder=new AlertDialog.Builder(this);
  81. mBuilder.setTitle("ZBar4Android");
  82. mBuilder.setMessage("ZBar4Android获取相机失败,请重试!");
  83. mBuilder.setPositiveButton("确定", new DialogInterface.OnClickListener()
  84. {
  85. @Override
  86. public void onClick(DialogInterface mDialogInterface, int mIndex)
  87. {
  88. MainActivity.this.finish();
  89. }
  90. });
  91. AlertDialog mDialog=mBuilder.create();
  92. mDialog.show();
  93. }
  94. //实例化Scanner
  95. mScanner = new ImageScanner();
  96. mScanner.setConfig(0, Config.X_DENSITY, 3);
  97. mScanner.setConfig(0, Config.Y_DENSITY, 3);
  98. //设置相机预览视图
  99. mPreview = new CameraPreview(this, mCamera, previewCb, autoFocusCB);
  100. FrameLayout preview = (FrameLayout)findViewById(R.id.cameraPreview);
  101. preview.addView(mPreview);
  102. if (IsScanned)
  103. {
  104. IsScanned = false;
  105. mCamera.setPreviewCallback(previewCb);
  106. mCamera.startPreview();
  107. IsPreview = true;
  108. mCamera.autoFocus(autoFocusCB);
  109. }
  110. //获取BtnAbout,显示程序信息
  111. BtnAbout=(Button)findViewById(R.id.BtnAbout);
  112. BtnAbout.setOnClickListener(new OnClickListener()
  113. {
  114. @Override
  115. public void onClick(View v)
  116. {
  117. //如果弹出层已打开,销毁弹出层
  118. if(IsShowPopup)
  119. {
  120. mPopupWindow.dismiss();
  121. IsShowPopup=false;
  122. }
  123. else
  124. {
  125. //否则显示弹出层
  126. mPopupWindow=new PopupWindow();
  127. LayoutInflater mInflater=LayoutInflater.from(getApplicationContext());
  128. View view=mInflater.inflate(R.layout.layout_about, null);
  129. mPopupWindow.setContentView(view);
  130. mPopupWindow.setWidth(LayoutParams.WRAP_CONTENT);
  131. mPopupWindow.setHeight(LayoutParams.WRAP_CONTENT);
  132. mPopupWindow.showAtLocation(mPreview, 0, 100, 100);
  133. IsShowPopup=true;
  134. }
  135. }
  136. });
  137. }
  138. //实现Pause方法
  139. public void onPause()
  140. {
  141. super.onPause();
  142. releaseCamera();
  143. }
  144. //获取照相机的方法
  145. public static Camera getCameraInstance()
  146. {
  147. Camera mCamera = null;
  148. try
  149. {
  150. mCamera = Camera.open();
  151. //没有后置摄像头,尝试打开前置摄像头*******************
  152. if (mCamera == null)
  153. {
  154. Camera.CameraInfo mCameraInfo = new Camera.CameraInfo();
  155. int cameraCount = Camera.getNumberOfCameras();
  156. for (int camIdx = 0; camIdx < cameraCount; camIdx++)
  157. {
  158. Camera.getCameraInfo(camIdx, mCameraInfo);
  159. if (mCameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT)
  160. {
  161. mCamera = Camera.open(camIdx);
  162. }
  163. }
  164. }
  165. }
  166. catch (Exception e)
  167. {
  168. e.printStackTrace();
  169. }
  170. return mCamera;
  171. }
  172. //释放照相机
  173. private void releaseCamera()
  174. {
  175. if (mCamera != null)
  176. {
  177. IsPreview = false;
  178. mCamera.setPreviewCallback(null);
  179. mCamera.release();
  180. mCamera = null;
  181. }
  182. }
  183. private Runnable doAutoFocus = new Runnable()
  184. {
  185. public void run()
  186. {
  187. if (IsPreview)
  188. mCamera.autoFocus(autoFocusCB);
  189. }
  190. };
  191. PreviewCallback previewCb = new PreviewCallback()
  192. {
  193. public void onPreviewFrame(byte[] data, Camera camera)
  194. {
  195. Camera.Parameters parameters = camera.getParameters();
  196. //获取扫描图片的大小
  197. Size mSize = parameters.getPreviewSize();
  198. //构造存储图片的Image
  199. Image mResult = new Image(mSize.width, mSize.height, "Y800");//第三个参数不知道是干嘛的
  200. //设置Image的数据资源
  201. mResult.setData(data);
  202. //获取扫描结果的代码
  203. int mResultCode = mScanner.scanImage(mResult);
  204. //如果代码不为0,表示扫描成功
  205. if (mResultCode != 0)
  206. {
  207. //停止扫描
  208. IsPreview = false;
  209. mCamera.setPreviewCallback(null);
  210. mCamera.stopPreview();
  211. //开始解析扫描图片
  212. SymbolSet Syms = mScanner.getResults();
  213. for (Symbol mSym : Syms)
  214. {
  215. //mSym.getType()方法可以获取扫描的类型,ZBar支持多种扫描类型,这里实现了条形码、二维码、ISBN码的识别
  216. if (mSym.getType() == Symbol.CODE128 || mSym.getType() == Symbol.QRCODE ||
  217. mSym.getType() == Symbol.CODABAR || mSym.getType() == Symbol.ISBN10 ||
  218. mSym.getType() == Symbol.ISBN13|| mSym.getType()==Symbol.DATABAR ||
  219. mSym.getType()==Symbol.DATABAR_EXP || mSym.getType()==Symbol.I25)
  220. {
  221. //添加震动效果,提示用户扫描完成
  222. Vibrator mVibrator=(Vibrator)getSystemService(VIBRATOR_SERVICE);
  223. mVibrator.vibrate(400);
  224. Intent intent=new Intent(MainActivity.this,ResultActivity.class);
  225. intent.putExtra("ScanResult", "扫描类型:"+GetResultByCode(mSym.getType())+"\n"+ mSym.getData());
  226. //这里需要注意的是,getData方法才是最终返回识别结果的方法
  227. //但是这个方法是返回一个标识型的字符串,换言之,返回的值中包含每个字符串的含义
  228. //例如N代表姓名,URL代表一个Web地址等等,其它的暂时不清楚,如果可以对这个进行一个较好的分割
  229. //效果会更好,如果需要返回扫描的图片,可以对Image做一个合适的处理
  230. startActivity(intent);
  231. IsScanned = true;
  232. }
  233. else
  234. {
  235. //否则继续扫描
  236. IsScanned = false;
  237. mCamera.setPreviewCallback(previewCb);
  238. mCamera.startPreview();
  239. IsPreview = true;
  240. mCamera.autoFocus(autoFocusCB);
  241. }
  242. }
  243. }
  244. }
  245. };
  246. //用于刷新自动聚焦的方法
  247. AutoFocusCallback autoFocusCB = new AutoFocusCallback()
  248. {
  249. public void onAutoFocus(boolean success, Camera camera)
  250. {
  251. mAutoFocusHandler.postDelayed(doAutoFocus, 1000);
  252. }
  253. };
  254. //根据返回的代码值来返回相应的格式化数据
  255. public String GetResultByCode(int CodeType)
  256. {
  257. String mResult="";
  258. switch(CodeType)
  259. {
  260. //条形码
  261. case Symbol.CODABAR:
  262. mResult="条形码";
  263. break;
  264. //128编码格式二维码)
  265. case Symbol.CODE128:
  266. mResult="二维码";
  267. break;
  268. //QR码二维码
  269. case Symbol.QRCODE:
  270. mResult="二维码";
  271. break;
  272. //ISBN10图书查询
  273. case Symbol.ISBN10:
  274. mResult="图书ISBN号";
  275. break;
  276. //ISBN13图书查询
  277. case Symbol.ISBN13:
  278. mResult="图书ISBN号";
  279. break;
  280. }
  281. return mResult;
  282. }
  283. }
对于显示扫描结果的界面,代码比较简单

  1. /*
  2. * 返回扫描结果
  3. * 作者:秦元培
  4. * 时间:2013年12月21日
  5. * 总结:这里有一个问题,就是在这个界面上按下返回键的时候程序会立即报错,试着重写过相关的方法都解决不了问题
  6. * 谁要是知道这个问题怎么解决,记得给我说一声啊
  7. */
  8. package com.Android.ZBar4Android;
  9. import android.app.Activity;
  10. import android.content.Intent;
  11. import android.os.Bundle;
  12. import android.view.View;
  13. import android.view.View.OnClickListener;
  14. import android.view.Window;
  15. import android.widget.Button;
  16. import android.widget.TextView;
  17. public class ResultActivity extends Activity
  18. {
  19. private TextView tv;
  20. private Button BtnBack;
  21. @Override
  22. protected void onCreate(Bundle savedInstanceState)
  23. {
  24. super.onCreate(savedInstanceState);
  25. requestWindowFeature(Window.FEATURE_NO_TITLE);
  26. setContentView(R.layout.layout_result);
  27. //获取扫描结果
  28. Intent intent=getIntent();
  29. Bundle mData=intent.getExtras();
  30. CharSequence mResult=mData.getCharSequence("ScanResult");
  31. StringHelper mHelper=new StringHelper(mResult.toString());
  32. mResult=mHelper.SplitFormDict();
  33. tv=(TextView)findViewById(R.id.TextResult);
  34. tv.setText(mResult);
  35. //返回扫描界面
  36. BtnBack=(Button)findViewById(R.id.BtnBack);
  37. BtnBack.setOnClickListener(new OnClickListener()
  38. {
  39. @Override
  40. public void onClick(View arg0)
  41. {
  42. Intent intent=new Intent(ResultActivity.this,MainActivity.class);
  43. startActivity(intent);
  44. }
  45. });
  46. }
  47. @Override
  48. protected void onPause()
  49. {
  50. super.onPause();
  51. }
  52. }

五、总结

经过测试,可以快速地对二维码进行识别,并显示扫描结果。目前尚存在的问题有:

1、官方的文档说它是支持条形码、ISBN、二维码等多种形式的编码的,并且在程序代码中亦有所体现,但是实际测试中,发现二维码可以扫,其余的无法扫描

2、锁屏后再次打开程序会报错

3、与微信等类似的需要相机功能的软件冲突

4、校准框死活画不出来

5、在扫描结果界面下按下返回键,程序报错,无法拦截

欢迎大家积极寻找解决问题的方法,再次谢谢大家!

源代码下载


本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号