Android zxing parsing Two-dimensional code, creating a QR Code minimalist demo

Source: Internet
Author: User
Tags addall

Zxing Official code Many, looks very laborious, this demo only extracts the useful part, realizes the camera preview decoding, parses the local QR code, produces the QR code three function.

The simplified structure is as follows:

Nonsense less say directly on the code:

Basedecodehandler:

Package Com.song.zxing.decode;import Android.graphics.bitmap;import Android.os.bundle;import Com.google.zxing.barcodeformat;import Com.google.zxing.decodehinttype;import Com.google.zxing.MultiFormatReader; Import Com.google.zxing.planaryuvluminancesource;import Java.io.bytearrayoutputstream;import java.util.ArrayList; Import Java.util.collection;import java.util.enummap;import java.util.enumset;import java.util.Map;/** * Created by Administrator on 2015/12/16.    */public class Basedecodehandler {Multiformatreader multiformatreader;    Public Basedecodehandler () {initreader ();        } private void Initreader () {multiformatreader = new Multiformatreader ();        Map<decodehinttype, object> hints = new Enummap<decodehinttype, object> (Decodehinttype.class);        collection<barcodeformat> decodeformats = new arraylist<barcodeformat> ();        Decodeformats.addall (Enumset.of (Barcodeformat.qr_code)); Decodeformats.addall (Enumset.of (barcodeformAt.        Codabar));        Hints.put (Decodehinttype.possible_formats, decodeformats);    Multiformatreader.sethints (hints);        Public bundle Getthumbdata (Planaryuvluminancesource source) {Bundle bundle = new Bundle ();        int[] pixels = source.renderthumbnail ();        int width = source.getthumbnailwidth ();        int height = source.getthumbnailheight ();        Bitmap Bitmap = bitmap.createbitmap (pixels, 0, width, width, height, Bitmap.Config.ARGB_8888);        Bytearrayoutputstream out = new Bytearrayoutputstream ();        Bitmap.compress (Bitmap.CompressFormat.JPEG, N, out);        Bundle.putbytearray ("Data", Out.tobytearray ());    return bundle; }}

  

Previewdecodehandler:
Package Com.song.zxing.decode;import Android.graphics.rect;import Android.hardware.camera;import Android.os.handler;import Android.os.message;import Com.google.zxing.binarybitmap;import Com.google.zxing.planaryuvluminancesource;import Com.google.zxing.readerexception;import Com.google.zxing.Result ; Import Com.google.zxing.common.hybridbinarizer;import com.song.zxing.util.constant;/** * Created by Administrator on 2015/12/16.    */public class Previewdecodehandler extends Basedecodehandler implements Camera.previewcallback {private rect rect;    private Boolean running;    Private Handler Handler;        Public Previewdecodehandler (Rect rect, Handler Handler) {this.rect = rect;    This.handler = handler;        } @Override public void Onpreviewframe (byte[] data, camera camera) {if (running) {return;    } decode (data, camera); } private void Decode (byte[] data, camera camera) {camera.size Size = Camera.getparameters (). Getpreviewsize ();        running = true;        Here, you need to flip the retrieved data, because the camera defaults to the byte[of the horizontal screen] Rotateddata = new Byte[data.length];  for (int y = 0, y < size.height; y++) {for (int x = 0; x < size.width; + +) rotateddata[x        * Size.Height + size.height-y-1] = data[x + y * size.width];        }//Width height also to adjust the int tmp = Size.width;        Size.width = Size.Height;        Size.Height = tmp;        Result rawresult = null;        Go ahead and assume it's YUV rather than die. Planaryuvluminancesource Source = new Planaryuvluminancesource (Rotateddata, Size.width, Size.Height, Rect.left,        Rect.top, Rect.width (), Rect.height (), false);        Binarybitmap bitmap = new Binarybitmap (new Hybridbinarizer (source));        try {rawresult = multiformatreader.decodewithstate (bitmap);        } catch (Readerexception re) {//Continue} finally {Multiformatreader.reset ();     } if (Rawresult! = null) {       if (handler! = null) {Message msg = Message.obtain (Handler, constant.value_decode_success, Rawresul T.gettext ());//Msg.setdata (Getthumbdata (source));            Remove the annotations to get the final picture msg.sendtotarget ();    }} running = false; }}

  

Cameraview:

Package Com.song.zxing.ui;import Android.app.activity;import Android.content.context;import Android.hardware.camera;import Android.util.attributeset;import Android.view.surfaceholder;import Android.view.surfaceview;import Com.song.zxing.app;import Com.song.zxing.util.autofocusmanager;import java.util.list;/** * Use decrypted Api Mcamera */public class Cameraview extends Surfaceview implements Surfaceholder.call    Back {private Camera mcamera;    Private Surfaceholder Mholder;    Private Autofocusmanager Autofocusmanager;        Public Cameraview (Context context) {super (context);    Init ();        } public Cameraview (context context, AttributeSet Attrs) {Super (context, attrs);    Init (); } public Cameraview (context context, AttributeSet attrs, int defstyleattr) {Super (context, attrs, defstyleattr)        ;    Init ();        } private void Init () {mholder = Getholder ();    Mholder.addcallback (this); } @Override public void surfacecreated (Surfaceholder holder) {try {Mcamera = Camera.open ();            } catch (Exception e) {e.printstacktrace ();            App.toast ("Camera open Failed");        (Activity) GetContext ()). Finish (); }} @Override public void surfacechanged (surfaceholder holder, int format, int width, int height) {if (MH        Older.getsurface () = = null) {return;            } try {mcamera.setdisplayorientation (90);            Mcamera.setpreviewdisplay (Mholder);            Setpreviewsize ();        Start ();        } catch (Exception e) {e.printstacktrace ();        }} @Override public void surfacedestroyed (Surfaceholder holder) {release ();    Autofocusmanager.stop ();        } private void Setpreviewsize () {if (Mcamera = = null) return;        Camera.parameters Parameters = Mcamera.getparameters (); Camera.size camerasize = getoptimalpreviewsize (parameters.getsupportedpreviewsizes (), App.getScreenHeIght (), App.getscreenwidth ()); Camera.size picturesize = getoptimalpreviewsize (parameters.getsupportedpicturesizes (), App.getScreenHeight (),        App.getscreenwidth ());        Parameters.setpreviewsize (Camerasize.width, camerasize.height);        Parameters.setpicturesize (Picturesize.width, picturesize.height);    Mcamera.setparameters (parameters); } private Camera.size Getoptimalpreviewsize (list<camera.size> sizes, int w, int h) {Final double aspect_t        Olerance = 0.1;        Double targetratio = (double) w/h;        if (sizes = = NULL) return null;        Camera.size optimalsize = null;        Double Mindiff = Double.max_value;            for (Camera.size size:sizes) {double ratio = (double) size.width/size.height;            if (Math.Abs (ratio-targetratio) > Aspect_tolerance) continue;                if (Math.Abs (size.height-h) < Mindiff) {optimalsize = size;            Mindiff = Math.Abs (size.height-h);   }     }//Cannot find the one match the aspect ratio, ignore the requirement if (optimalsize = = null) {            Mindiff = Double.max_value; for (Camera.size size:sizes) {if (Math.Abs (size.height-h) < Mindiff) {Optimalsi                    ze = size;                Mindiff = Math.Abs (size.height-h);    }}} return optimalsize; public void Capture (Camera.picturecallback callback) {if (Mcamera! = null) mcamera.takepicture (nul    L, NULL, callback);    } public void Stoppreview () {if (Mcamera! = null) Mcamera.stoppreview (); } public void Setpreviewcallback (Camera.previewcallback callback) {if (Mcamera! = null) {mcamera.se        Tpreviewcallback (callback);            }} private void Start () {if (Mcamera! = null) {Mcamera.startpreview ();            Autofocusmanager = new Autofocusmanager (Mcamera); if (Listener = null) {listener.initsuccess ();            }}} public void release () {if (Mcamera! = null) {Mcamera.stoppreview ();            Mcamera.setpreviewcallback (NULL);            Mcamera.release ();        Mcamera = null;    }} Initlistener Listener;    public void Setinitlistener (Initlistener listener) {This.listener = listener;    } public interface Initlistener {void initsuccess (); }}

  

Screenoverlay:
Package Com.song.zxing.ui;import Android.content.context;import Android.graphics.bitmap;import Android.graphics.bitmapfactory;import Android.graphics.canvas;import Android.graphics.color;import Android.graphics.paint;import Android.graphics.rect;import Android.graphics.rectf;import Android.util.attributeset;import android.view.view;import com.song.zxing.app;import com.song.zxing.R;/** * Created by Administrator on 2015/11/4.    */public class Screenoverlay extends View {private RECTF RECTF;    private paint paint;    Private Bitmap Rectbitmap;    Private Bitmap Linebitmap;    private int lineoffset = 2;    private int rectbitmapwidth;    private int rectbitmapheight;    Public Screenoverlay (Context context) {super (context);        } public Screenoverlay (context context, AttributeSet Attrs) {Super (context, attrs);    Initpoint (); } public Screenoverlay (context context, AttributeSet attrs, int defstyleattr) {Super (context, Attrs, defstyleat    TR); } private void Initpoint () {rectbitmap = Bitmapfactory.decoderesource (Getresources (), r.mipmap.qr_capture);        Linebitmap = Bitmapfactory.decoderesource (Getresources (), r.mipmap.qr_scan_line);        int mscreenwidth = App.getscreenwidth ();        int mscreenheight = App.getscreenheight ();        Rectbitmapwidth = Rectbitmap.getwidth ();        Rectbitmapheight = Rectbitmap.getheight ();        float left = (mscreenwidth-rectbitmapwidth)/2;        float top = (mscreenheight-rectbitmapheight-20)/2;        float right = left + rectbitmapwidth;        Float bottom = top + rectbitmapheight;        RECTF = new RECTF (left, top, right, bottom);        Paint = new paint ();    Paint.setcolor (Color.parsecolor ("#60000000"));        } @Override public void draw (canvas canvas) {super.draw (canvas);        Canvas.drawrect (0, 0, app.getscreenwidth (), rectf.top, paint);        Canvas.drawrect (0, Rectf.top, Rectf.left, Rectf.bottom, paint); Canvas.drawrect (0, RECTF.Bottom, App.getscreenwidth (), App.getscreenheight (), paint);        Canvas.drawrect (Rectf.right, Rectf.top, App.getscreenwidth (), rectf.bottom, paint);        Canvas.drawbitmap (Rectbitmap, Rectf.left, rectf.top, paint);        Canvas.drawbitmap (Linebitmap, NULL, Getdstrect (RECTF, Lineoffset), paint); Lineoffset = Lineoffset >= rectBitmapHeight-10?        10:lineoffset + 2;    Invalidate ();        } Private Rect Getdstrect (RECTF rectf, int offset) {rect rect = new Rect ();        Rect.left = (int) rectf.left;        Rect.top = (int) rectf.top + offset;        Rect.bottom = Rect.top + app.dp2px (2);        Rect.right = (int) (rectf.left + rectbitmapwidth);    return rect;    } public RECTF GETPREVIEWRECTF () {return RECTF;        } public rect Getpreviewrect () {rect rect = new Rect ();        Rectf.round (rect);    return rect; } public void Stopscan () {}}

  

Testactivity:
Package Com.song.zxing;import Android.app.activity;import Android.graphics.bitmap;import Android.graphics.bitmapfactory;import Android.os.bundle;import Android.os.environment;import Android.os.Handler; Import Android.os.message;import Android.view.view;import Android.widget.button;import Com.song.zxing.decode.bitmapdecodehandler;import Com.song.zxing.decode.previewdecodehandler;import Com.song.zxing.encode.qrcreator;import Com.song.zxing.ui.cameraview;import Com.song.zxing.ui.ScreenOverlay; Import Com.song.zxing.util.bitmaputil;import com.song.zxing.util.constant;/** * Created by Administrator on 2015/12/    */public class Testactivity extends Activity {Cameraview cameraview;        @Override protected void OnCreate (Bundle savedinstancestate) {super.oncreate (savedinstancestate);        Setcontentview (r.layout.test);        Cameraview = (Cameraview) Findviewbyid (R.id.cameraview);        Final Screenoverlay overlay = (screenoverlay) Findviewbyid (R.id.overlay); Cameraview.Setinitlistener (New Cameraview.initlistener () {@Override public void initsuccess () {            Cameraview.setpreviewcallback (New Previewdecodehandler (Overlay.getpreviewrect (), handler));        }        }); Findviewbyid (R.ID.BTN). Setonclicklistener (New View.onclicklistener () {@Override public void OnClick (View v) {New Bitmapdecodehandler (). Start (Bitmapfactory.decodefile (environment.getexternalstoragedirectory () + "/fu            Ck.png "), handler);        }        }); Findviewbyid (R.ID.BTN_CREATEQR). Setonclicklistener (New View.onclicklistener () {@Override public voi D OnClick (View v) {Bitmap Bitmap = new Qrcreator (). Createqrimage ("This is a test string", $, Bitmap Factory.decoderesource (Getresources (), r.mipmap.ic_launcher));//Bitmap Bitmap = new Qrcreator (). Createqrim                Age ("This is a test string", (+), and null); Bitmaputil.write2file (bItmap, Environment.getexternalstoragedirectory () + "/fuck.png");            App.toast ("Create complete!");    }        }); } Handler Handler = new Handler () {@Override public void Handlemessage (Message msg) {if (msg                . what = = constant.value_decode_success) {app.toast (String) msg.obj);                Cameraview.setpreviewcallback (null);//Stop Decode} else if (msg.what = = Constant.value_decode_fail) {            App.toast ("Decode Fail");    }        }    };        @Override protected void OnDestroy () {Super.ondestroy ();        Cameraview.release ();    Cameraview = null; }}

For detailed code see: http://download.csdn.net/detail/hesongxing/9365515

Note: Engineering code is developed using Android Studio.

Android zxing parsing Two-dimensional code, creating a QR Code minimalist demo

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.