分享

Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果

 quasiceo 2014-11-13
分类: Android 高手进阶 2013-08-21 23:48 49799人阅读 评论(227) 收藏 举报

转载请注明出处:http://blog.csdn.net/xiaanming/article/details/10163203

了解二维码这个东西还是从微信中,当时微信推出二维码扫描功能,自己感觉挺新颖的,从一张图片中扫一下竟然能直接加好友,不可思议啊,那时候还不了解二维码,呵呵,然后做项目的时候,老板说要加上二维码扫描功能,然后自己的屁颠屁颠的去百度,google啥的,发现很多朋友都有介绍二维码扫描的功能,然后我就跟着人家的介绍自己搞起了二维码扫描功能,跟着人家的帖子,很快我的项目就加入了扫描二维码的功能,然后自己还很开心。


随着微信的到来,二维码越来越火爆,随处能看到二维码,比如商城里面,肯德基,餐厅等等,对于二维码扫描我们使用的是google的开源框架Zxing,我们可以去http://code.google.com/p/zxing/下载源码和Jar包,之前我项目中的二维码扫描功能只实现了扫描功能,其UI真的是其丑无比,一个好的应用软件,其UI界面也要被大众所接纳,不然人家就不会用你的软件啦,所以说应用软件功能和界面一样都很重要,例如微信,相信微信UI被很多应用软件所模仿,我也仿照微信扫描二维码效果进行模仿,虽然没有微信做的那么精致,但是效果还是可以的,所以将自己修改UI的代码和扫描二维码的代码分享给大家,一是自己以后项目遇到同样的功能直接拷贝来用,二是给还没有加入二维码功能的人一个参考,站在巨人的肩膀上,哈哈,我之前也是站在巨人的肩膀上加上此功能,接下来跟着我一步一步来实现此项功能,里面去除了很多不必要的文件


我们先看下项目的结构


  • 如果你项目也想加入此功能,你直接将com.mining.app.zxing.camera,com.mining.app.zxing.decoding,com.mining.app.zxing.view这三个包拷贝到你的项目中,然后引入相对应的资源进去,我也是从我的项目中直接引用过来的,包名都没改呢,当然还需要引用Zxing.jar
  • com.example.qr_codescan包里面有一个MipcaActivityCapture,也是直接引入我之前项目的代码的,这个Activity主要处理扫描界面的类,比如,扫描成功有声音和振动等等,主要关注里面的handleDecode(Result result, Bitmap barcode)方法,扫描完成之后将扫描到的结果和二维码的bitmap当初参数传递到handleDecode(Result result, Bitmap barcode)里面,我们只需要在里面写出相对应的处理代码即可,其他的地方都不用改得,我这里处理扫描结果和扫描拍的照片

  1. /** 
  2.  * 处理扫描结果 
  3.  * @param result 
  4.  * @param barcode 
  5.  */  
  6. public void handleDecode(Result result, Bitmap barcode) {  
  7.     inactivityTimer.onActivity();  
  8.     playBeepSoundAndVibrate();  
  9.     String resultString = result.getText();  
  10.     if (resultString.equals("")) {  
  11.         Toast.makeText(MipcaActivityCapture.this"Scan failed!", Toast.LENGTH_SHORT).show();  
  12.     }else {  
  13.         Intent resultIntent = new Intent();  
  14.         Bundle bundle = new Bundle();  
  15.         bundle.putString("result", resultString);  
  16.         bundle.putParcelable("bitmap", barcode);  
  17.         resultIntent.putExtras(bundle);  
  18.         this.setResult(RESULT_OK, resultIntent);  
  19.     }  
  20.     MipcaActivityCapture.this.finish();  
  21. }  
  • 我对MipcaActivityCapture界面的布局做了自己的改动,先看下效果图,主要是用到FrameLayout,里面嵌套RelativeLayout,里面的图片也是从微信里面拿出来的,平常我看到需要什么图片就去微信里面找,没有美工的公司的程序员就是苦逼


布局代码如下

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <FrameLayout xmlns:android="http://schemas./apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.         android:layout_height="fill_parent" >  
  5.   
  6.     <RelativeLayout  
  7.         android:layout_width="fill_parent"  
  8.         android:layout_height="fill_parent" >  
  9.   
  10.         <SurfaceView  
  11.             android:id="@+id/preview_view"  
  12.             android:layout_width="fill_parent"  
  13.             android:layout_height="fill_parent"  
  14.             android:layout_gravity="center" />  
  15.   
  16.         <com.mining.app.zxing.view.ViewfinderView  
  17.             android:id="@+id/viewfinder_view"  
  18.             android:layout_width="wrap_content"  
  19.             android:layout_height="wrap_content" />  
  20.   
  21.         <include  
  22.             android:id="@+id/include1"  
  23.             android:layout_width="fill_parent"  
  24.             android:layout_height="wrap_content"  
  25.             android:layout_alignParentTop="true"  
  26.             layout="@layout/activity_title" />  
  27.     </RelativeLayout>  
  28.   
  29. </FrameLayout>  
在里面我将界面上面部分写在另一个布局里面,然后include进来,因为这个activity_title在我项目里面还供其他的Activity使用,我也是直接拷贝出来的
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas./apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:background="@drawable/mmtitle_bg_alpha" >  
  6.   
  7.     <Button  
  8.         android:id="@+id/button_back"  
  9.         android:layout_width="75.0dip"  
  10.         android:text="返回"  
  11.         android:background="@drawable/mm_title_back_btn"  
  12.         android:textColor="@android:color/white"  
  13.         android:layout_height="wrap_content"  
  14.         android:layout_centerVertical="true"  
  15.         android:layout_marginLeft="2dip" />  
  16.   
  17.     <TextView  
  18.         android:id="@+id/textview_title"  
  19.         android:layout_width="wrap_content"  
  20.         android:layout_height="wrap_content"  
  21.         android:layout_alignBaseline="@+id/button_back"  
  22.         android:layout_alignBottom="@+id/button_back"  
  23.         android:layout_centerHorizontal="true"  
  24.         android:gravity="center_vertical"  
  25.         android:text="二维码扫描"  
  26.         android:textColor="@android:color/white"  
  27.         android:textSize="18sp" />  
  28.   
  29. </RelativeLayout>  
  • 在我这个demo里面,有一个主界面MainActivity,里面一个Button, 一个ImageView和一个TextView,点击Button进入到二维码扫描界面,当扫描OK的时候,回到主界面,将扫描的结果显示到TextView,将图片显示到ImageView里面,然后你可以不处理图片,我这里随带的加上图片,主界面的布局很简单如下
  1. <RelativeLayout xmlns:android="http://schemas./apk/res/android"  
  2.     xmlns:tools="http://schemas./tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:background="#ffe1e0de" >  
  6.   
  7.     <Button  
  8.         android:id="@+id/button1"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="wrap_content"  
  11.         android:layout_alignParentTop="true"  
  12.         android:text="扫描二维码" />  
  13.   
  14.     <TextView  
  15.         android:id="@+id/result"  
  16.         android:layout_width="fill_parent"  
  17.         android:layout_height="wrap_content"  
  18.         android:layout_below="@+id/button1"  
  19.         android:lines="2"  
  20.         android:gravity="center_horizontal"  
  21.         android:textColor="@android:color/black"  
  22.         android:textSize="16sp" />  
  23.   
  24.     <ImageView  
  25.         android:id="@+id/qrcode_bitmap"  
  26.         android:layout_width="fill_parent"  
  27.         android:layout_height="fill_parent"  
  28.         android:layout_alignParentLeft="true"  
  29.         android:layout_below="@+id/result"/>  
  30. </RelativeLayout>  
  • MainActivity里面的代码如下,里面的功能在上面已经说了
  1. package com.example.qr_codescan;  
  2.   
  3.   
  4. import android.app.Activity;  
  5. import android.content.Intent;  
  6. import android.graphics.Bitmap;  
  7. import android.os.Bundle;  
  8. import android.view.View;  
  9. import android.view.View.OnClickListener;  
  10. import android.widget.Button;  
  11. import android.widget.ImageView;  
  12. import android.widget.TextView;  
  13.   
  14. public class MainActivity extends Activity {  
  15.     private final static int SCANNIN_GREQUEST_CODE = 1;  
  16.     /** 
  17.      * 显示扫描结果 
  18.      */  
  19.     private TextView mTextView ;  
  20.     /** 
  21.      * 显示扫描拍的图片 
  22.      */  
  23.     private ImageView mImageView;  
  24.       
  25.   
  26.     @Override  
  27.     protected void onCreate(Bundle savedInstanceState) {  
  28.         super.onCreate(savedInstanceState);  
  29.         setContentView(R.layout.activity_main);  
  30.           
  31.         mTextView = (TextView) findViewById(R.id.result);   
  32.         mImageView = (ImageView) findViewById(R.id.qrcode_bitmap);  
  33.           
  34.         //点击按钮跳转到二维码扫描界面,这里用的是startActivityForResult跳转  
  35.         //扫描完了之后调到该界面  
  36.         Button mButton = (Button) findViewById(R.id.button1);  
  37.         mButton.setOnClickListener(new OnClickListener() {  
  38.               
  39.             @Override  
  40.             public void onClick(View v) {  
  41.                 Intent intent = new Intent();  
  42.                 intent.setClass(MainActivity.this, MipcaActivityCapture.class);  
  43.                 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
  44.                 startActivityForResult(intent, SCANNIN_GREQUEST_CODE);  
  45.             }  
  46.         });  
  47.     }  
  48.       
  49.       
  50.     @Override  
  51.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  52.         super.onActivityResult(requestCode, resultCode, data);  
  53.         switch (requestCode) {  
  54.         case SCANNIN_GREQUEST_CODE:  
  55.             if(resultCode == RESULT_OK){  
  56.                 Bundle bundle = data.getExtras();  
  57.                 //显示扫描到的内容  
  58.                 mTextView.setText(bundle.getString("result"));  
  59.                 //显示  
  60.                 mImageView.setImageBitmap((Bitmap) data.getParcelableExtra("bitmap"));  
  61.             }  
  62.             break;  
  63.         }  
  64.     }     
  65.   
  66. }  


  • 上面的代码还是比较简单,但是要想做出像微信那样只的扫描框,紧紧上面的代码是没有那种效果的,我们必须重写com.mining.app.zxing.view包下面的ViewfinderView类,微信里面的都是用的图片,我是自己画出来的,代码注释的比较清楚,大家直接看代码吧,相信你能理解的,如果你要修改扫描框的大小,去CameraManager类里面修改
  1. /* 
  2.  * Copyright (C) 2008 ZXing authors 
  3.  * 
  4.  * Licensed under the Apache License, Version 2.0 (the "License"); 
  5.  * you may not use this file except in compliance with the License. 
  6.  * You may obtain a copy of the License at 
  7.  * 
  8.  *      http://www./licenses/LICENSE-2.0 
  9.  * 
  10.  * Unless required by applicable law or agreed to in writing, software 
  11.  * distributed under the License is distributed on an "AS IS" BASIS, 
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
  13.  * See the License for the specific language governing permissions and 
  14.  * limitations under the License. 
  15.  */  
  16.   
  17. package com.mining.app.zxing.view;  
  18.   
  19. import java.util.Collection;  
  20. import java.util.HashSet;  
  21.   
  22. import android.content.Context;  
  23. import android.content.res.Resources;  
  24. import android.graphics.Bitmap;  
  25. import android.graphics.Canvas;  
  26. import android.graphics.Color;  
  27. import android.graphics.Paint;  
  28. import android.graphics.Rect;  
  29. import android.graphics.Typeface;  
  30. import android.util.AttributeSet;  
  31. import android.view.View;  
  32.   
  33. import com.example.qr_codescan.R;  
  34. import com.google.zxing.ResultPoint;  
  35. import com.mining.app.zxing.camera.CameraManager;  
  36.   
  37. /** 
  38.  * This view is overlaid on top of the camera preview. It adds the viewfinder 
  39.  * rectangle and partial transparency outside it, as well as the laser scanner 
  40.  * animation and result points. 
  41.  *  
  42.  */  
  43. public final class ViewfinderView extends View {  
  44.     private static final String TAG = "log";  
  45.     /** 
  46.      * 刷新界面的时间 
  47.      */  
  48.     private static final long ANIMATION_DELAY = 10L;  
  49.     private static final int OPAQUE = 0xFF;  
  50.   
  51.     /** 
  52.      * 四个绿色边角对应的长度 
  53.      */  
  54.     private int ScreenRate;  
  55.       
  56.     /** 
  57.      * 四个绿色边角对应的宽度 
  58.      */  
  59.     private static final int CORNER_WIDTH = 10;  
  60.     /** 
  61.      * 扫描框中的中间线的宽度 
  62.      */  
  63.     private static final int MIDDLE_LINE_WIDTH = 6;  
  64.       
  65.     /** 
  66.      * 扫描框中的中间线的与扫描框左右的间隙 
  67.      */  
  68.     private static final int MIDDLE_LINE_PADDING = 5;  
  69.       
  70.     /** 
  71.      * 中间那条线每次刷新移动的距离 
  72.      */  
  73.     private static final int SPEEN_DISTANCE = 5;  
  74.       
  75.     /** 
  76.      * 手机的屏幕密度 
  77.      */  
  78.     private static float density;  
  79.     /** 
  80.      * 字体大小 
  81.      */  
  82.     private static final int TEXT_SIZE = 16;  
  83.     /** 
  84.      * 字体距离扫描框下面的距离 
  85.      */  
  86.     private static final int TEXT_PADDING_TOP = 30;  
  87.       
  88.     /** 
  89.      * 画笔对象的引用 
  90.      */  
  91.     private Paint paint;  
  92.       
  93.     /** 
  94.      * 中间滑动线的最顶端位置 
  95.      */  
  96.     private int slideTop;  
  97.       
  98.     /** 
  99.      * 中间滑动线的最底端位置 
  100.      */  
  101.     private int slideBottom;  
  102.       
  103.     private Bitmap resultBitmap;  
  104.     private final int maskColor;  
  105.     private final int resultColor;  
  106.       
  107.     private final int resultPointColor;  
  108.     private Collection<ResultPoint> possibleResultPoints;  
  109.     private Collection<ResultPoint> lastPossibleResultPoints;  
  110.   
  111.     boolean isFirst;  
  112.       
  113.     public ViewfinderView(Context context, AttributeSet attrs) {  
  114.         super(context, attrs);  
  115.           
  116.         density = context.getResources().getDisplayMetrics().density;  
  117.         //将像素转换成dp  
  118.         ScreenRate = (int)(20 * density);  
  119.   
  120.         paint = new Paint();  
  121.         Resources resources = getResources();  
  122.         maskColor = resources.getColor(R.color.viewfinder_mask);  
  123.         resultColor = resources.getColor(R.color.result_view);  
  124.   
  125.         resultPointColor = resources.getColor(R.color.possible_result_points);  
  126.         possibleResultPoints = new HashSet<ResultPoint>(5);  
  127.     }  
  128.   
  129.     @Override  
  130.     public void onDraw(Canvas canvas) {  
  131.         //中间的扫描框,你要修改扫描框的大小,去CameraManager里面修改  
  132.         Rect frame = CameraManager.get().getFramingRect();  
  133.         if (frame == null) {  
  134.             return;  
  135.         }  
  136.           
  137.         //初始化中间线滑动的最上边和最下边  
  138.         if(!isFirst){  
  139.             isFirst = true;  
  140.             slideTop = frame.top;  
  141.             slideBottom = frame.bottom;  
  142.         }  
  143.           
  144.         //获取屏幕的宽和高  
  145.         int width = canvas.getWidth();  
  146.         int height = canvas.getHeight();  
  147.   
  148.         paint.setColor(resultBitmap != null ? resultColor : maskColor);  
  149.           
  150.         //画出扫描框外面的阴影部分,共四个部分,扫描框的上面到屏幕上面,扫描框的下面到屏幕下面  
  151.         //扫描框的左边面到屏幕左边,扫描框的右边到屏幕右边  
  152.         canvas.drawRect(00, width, frame.top, paint);  
  153.         canvas.drawRect(0, frame.top, frame.left, frame.bottom + 1, paint);  
  154.         canvas.drawRect(frame.right + 1, frame.top, width, frame.bottom + 1,  
  155.                 paint);  
  156.         canvas.drawRect(0, frame.bottom + 1, width, height, paint);  
  157.           
  158.           
  159.   
  160.         if (resultBitmap != null) {  
  161.             // Draw the opaque result bitmap over the scanning rectangle  
  162.             paint.setAlpha(OPAQUE);  
  163.             canvas.drawBitmap(resultBitmap, frame.left, frame.top, paint);  
  164.         } else {  
  165.   
  166.             //画扫描框边上的角,总共8个部分  
  167.             paint.setColor(Color.GREEN);  
  168.             canvas.drawRect(frame.left, frame.top, frame.left + ScreenRate,  
  169.                     frame.top + CORNER_WIDTH, paint);  
  170.             canvas.drawRect(frame.left, frame.top, frame.left + CORNER_WIDTH, frame.top  
  171.                     + ScreenRate, paint);  
  172.             canvas.drawRect(frame.right - ScreenRate, frame.top, frame.right,  
  173.                     frame.top + CORNER_WIDTH, paint);  
  174.             canvas.drawRect(frame.right - CORNER_WIDTH, frame.top, frame.right, frame.top  
  175.                     + ScreenRate, paint);  
  176.             canvas.drawRect(frame.left, frame.bottom - CORNER_WIDTH, frame.left  
  177.                     + ScreenRate, frame.bottom, paint);  
  178.             canvas.drawRect(frame.left, frame.bottom - ScreenRate,  
  179.                     frame.left + CORNER_WIDTH, frame.bottom, paint);  
  180.             canvas.drawRect(frame.right - ScreenRate, frame.bottom - CORNER_WIDTH,  
  181.                     frame.right, frame.bottom, paint);  
  182.             canvas.drawRect(frame.right - CORNER_WIDTH, frame.bottom - ScreenRate,  
  183.                     frame.right, frame.bottom, paint);  
  184.   
  185.               
  186.             //绘制中间的线,每次刷新界面,中间的线往下移动SPEEN_DISTANCE  
  187.             slideTop += SPEEN_DISTANCE;  
  188.             if(slideTop >= frame.bottom){  
  189.                 slideTop = frame.top;  
  190.             }  
  191.             canvas.drawRect(frame.left + MIDDLE_LINE_PADDING, slideTop - MIDDLE_LINE_WIDTH/2, frame.right - MIDDLE_LINE_PADDING,slideTop + MIDDLE_LINE_WIDTH/2, paint);  
  192.               
  193.               
  194.             //画扫描框下面的字  
  195.             paint.setColor(Color.WHITE);  
  196.             paint.setTextSize(TEXT_SIZE * density);  
  197.             paint.setAlpha(0x40);  
  198.             paint.setTypeface(Typeface.create("System", Typeface.BOLD));  
  199.             canvas.drawText(getResources().getString(R.string.scan_text), frame.left, (float) (frame.bottom + (float)TEXT_PADDING_TOP *density), paint);  
  200.               
  201.               
  202.   
  203.             Collection<ResultPoint> currentPossible = possibleResultPoints;  
  204.             Collection<ResultPoint> currentLast = lastPossibleResultPoints;  
  205.             if (currentPossible.isEmpty()) {  
  206.                 lastPossibleResultPoints = null;  
  207.             } else {  
  208.                 possibleResultPoints = new HashSet<ResultPoint>(5);  
  209.                 lastPossibleResultPoints = currentPossible;  
  210.                 paint.setAlpha(OPAQUE);  
  211.                 paint.setColor(resultPointColor);  
  212.                 for (ResultPoint point : currentPossible) {  
  213.                     canvas.drawCircle(frame.left + point.getX(), frame.top  
  214.                             + point.getY(), 6.0f, paint);  
  215.                 }  
  216.             }  
  217.             if (currentLast != null) {  
  218.                 paint.setAlpha(OPAQUE / 2);  
  219.                 paint.setColor(resultPointColor);  
  220.                 for (ResultPoint point : currentLast) {  
  221.                     canvas.drawCircle(frame.left + point.getX(), frame.top  
  222.                             + point.getY(), 3.0f, paint);  
  223.                 }  
  224.             }  
  225.   
  226.               
  227.             //只刷新扫描框的内容,其他地方不刷新  
  228.             postInvalidateDelayed(ANIMATION_DELAY, frame.left, frame.top,  
  229.                     frame.right, frame.bottom);  
  230.               
  231.         }  
  232.     }  
  233.   
  234.     public void drawViewfinder() {  
  235.         resultBitmap = null;  
  236.         invalidate();  
  237.     }  
  238.   
  239.     /** 
  240.      * Draw a bitmap with the result points highlighted instead of the live 
  241.      * scanning display. 
  242.      *  
  243.      * @param barcode 
  244.      *            An image of the decoded barcode. 
  245.      */  
  246.     public void drawResultBitmap(Bitmap barcode) {  
  247.         resultBitmap = barcode;  
  248.         invalidate();  
  249.     }  
  250.   
  251.     public void addPossibleResultPoint(ResultPoint point) {  
  252.         possibleResultPoints.add(point);  
  253.     }  
  254.   
  255. }  

上面的代码中,中间那根线微信是用的图片,我这里是画的,如果你想更加仿真点就将下面的代码

  1. canvas.drawRect(frame.left + MIDDLE_LINE_PADDING, slideTop - MIDDLE_LINE_WIDTH/2, frame.right - MIDDLE_LINE_PADDING,slideTop + MIDDLE_LINE_WIDTH/2, paint);  

改成

  1. Rect lineRect = new Rect();  
  2.             lineRect.left = frame.left;  
  3.             lineRect.right = frame.right;  
  4.             lineRect.top = slideTop;  
  5.             lineRect.bottom = slideTop + 18;  
  6.             canvas.drawBitmap(((BitmapDrawable)(getResources().getDrawable(R.drawable.qrcode_scan_line))).getBitmap(), null, lineRect, paint);  

那条扫描线自己去微信里面找一下,我贴出来的失真了,下载微信apk,将后缀名改成zip,然后解压就行了

画扫描框下面字体的代码需要修改下,这样子能根据字体自动排列在中间,如果字太长我没有处理,那个要自动换行,你可以自行处理

  1. paint.setColor(Color.WHITE);    
  2. paint.setTextSize(TEXT_SIZE * density);    
  3. paint.setAlpha(0x40);    
  4. paint.setTypeface(Typeface.DEFAULT_BOLD);   
  5. String text = getResources().getString(R.string.R.string.scan_text);  
  6. float textWidth = paint.measureText(text);  
  7.   
  8. canvas.drawText(text, (width - textWidth)/2, (float) (frame.bottom + (float)TEXT_PADDING_TOP *density), paint)  

运行界面截图,其中中间的那根绿色的线会上下移动,跟微信的效果差不多,当然运行你还需要相对应的权限问题,有兴趣的朋友可以去下载demo



从8点多写这篇博客写到现在,看起来这么点字,但实际上还是比较耗时间的,如果你觉得这篇文章对你有帮助,你就顶一下,哈哈,洗澡睡觉去了,上面的项目中还有一些资源文件我没有贴出来,想要看效果可以下载源码


我在Android 基于google Zxing实现对手机中的二维码进行扫描这篇文章中实现了对手机中二维码照片的扫描,并且替换了中间的扫描线,和微信效果更加相似,建议大家去下那文章的项目源码


项目源码,点击下载




188
2
主题推荐
条形码 二维码 google 微信 android
猜你在找
Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
Google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
Android 基于google Zxing实现对手机中的二维码进行扫描
解决zxing “Could not find class 'com.goole.zxing.Result”和“Multiple dex files define”问题
基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
二维码、条形码扫描——使用Google ZXing
查看评论
130楼 meable_lee 2014-11-06 13:41发表 [回复]
其实我一直没看懂handleDecode这个方法是在哪个地方调用 的...
129楼 预谋邂逅_tk 2014-10-29 16:00发表 [回复]
单独运行楼主的例子很好没什么问题,但是移植到我自己的项目中,跳转之后黑屏,无法打开摄像头,也没有报错 这是什么原因呢,很着急,望楼主解答
128楼 sndndy 2014-10-26 14:26发表 [回复]
楼主我想在扫描界面加一个button,用于控制和关闭闪光灯,界面已经做好了,请问如何设置?
127楼 sndndy 2014-10-26 14:22发表 [回复]
楼主,我想在扫描界面中加一个BUTTON,用于开启和关闭闪光灯,界面已经好了,请问如何进行设置?
126楼 龍耗子 2014-10-23 15:11发表 [回复]
很好用,微信能扫的都能扫,不过不知道为什么我移植过去后扫描线很卡
125楼 pili_xiaoniu 2014-10-22 17:57发表 [回复]
为什么扫描的灵敏度那么差呢,用微信的没扫完就扫描成功,这个要扫十几次才能扫上
124楼 qq_17629555 2014-10-17 15:21发表 [回复]
必须要顶
123楼 behappy0_o 2014-10-14 16:52发表 [回复]
移植失败
【项目可运行。com.mining.app.zxing.view.ViewfinderView不显示】

Error Log
Tue Oct 14 16:16:52 CST 2014
activity_capture.xml: java.lang.NullPointerException

定位代码
ViewfinderView onDraw()
Rect frame = CameraManager.get().getFramingRect();

框架不会改,已放弃。

不过仍然感谢楼主, DEMO是好的
Re: behappy0_o 2014-10-14 16:57发表 [回复]
回复u014324292:Debug
getFramingRect()
Point screenResolution = configManager.getScreenResolution();
【configManager.getScreenResolution() 为空】
这里挂了 不明原因
Re: behappy0_o 2014-10-14 17:00发表 [回复]
回复u014324292:原因已查明, 权限没有copy进来。 因为一般我喜欢把权限放在 appliction标签前面写。 哎 我的错
122楼 cuicuixixi 2014-09-30 11:57发表 [回复]
感谢~
121楼 新长征路上的程序员 2014-09-27 17:18发表 [回复]
移植成功,非常好!
120楼 taok88 2014-09-27 11:51发表 [回复]
感谢楼主分享,菜鸟来学习了
119楼 taok88 2014-09-27 11:50发表 [回复]
感谢楼主分享,菜鸟来学习了
118楼 weileng0723 2014-09-22 18:33发表 [回复]
感谢博主分享,学习了。
117楼 Edward44512 2014-09-22 14:52发表 [回复]
看大家的评论,好像功能还是有点点问题需完善啊
116楼 kwondochou 2014-09-19 07:27发表 [回复]
扫描中画面好像发生了拉伸,这个是什么原因导致的。。
115楼 赵小赵 2014-09-16 21:28发表 [回复]
只调用一次
在CaptureActivity中返回成功的handler中加入
restartPreviewAndDecode();这句
114楼 赵小赵 2014-09-16 21:26发表 [回复]
看到很多人说只能扫一次,修改如下
在CaptureActivity成功的hanlde中加上restartPreviewAndDecode();这句就行了
113楼 yb121011045 2014-09-09 11:39发表 [回复]
楼主!请问一下,平板电脑和手机端的一样吗?我运行在平板电脑上怎么没反应!
Re: yb121011045 2014-09-09 17:35发表 [回复]
回复yb121011045:我吧调用后置摄像头换成前置也是不行的
112楼 abcwanss 2014-09-06 16:37发表 [回复]
天大问题,请lz不要漠视啊: 我想让其他的应用调用我这个二维码扫描的功能具体情况要怎么搞?
111楼 u010289384 2014-08-28 14:43发表 [回复]
总算找到一个大些的了,呵呵!能用就好啊!
110楼 jackeysun6032 2014-08-27 16:48发表 [回复]
楼主,首先感谢你的分享。其次,我想问:如果在扫描框上面建一个textView,怎么让扫描结果在这个textView中显示!希望楼主尽快回复,急用!!!!谢谢!!!!
109楼 轰炸机1 2014-08-22 16:49发表 [回复]
楼主威武,我想请问一下,怎么做才能连续扫描,不回传到上一个activity呢。
108楼 qq_19527793 2014-08-18 14:57发表 [回复]
“你直接将com.mining.app.zxing.camera,com.mining.app.zxing.decoding,com.mining.app.zxing.view这三个包拷贝到你的项目中,然后引入相对应的资源进去”相对应的资源进去是指那些资源
107楼 LCY201005 2014-08-12 17:31发表 [回复]
呵呵呵,崩溃了
106楼 怖丁儿 2014-08-06 14:53发表 [回复]
扫描框的大小改变之后,扫描时系统就崩溃了,求解答
105楼 fuchen_91 2014-08-05 18:12发表 [回复]
博主,按照你说的修改扫描框的宽度。但是换个屏幕小的手机就不行了。我想问问,怎样让他的宽度去适应不同尺寸的屏幕
104楼 YK_love_GQ 2014-07-31 18:29发表 [回复]
只能扫描一次,要退出来才能再扫描,这点不好。
103楼 速_创_圣_迹 2014-07-31 16:54发表 [回复]
引用“u010390677”的评论:顶一个,不过貌似有点问题,也看了下大家的评论,扫描框的大小、位置变化之后貌似就扫不出来了,哪位大神看...
102楼 精神病人思路广_ 2014-07-31 15:29发表 [回复]
请问博主,各位好心developer你我想将扫描后,跳转到第三个界面,不想返回第一界面,除了修改startforActivity方法,还要修改那些地方
101楼 hcjcch 2014-07-30 20:54发表 [回复]
您好,按照您的方式,改变了扫描筐的大小,然后会崩溃,我没有找出原因i,求指导
Re: 速_创_圣_迹 2014-07-31 16:50发表 [回复]
回复u011028726:和你一样呢,改下扫描器的高宽,居然就没用了,到底怎么回事?楼主lz快来帮忙解答一下啊
100楼 精神病人思路广_ 2014-07-30 16:57发表 [回复]
我是菜鸟啊,,我想知道,把三个包复制后,又将xml文件引入了,再将zing包复制到libs文件夹之后,还是报错,该怎样怎么办呢,求老手指点一下,这点东西,已经搞了好几天了。
99楼 dzhiheng 2014-07-29 18:23发表 [回复]
现在是上到下扫描,我想改为,左到右扫描界面
98楼 sinat_18145273 2014-07-25 11:49发表 [回复]
代码可用,需要把图片传输注释掉,其他正常,感谢楼主分享
Re: sinat_18145273 2014-07-25 11:55发表 [回复]
回复sinat_18145273:请问楼主
if (currentPossible.isEmpty()) {
lastPossibleResultPoints = null;
} else {
// possibleResultPoints = new HashSet<ResultPoint>(5);
// lastPossibleResultPoints = currentPossible;
// paint.setAlpha(OPAQUE);
// paint.setColor(resultPointColor);
// for (ResultPoint point : currentPossible) {
// canvas.drawCircle(frame.left + point.getX(), frame.top
// + point.getY(), 6.0f, paint);
// }
}

if (currentLast != null) {
// paint.setAlpha(OPAQUE / 2);
// paint.setColor(resultPointColor);
// for (ResultPoint point : currentLast) {
// canvas.drawCircle(frame.left + point.getX(), frame.top
// + point.getY(), 3.0f, paint);
// }
}
这段代码有啥作用,去掉后黄点就没有了,功能正常使用,是否有其他影响;还有距离问题,CameraManager里的宽高只能改变展示的大小,并不能改变距离问题,是否有其他方法,微信很近就能响应到
97楼 code_li 2014-07-25 08:19发表 [回复]
学习了不错的 谢谢
96楼 Chelsea雷霆 2014-07-24 11:14发表 [回复]
没有跳转。。。
95楼 Chelsea雷霆 2014-07-24 10:43发表 [回复]
加进去了。怎么扫码的界面怎么没有出来啊。
94楼 u010390677 2014-07-22 15:28发表 [回复]
顶一个,不过貌似有点问题,也看了下大家的评论,扫描框的大小、位置变化之后貌似就扫不出来了,哪位大神看到求指教~~再去研究研究下~~
93楼 璐璐璐二二 2014-07-20 14:39发表 [回复]
后哈后哈,已抱走
92楼 AJ-北京主席 2014-07-17 14:17发表 [回复]
条码扫描只能是单方向吗?
换90度就不行了.
91楼 lov_syc 2014-07-16 15:35发表 [回复]
楼主,为什么改变框框大小就不能扫描了?
90楼 sunny635533 2014-07-15 15:56发表 [回复]
扫描速度慢啊,不知道哪里可以修改?群主大人
89楼 menico_ 2014-07-15 12:01发表 [回复]
您好,我想改变那个扫描框的位置,应该在什么地方改呢?让扫描框在屏幕的上方而不是中央
88楼 shengfakun1234 2014-07-10 21:55发表 [回复]
请问我这里显示的时候 图片被拉长了怎么回事?
87楼 阿斐罗王 2014-07-09 14:31发表 [回复]
为什么我扫描二维码要隔很远的距离才能扫描成功
86楼 qq_16391643 2014-06-26 17:31发表 [回复]
我把activity改为fragment 但是放到activity中就不显示扫描的那一个了 全是黑界面 谁能帮忙改一下发过来定不胜感激 开始学的新手!
85楼 Syndicater 2014-06-22 18:37发表 [回复]
什么意思,扫完一次出来结果后,要怎么继续下次扫描啊???
Re: 过往旅行者 2014-07-11 11:33发表 [回复]
回复Syndicator:点击那个btn不就可以继续了吗、、、
84楼 jasonhyl 2014-06-09 09:00发表 [回复]
你好,下载了你的代码,请问在onActivityResult(int requestCode, int resultCode, Intent data) 里,如何能够得到data的byte[]呢,望解答,谢谢
Re: 过往旅行者 2014-07-11 11:41发表 [回复]
回复jasonhyl:汗,你这个返回数据要看你放进去神马数据啊,楼主放的bmp、、、你想要byte[]可以自己转换啊。
83楼 Joba2012 2014-06-07 18:53发表 [回复]
你好,我用zxing的时候,扫描二维码非常不灵敏,扫很旧都扫不出来,整体的代码跟你的差不多,但是我用的核心包是2.3的,不知道你有没有遇到过这种问题,如果有经验的话请分享一下,谢谢。
82楼 外天楼 2014-05-29 15:21发表 [回复]
程序隐含一个BUG,用bundle来序列化传图片的话。是有大小限制的,在高像素摄像头手机环境下,会出问题。最新的zxing源码已经改成了用byte[]来传图片,建议修改一下。
Re: 逆流残魅笑 2014-09-05 16:48发表 [回复]
回复waitianlou:多谢82楼的大神
Re: yeyuxp 2014-06-03 09:52发表 [回复]
回复waitianlou:多谢,请问在哪儿才能下载最新的依靠byte[]来传递图片的zxing源码呢 ?
Re: meable_lee 2014-11-06 13:44发表 [回复]
回复yeyuxp:同问,求大神破解
81楼 学习者mm 2014-05-29 13:49发表 [回复]
那个黄点怎么去掉呀,各位大神。。。
Re: xiaanming 2014-05-29 14:14发表 [回复]
回复u013216929:找到ViewfinderView这个类,注释掉下面的代码就行了
for (ResultPoint point : currentLast) {
canvas.drawCircle(frame.left + point.getX(), frame.top
+ point.getY(), 3.0f, paint);
}
80楼 mjy2012 2014-05-26 22:25发表 [回复]
请问楼主,为什么扫面csdn的二维码,出来的是 http://weixin.qq.com/r/XHWSnSrEzhSxhzv_nyB4
79楼 学习者mm 2014-05-24 16:47发表 [回复]
用什么那个黄色的点就没有了。。。。各位大神呀
78楼 dw5206377 2014-05-23 20:17发表 [回复]
感谢分享!!!!!!!
77楼 dw5206377 2014-05-23 15:49发表 [回复]
感谢分享!!!!!
76楼 夜月飞扬 2014-05-22 14:01发表 [回复]
感谢楼主分享,之前只是简单的拿来用,现在也可以改成自己想要的界面了
75楼 rajeshjy 2014-05-17 17:41发表 [回复]
为什么在CameraManager里改了大小之后,扫描完成就直接退出了啊?
74楼 ai12345qwert 2014-05-13 23:07发表 [回复]
我遇到的问题是扫描成功后,跳转不到MainActivity,直接到了一个黑色的界面,看程序代码页没错,但是就是跳转不了
Re: xiaanming 2014-05-14 09:06发表 [回复]
回复ai12345qwert:将扫描界面的Bitmap删除掉,估计是bitmap太大,而Intent携带数据的大小有限制
Re: 学习者mm 2014-05-29 14:05发表 [回复]
回复xiaanming:我想知道黄点可以去掉么
73楼 stepingforward 2014-05-12 15:16发表 [回复]
楼主大神,请问预览时候偶尔会出现那个黄色的小点点该怎么去掉?!!!!
72楼 east-evil 2014-04-30 09:49发表 [回复]
为什么在CameraManager里改了大小之后,扫描完成就直接退出了啊?
Re: rajeshjy 2014-05-17 17:33发表 [回复]
回复a541006:我也遇见了这个问题,不知道您解决了吗?
Re: meable_lee 2014-11-06 13:39发表 [回复]
回复rajeshjy:相同的问题,有大神可以帮忙解决吗
Re: east-evil 2014-05-26 14:21发表 [回复]
回复rajeshjy:没有解决,估计楼主不理这些小问题,还是自己慢慢研究吧,您要是解决了告诉我一下啊
Re: antsoftware 2014-07-17 11:55发表 [回复]
回复a541006:有可能是setResult返回BitMap
太大 你注释点看看
71楼 fufengrui 2014-04-29 10:23发表 [回复]
运行过程中,出现这个问题的:
java.lang.NoClassDefFoundError:com.mining.app.zxing.view.ViewfinderResultPointCallback
是因为没有正确的引入lib。
解决方法:
在libs目录上点右键,选Bulid path –> Use as source folder。
菜单栏:Project -> Clean..一下就好了
Re: ai12345qwert 2014-05-13 08:50发表 [回复]
回复fufengrui:兄弟,我也遇到这个问题了,按照你的做法将libs--Use as source folder,然后Clean project后,再运行时报错如下:

[2014-05-13 08:49:35 - QR_CodeScan] Dx
UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.IllegalArgumentException: already added: Lcom/google/zxing/BarcodeFormat;
at com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:122)
[2014-05-13 08:49:35 - QR_CodeScan] Dx 1 error; aborting
[2014-05-13 08:49:35 - QR_CodeScan] Conversion to Dalvik format failed with error 1
Re: ai12345qwert 2014-05-13 23:02发表 [回复]
回复ai12345qwert:已解决,项目中zxing.jar和core.jar重复了,删除一个即可
70楼 xjsp316 2014-04-24 17:18发表 [回复]
学习了!
69楼 紫气从东来 2014-04-21 15:01发表 [回复]
执行Toast.makeText(MipcaActivityCapture.this, "Scan failed!", Toast.LENGTH_SHORT).show(); 后上面的黄色点不出现,就是说摄像头识别不了二维码,仅是摄像头显示图像,是什么原因?

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多