久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術(shù)文章
文章詳情頁

Android集成zxing掃碼框架功能

瀏覽:122日期:2022-09-24 15:52:53

我們知道zxing是一個(gè)強(qiáng)大的處理二維碼和條形碼等的開源庫,本篇文章記錄一下自己在項(xiàng)目中集成zxing開源庫的過程。

導(dǎo)入依賴

implementation ’com.google.zxing:core:3.3.3’

申請(qǐng)權(quán)限

在AndroidManifest中申請(qǐng)相應(yīng)權(quán)限:

<!--相機(jī)--><uses-permission android:name='android.permission.CAMERA' /><!--震動(dòng)--><uses-permission android:name='android.permission.VIBRATE' /><!--存儲(chǔ)--><uses-permission android:name='android.permission.WRITE_EXTERNAL_STORAGE' /><uses-permission android:name='android.permission.READ_EXTERNAL_STORAGE' />

導(dǎo)入相關(guān)代碼和資源文件

導(dǎo)入的代碼文件如下(源碼在末尾):

Android集成zxing掃碼框架功能

相關(guān)的資源文件:

1、在res/values下新建ids.xml文件,引入下面id:

<!--二維碼/條形碼掃描相關(guān)--><item name='auto_focus' type='id' /><item name='decode' type='id' /><item name='decode_failed' type='id' /><item name='decode_succeeded' type='id' /><item name='encode_failed' type='id' /><item name='encode_succeeded' type='id' /><item name='launch_product_query' type='id' /><item name='quit' type='id' /><item name='restart_preview' type='id' /><item name='return_scan_result' type='id' /><item name='search_book_contents_failed' type='id' /><item name='search_book_contents_succeeded' type='id' />

2、在res/values下新建attrs.xml文件,加入掃碼框的屬性,主要是ViewfinderView在使用:

<!--掃碼框?qū)傩?-><declare-styleable name='ViewfinderView'> <attr name='corner_color' format='color' /> <attr name='corner_size' format='dimension' /> <attr name='corner_stroke_width' format='dimension' /> <attr name='corner_position' format='enum'> <enum name='inside' value='1' /> <enum name='outside' value='2' /> </attr> <attr name='line_color' format='color' /> <attr name='line_height' format='dimension' /> <attr name='line_move_distance' format='dimension' /> <attr name='frame_width' format='dimension' /> <attr name='frame_height' format='dimension' /> <attr name='frame_centerX' format='dimension' /> <attr name='frame_centerY' format='dimension' /> <attr name='frame_color' format='color' /> <attr name='frame_stroke_width' format='dimension' /> <attr name='mask_color' format='color' /> <attr name='result_point_color' format='color' /> <attr name='label_text' format='string' /> <attr name='label_text_color' format='color' /> <attr name='label_text_size' format='dimension' /> <attr name='label_text_margin' format='dimension' /></declare-styleable>

3、在res下新建raw目錄,導(dǎo)入beep.mp3,實(shí)現(xiàn)掃碼成功的滴滴音效,BeepManager在使用

上面是一些比較重要的資源。

然后介紹一下幾個(gè)主要的類:

1、ViewfinderView:自定義掃描框,代碼如下,因?yàn)橛凶⑨專筒欢嗾f明了。

public final class ViewfinderView extends View { private static final long ANIMATION_DELAY = 10L; private static final int OPAQUE = 1; private static final int CORNER_INSIDE = 1; //四個(gè)邊角在掃描區(qū)內(nèi) private static final int CORNER_OUTSIDE = 2; //四個(gè)邊角在掃描區(qū)外 private Paint paint; //掃描區(qū)四個(gè)邊角的顏色 private int cornerColor; //掃描區(qū)邊角的大小 private float cornerSize; //掃描區(qū)邊角的寬度 private float cornerStrokeWidth; //邊角的方向,在掃描區(qū)域內(nèi)還是掃描區(qū)域外 private int cornerPosition; //掃描線顏色 private int lineColor; //掃描線高度 private float lineHeight; //掃描線移動(dòng)距離 private float lineMoveDistance; //掃描區(qū)域?qū)挾榷?private float frameWidth; //掃描區(qū)域高度 private float frameHeight; //掃描區(qū)域中心位置的X坐標(biāo),默認(rèn)正中間,在onLayout中設(shè)置 private float frameCenterX; //掃描區(qū)域中心位置的Y坐標(biāo),默認(rèn)正中間,在onLayout中設(shè)置 private float frameCenterY; //掃描區(qū)域邊框顏色 private int frameColor; //掃描區(qū)域邊框?qū)挾?private float frameStrokeWidth; //模糊區(qū)域顏色 private int maskColor; //掃描點(diǎn)的顏色 private int resultPointColor; //掃描區(qū)域提示文本 private String labelText; //掃描區(qū)域提示文本顏色 private int labelTextColor; //掃描區(qū)域提示文本字體大小 private float labelTextSize; //掃描區(qū)域提示文本的邊距 private float labelTextMargin; public static int scannerStart = 0; public static int scannerEnd = 0; private Collection<ResultPoint> possibleResultPoints; private Collection<ResultPoint> lastPossibleResultPoints; // This constructor is used when the class is built from an XML resource. public ViewfinderView(Context context, AttributeSet attrs) { super(context, attrs); //初始化自定義屬性信息 TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.ViewfinderView); cornerColor = ta.getColor(R.styleable.ViewfinderView_corner_color, getResources().getColor(R.color.colorPrimary)); cornerSize = ta.getDimension(R.styleable.ViewfinderView_corner_size, dp2px(context, 28)); cornerStrokeWidth = ta.getDimension(R.styleable.ViewfinderView_corner_stroke_width, dp2px(context, 4)); cornerPosition = ta.getInt(R.styleable.ViewfinderView_corner_position, CORNER_INSIDE); lineColor = ta.getColor(R.styleable.ViewfinderView_line_color, getResources().getColor(R.color.colorPrimary)); lineHeight = ta.getDimension(R.styleable.ViewfinderView_line_height, dp2px(context, 3)); lineMoveDistance = ta.getDimension(R.styleable.ViewfinderView_line_move_distance, dp2px(context, 2)); frameWidth = ta.getDimension(R.styleable.ViewfinderView_frame_width, dp2px(context, 220)); frameHeight = ta.getDimension(R.styleable.ViewfinderView_frame_height, dp2px(context, 220)); frameCenterX = ta.getDimension(R.styleable.ViewfinderView_frame_centerX, -1); frameCenterY = ta.getDimension(R.styleable.ViewfinderView_frame_centerY, -1); frameColor = ta.getColor(R.styleable.ViewfinderView_frame_color, Color.parseColor('#90FFFFFF')); frameStrokeWidth = ta.getDimension(R.styleable.ViewfinderView_frame_stroke_width, dp2px(context, 0.2f)); maskColor = ta.getColor(R.styleable.ViewfinderView_mask_color, Color.parseColor('#60000000')); resultPointColor = ta.getColor(R.styleable.ViewfinderView_result_point_color, Color.TRANSPARENT); labelText = ta.getString(R.styleable.ViewfinderView_label_text); labelTextColor = ta.getColor(R.styleable.ViewfinderView_label_text_color, Color.WHITE); labelTextSize = ta.getDimension(R.styleable.ViewfinderView_label_text_size, sp2px(context, 15)); labelTextMargin = ta.getDimension(R.styleable.ViewfinderView_label_text_margin, dp2px(context, 18)); ta.recycle(); paint = new Paint(); paint.setAntiAlias(true); possibleResultPoints = new HashSet<ResultPoint>(5); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); //如果沒有設(shè)置frameCenterX和frameCenterY默認(rèn)布局正中間的X、Y坐標(biāo) frameCenterX = (frameCenterX == -1) ? getWidth() / 2f : frameCenterX; frameCenterY = (frameCenterY == -1) ? getHeight() / 2f : frameCenterY; //設(shè)置掃描區(qū)域位置 int leftOffset = (int) (frameCenterX - frameWidth / 2f); int topOffset = (int) (frameCenterY - frameHeight / 2f); //設(shè)置掃描區(qū)不超過屏幕 leftOffset = leftOffset > 0 ? leftOffset : 0; topOffset = topOffset > 0 ? topOffset : 0; Rect rect = new Rect(); rect.left = leftOffset; rect.top = topOffset; rect.right = (int) (leftOffset + frameWidth); rect.bottom = (int) (topOffset + frameHeight); CameraManager.get().setFramingRect(rect); } @Override public void onDraw(Canvas canvas) { Rect frame = CameraManager.get().getFramingRect(); if (frame == null) { return; } if (scannerStart == 0 || scannerEnd == 0) { scannerStart = frame.top; scannerEnd = frame.bottom; } int width = canvas.getWidth(); int height = canvas.getHeight(); //繪制模糊區(qū)域 drawExterior(canvas, frame, width, height); //繪制掃描區(qū)邊框 drawFrame(canvas, frame); //繪制邊角 drawCorner(canvas, frame); //繪制提示信息 drawTextInfo(canvas, frame); //繪制掃描線 drawScanLine(canvas, frame); //繪制閃爍點(diǎn) drawResultPoint(canvas, frame); // Request another update at the animation interval, but only repaint the laser line, // not the entire viewfinder mask. //指定重繪區(qū)域,該方法會(huì)在子線程中執(zhí)行 postInvalidateDelayed(ANIMATION_DELAY, frame.left, frame.top, frame.right, frame.bottom); } // 繪制模糊區(qū)域 Draw the exterior (i.e. outside the framing rect) darkened private void drawExterior(Canvas canvas, Rect frame, int width, int height) { paint.setColor(maskColor); canvas.drawRect(0, 0, width, frame.top, paint); canvas.drawRect(0, frame.top, frame.left, frame.bottom, paint); canvas.drawRect(frame.right, frame.top, width, frame.bottom, paint); canvas.drawRect(0, frame.bottom, width, height, paint); } // 繪制掃描區(qū)邊框 Draw a two pixel solid black border inside the framing rect private void drawFrame(Canvas canvas, Rect frame) { if (frameStrokeWidth > 0) { paint.setColor(frameColor); if (cornerPosition == CORNER_INSIDE) { //邊角在掃描區(qū)內(nèi) //左邊 canvas.drawRect(frame.left, frame.top, frame.left + frameStrokeWidth, frame.bottom, paint); //上邊 canvas.drawRect(frame.left, frame.top, frame.right, frame.top + frameStrokeWidth, paint); //右邊 canvas.drawRect(frame.right - frameStrokeWidth, frame.top, frame.right, frame.bottom, paint); //下邊 canvas.drawRect(frame.left, frame.bottom - frameStrokeWidth, frame.right, frame.bottom, paint); } else { //邊角在掃描區(qū)外 //左邊 canvas.drawRect(frame.left - frameStrokeWidth, frame.top - frameStrokeWidth, frame.left, frame.bottom + frameStrokeWidth, paint); //上邊 canvas.drawRect(frame.left - frameStrokeWidth, frame.top - frameStrokeWidth, frame.right + frameStrokeWidth, frame.top, paint); //右邊 canvas.drawRect(frame.right, frame.top - frameStrokeWidth, frame.right + frameStrokeWidth, frame.bottom + frameStrokeWidth, paint); //下邊 canvas.drawRect(frame.left - frameStrokeWidth, frame.bottom, frame.right + frameStrokeWidth, frame.bottom + frameStrokeWidth, paint); } } } //繪制邊角 private void drawCorner(Canvas canvas, Rect frame) { if (cornerSize > 0 && cornerStrokeWidth > 0) { paint.setColor(cornerColor); if (cornerPosition == CORNER_INSIDE) { //繪制在掃描區(qū)域內(nèi)區(qū) //左上 canvas.drawRect(frame.left, frame.top, frame.left + cornerSize, frame.top + cornerStrokeWidth, paint); canvas.drawRect(frame.left, frame.top, frame.left + cornerStrokeWidth, frame.top + cornerSize, paint); //右上 canvas.drawRect(frame.right - cornerSize, frame.top, frame.right, frame.top + cornerStrokeWidth, paint); canvas.drawRect(frame.right - cornerStrokeWidth, frame.top, frame.right, frame.top + cornerSize, paint); //左下 canvas.drawRect(frame.left, frame.bottom - cornerSize, frame.left + cornerStrokeWidth, frame.bottom, paint); canvas.drawRect(frame.left, frame.bottom - cornerStrokeWidth, frame.left + cornerSize, frame.bottom, paint); //右下 canvas.drawRect(frame.right - cornerSize, frame.bottom - cornerStrokeWidth, frame.right, frame.bottom, paint); canvas.drawRect(frame.right - cornerStrokeWidth, frame.bottom - cornerSize, frame.right, frame.bottom, paint); } else { //繪制在掃描區(qū)域外區(qū) //左上 canvas.drawRect(frame.left - cornerStrokeWidth, frame.top - cornerStrokeWidth, frame.left - cornerStrokeWidth + cornerSize, frame.top, paint); canvas.drawRect(frame.left - cornerStrokeWidth, frame.top - cornerStrokeWidth, frame.left, frame.top - cornerStrokeWidth + cornerSize, paint); //右上 canvas.drawRect(frame.right + cornerStrokeWidth - cornerSize, frame.top - cornerStrokeWidth, frame.right + cornerStrokeWidth, frame.top, paint); canvas.drawRect(frame.right, frame.top - cornerStrokeWidth, frame.right + cornerStrokeWidth, frame.top - cornerStrokeWidth + cornerSize, paint); //左下 canvas.drawRect(frame.left - cornerStrokeWidth, frame.bottom, frame.left - cornerStrokeWidth + cornerSize, frame.bottom + cornerStrokeWidth, paint); canvas.drawRect(frame.left - cornerStrokeWidth, frame.bottom + cornerStrokeWidth - cornerSize, frame.left, frame.bottom + cornerStrokeWidth, paint); //右下 canvas.drawRect(frame.right + cornerStrokeWidth - cornerSize, frame.bottom, frame.right + cornerStrokeWidth, frame.bottom + cornerStrokeWidth, paint); canvas.drawRect(frame.right, frame.bottom + cornerStrokeWidth - cornerSize, frame.right + cornerStrokeWidth, frame.bottom + cornerStrokeWidth, paint); } } } //繪制文本 private void drawTextInfo(Canvas canvas, Rect frame) { if (!TextUtils.isEmpty(labelText)) { paint.setColor(labelTextColor); paint.setTextSize(labelTextSize); paint.setTextAlign(Paint.Align.CENTER); Paint.FontMetrics fm = paint.getFontMetrics(); float baseY = frame.bottom + labelTextMargin - fm.ascent; canvas.drawText(labelText, frame.left + frame.width() / 2, baseY, paint); } } //繪制掃描線 private void drawScanLine(Canvas canvas, Rect frame) { if (lineHeight > 0) { paint.setColor(lineColor); RadialGradient radialGradient = new RadialGradient( (float) (frame.left + frame.width() / 2), (float) (scannerStart + lineHeight / 2), 360f, lineColor, shadeColor(lineColor), Shader.TileMode.MIRROR); paint.setShader(radialGradient); if (scannerStart <= scannerEnd) { //橢圓 RectF rectF = new RectF(frame.left + 2 * lineHeight, scannerStart, frame.right - 2 * lineHeight, scannerStart + lineHeight); canvas.drawOval(rectF, paint); scannerStart += lineMoveDistance; } else { scannerStart = frame.top; } paint.setShader(null); } } private void drawResultPoint(Canvas canvas, Rect frame) { if (resultPointColor != Color.TRANSPARENT) { Collection<ResultPoint> currentPossible = possibleResultPoints; Collection<ResultPoint> currentLast = lastPossibleResultPoints; 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); } } } } //處理顏色模糊 public int shadeColor(int color) { String hax = Integer.toHexString(color); String result = '20' + hax.substring(2); return Integer.valueOf(result, 16); } public void drawViewfinder() { invalidate(); } public void addPossibleResultPoint(ResultPoint point) { possibleResultPoints.add(point); } private int dp2px(Context context, float dpValue) { float density = context.getApplicationContext().getResources().getDisplayMetrics().density; return (int) (dpValue * density + 0.5f); } private int sp2px(Context context, float spValue) { float scaleDensity = context.getApplicationContext().getResources().getDisplayMetrics().scaledDensity; return (int) (spValue * scaleDensity + 0.5f); }}

2、CaptureActivity:掃碼的Activity基類,代碼如下;

/** * Created by xuzhb on 2019/11/16 * Desc:掃碼的Activity類 * 整個(gè)Activity最重要的兩個(gè)控件是一個(gè)SurfaceView(攝像頭)和一個(gè)ViewfinderView(掃描區(qū)) * 對(duì)于繼承CaptureActivity的Activity子類來說, * 可以選擇在自己的布局中定義和CaptureActivity的布局文件id相同的控件, * 這樣即使它們?cè)趦蓚€(gè)布局中表現(xiàn)不同也能執(zhí)行相同的邏輯,包括其他控件 * 或者選擇重寫getSurfaceView()和getViewfinderView()返回對(duì)應(yīng)的兩個(gè)控件, * 掃碼最終是在handleDecode(Result result, Bitmap bitmap)處理掃描后的結(jié)果 */public class CaptureActivity extends AppCompatActivity implements SurfaceHolder.Callback { private static final String TAG = 'CaptureActivity'; private static final int IMAGE_PICKER = 1999; private BeepManager mBeepManager; private CaptureActivityHandler mHandler; private Vector<BarcodeFormat> mDecodeFormats; private String mCharacterSet; private InactivityTimer mInactivityTimer; private boolean hasSurface = false; private boolean isLightOn = false; //是否打開閃光燈 private boolean isPlayBeep = true; //是否開啟掃描后的滴滴聲 private boolean isVibrate = true; //是否震動(dòng) private String mPhotoPath; //選中的圖片路徑 private TitleBar mTitleBar; private SurfaceView mSurfaceView; private ViewfinderView mViewfinderView; private LinearLayout mLightLl; private ImageView mLightIv; private TextView mLightTv; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(getLayoutId()); CameraManager.init(getApplicationContext()); mBeepManager = new BeepManager(this); hasSurface = false; mInactivityTimer = new InactivityTimer(this); handleView(savedInstanceState); initView(); initListener(); } protected int getLayoutId() { return R.layout.activity_capture; } protected void handleView(@Nullable Bundle savedInstanceState) { } private void initView() { mTitleBar = findViewById(R.id.title_bar); mSurfaceView = findViewById(R.id.surfaceView); mViewfinderView = findViewById(R.id.viewfinderView); mLightLl = findViewById(R.id.light_ll); mLightIv = findViewById(R.id.light_iv); mLightTv = findViewById(R.id.light_tv); } protected void initListener() { //因?yàn)槔^承CaptureActivity的Activity子類的布局不一定包含id為title_bar和light_ll的控件, //沒有的話如果子類通過super.initListener()覆寫時(shí)會(huì)因?yàn)檎也坏蕉鴪?bào)異常,所以這里加了一個(gè)判空; //如果子類的布局中包含id相同的控件,則不需要在子類中再重寫相同的邏輯 if (mTitleBar != null) { StatusBarUtil.INSTANCE.darkModeAndPadding(this, mTitleBar, Color.BLACK, 0, false); mTitleBar.setOnLeftClickListener(v -> { finish(); return null; }); mTitleBar.setOnRightClickListener(v -> { openAlbum(); //打開相冊(cè)選取圖片掃描 return null; }); } if (mLightLl != null) { mLightLl.setOnClickListener(v -> switchLight()); //打開或關(guān)閉閃光燈 } } //打開相冊(cè) protected void openAlbum() { Intent intent = new Intent(Intent.ACTION_PICK, null); intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 'image/*'); startActivityForResult(intent, IMAGE_PICKER); } //開啟/關(guān)閉閃光燈 private void switchLight() { if (CameraManager.get() != null) { if (isLightOn) { mLightTv.setText('輕觸點(diǎn)亮'); CameraManager.get().turnLightOffFlashLight(); } else { mLightTv.setText('輕觸關(guān)閉'); CameraManager.get().turnOnFlashLight(); } isLightOn = !isLightOn; mLightIv.setSelected(isLightOn); } } @Override protected void onResume() { super.onResume(); SurfaceHolder holder = getSurfaceView().getHolder(); if (hasSurface) { initCamera(holder); } else { holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } mDecodeFormats = null; mCharacterSet = null; } @Override protected void onPause() { super.onPause(); if (mHandler != null) { mHandler.quitSynchronously(); mHandler = null; } CameraManager.get().closeDriver(); } @Override protected void onDestroy() { mInactivityTimer.shutdown(); mBeepManager.releaseRing(); super.onDestroy(); } @Override public void surfaceCreated(SurfaceHolder holder) { } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { if (!hasSurface) { hasSurface = true; initCamera(holder); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { hasSurface = false; } private void initCamera(SurfaceHolder holder) { try { CameraManager.get().openDriver(holder); } catch (Exception e) { e.printStackTrace(); } if (mHandler == null) { mHandler = new CaptureActivityHandler(this, mDecodeFormats, mCharacterSet); } } //繼承CaptureActivity的Activity類,如果SurfaceView的id和CaptureActivity布局中SurfaceView的id不同 //需要重寫這個(gè)方法,返回自己布局中的SurfaceView public SurfaceView getSurfaceView() { return mSurfaceView; } //繼承CaptureActivity的Activity類,如果ViewfinderView的id和CaptureActivity布局中ViewfinderView的id不同 //需要重寫這個(gè)方法,返回自己布局中的ViewfinderView public ViewfinderView getViewfinderView() { return mViewfinderView; } public Handler getHandler() { return mHandler; } public void drawViewfinder() { getViewfinderView().drawViewfinder(); } //處理掃描后的結(jié)果 public void handleDecode(Result result, Bitmap bitmap) { mInactivityTimer.onActivity(); if (result != null) { String text = result.getText(); Log.i(TAG, '識(shí)別的結(jié)果:' + text); if (!TextUtils.isEmpty(text)) { //識(shí)別成功 playBeepSoundAndVibrate(); returnQRCodeResult(text); } else { showToast('很抱歉,識(shí)別二維碼失敗!'); } } else { showToast('未發(fā)現(xiàn)二維碼!'); } } private void playBeepSoundAndVibrate() { if (isPlayBeep) { mBeepManager.startRing(); //播放掃碼的滴滴聲 } if (isVibrate) { Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); if (vibrator != null) { vibrator.vibrate(200); //震動(dòng)200毫秒 } } } //返回掃描結(jié)果 private void returnQRCodeResult(String result) { Intent intent = new Intent(); intent.putExtra(QRConstant.SCAN_QRCODE_RESULT, result); setResult(Activity.RESULT_OK, intent); finish(); } private void showToast(CharSequence text) { runOnUiThread(() -> { ToastUtil.INSTANCE.showToast(text, true, false, getApplicationContext()); }); } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == IMAGE_PICKER && resultCode == Activity.RESULT_OK) { if (data != null) { Uri uri = data.getData(); if (uri != null) { Cursor cursor = getContentResolver().query(uri, null, null, null, null); if (cursor != null) { if (cursor.moveToFirst()) { mPhotoPath = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)); } cursor.close(); if (!TextUtils.isEmpty(mPhotoPath)) { //可以加個(gè)提示正在掃描的加載框,如showLoadingDialog('正在掃描...') new Thread(() -> {handleDecode(QRCodeUtil.decodeImage(mPhotoPath), null);//取消加載框,dismissLoadingDialog() }).start(); } else { Log.e(TAG, '未找到圖片'); } } } } } }}

看一下使用的例子

Android集成zxing掃碼框架功能 Android集成zxing掃碼框架功能

最后,附上整個(gè)項(xiàng)目的github地址,注:項(xiàng)目使用了視圖綁定ViewBinding,所以需要使用AndroidStudio 3.6.x版本。

到此這篇關(guān)于Android集成zxing掃碼框架功能的文章就介紹到這了,更多相關(guān)android zxing掃碼內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 国产视频一区二区三区四区 | 国产中文视频 | 欧美激情精品久久久久久变态 | 一区二区三区免费视频网站 | 欧美国产日韩一区 | 一区二区在线免费观看 | 女人毛片a毛片久久人人 | 欧美精品综合 | 视频一区在线 | av男人天堂网 | 婷婷综合五月 | 黄色一级网址 | 国产午夜久久久久 | 午夜成人在线视频 | a免费观看 | 欧美电影一区二区三区 | 成人黄色av | 国产精品一区在线 | 高清av网站| 久久久高清 | 91嫩草在线 | 亚洲精品久久久久avwww潮水 | 99动漫| 最近免费中文字幕在线视频2 | 1级毛片| 亚洲每日更新 | 国产a视频 | 国产1区2区| 精品久久久免费视频 | 成人a在线 | 成人精品视频一区二区三区 | 农村妇女毛片精品久久久 | 亚洲综合天堂网 | 国产免费av网站 | 久久精品91久久久久久再现 | 国产在线精品一区 | 二区视频| 久久99精品国产麻豆婷婷洗澡 | 亚洲免费在线观看 | 免费v片| 欧美成人精品一区二区三区在线看 | 天天摸天天看 | 日韩精品一区二区三区在线观看 | 日韩一区免费在线观看 | 色婷婷国产精品综合在线观看 | 成人久久久 | 精品一区二区在线观看 | 免费观看黄色 | 欧美 中文字幕 | 亚洲一区中文字幕在线观看 | 亚洲精品一区中文字幕乱码 | 欧洲美女性开放视频 | 91在线精品视频 | 中文字幕自拍偷拍 | 亚洲成人高清 | 99re6在线视频精品免费 | 国产成人片| 九九热精品视频在线观看 | 成人爽a毛片一区二区免费 亚洲自拍偷拍精品 | 色欧美片视频在线观看 | 久久首页 | 日韩一级电影在线 | 91久久久久久久久久久久久久久久 | 亚洲精品四区 | 一区二区视频在线观看 | 欧美日韩一区精品 | 亚洲高清免费视频 | 欧美一区二区三区精品 | 久久久久久毛片免费播放 | 精品久久久久香蕉网 | 日韩久久久一区二区 | 三级成人在线 | 在线观看国精产品二区1819 | 亚洲精品亚洲人成人网 | www.操.com| 日本黄色片免费看 | 亚洲精品免费视频 | 欧美精品99 | 欧美精品综合 | 国产高清精品一区 | 青娱乐av| 日韩欧洲亚洲 | 精品国产乱码久久久久久闺蜜 | 一区二区在线视频 | 日韩欧美一区二区三区 | 午夜视频免费 | 免费看的毛片 | 波多野结衣先锋影音 | 色综合99| 亚洲精品乱码久久久久久蜜桃91 | www.com国产精品 | 一区二区在线免费观看 | 成人在线www| 欧美伦理一区二区三区 | 成人在线看片网站 | 黄色小视频在线免费观看 | 国产精品久久久久久久免费大片 | 国产三级在线 | 国产99999 | 怡红院免费在线视频 | 久久国产精品视频 | 欧美一级淫片免费看 | 亚洲小视频 | 亚洲高清在线 | 国产精品久久久 | 色爱综合 | 欧美亚洲国产日韩 | 久久一区二区三区四区五区 | 免费在线成人 | 黄色a视频 | 午夜成人免费电影 | 久久麻豆视频 | 国产中文字幕在线 | 日韩欧美在线免费观看 | 中文字幕第一页在线 | 一区二区三区免费在线观看 | 国产一级影片 | 国产色99精品9i | 香蕉大人久久国产成人av | 天天射天天干 | 国产一区二区三区在线 | 国产一级特黄视频 | 九九九在线| 婷婷午夜激情网 | 久久久婷婷 | 欧美日一区二区 | 99九九久久 | 国产一区网站 | 日韩免费视频 | 一区二区三区精品 | 色先锋资源 | 国产精品国产 | 国产精品一品二区三区的使用体验 | 成人免费xxxxxxx | 黄色成人影视 | 国产精品久久久久久婷婷天堂 | 成人在线 | 国产aaa大片 | 国产一级淫免费播放m | 亚洲福利| 日韩成人免费视频 | 国产一区二区在线播放 | 黄色一级网址 | 好色视频在线观看 | 日韩视频在线播放 | 成人免费网站 | 中文字幕亚洲一区二区三区 | 成人在线高清视频 | 欧美xxxⅹ性欧美大片 | 一区二区三区国产 | 成人在线小视频 | 午夜小电影 | 综合久久综合久久 | 成人av免费在线 | 日韩免费片 | 成人av网址在线观看 | 欧美精品一区二区三区一线天视频 | 欧美精品成人 | 亚洲一区二区三区免费在线观看 | 中文字幕自拍偷拍 | 精品久久99| 在线视频成人永久免费 | 欧美一区二区黄色片 | 色伊人久久| 日日久| 亚洲欧美日韩国产综合 | 久久精品123| www.xxx免费| 免费在线成人 | 久久久久久免费视频 | 欧美色阁 | 国产视频精品在线观看 | 欧美韩国日本一区 | 国产视频一区二区 | 日韩精品在线观看视频 | 亚洲天堂第一页 | 国产日韩在线视频 | 日本久久久久久久久久久久 | 99亚洲精品 | 中文字幕99 | 婷婷亚洲综合 | 精品国产乱码久久久久久久 | 伊人狠狠干 | 亚洲欧美国产一区二区三区 | 日本精品一区 | 中国妞xxxhd露脸偷拍视频 | 亚洲国产精品一区二区久久 | 欧美一区二区三区视频 | 免费的一级黄色片 | 97人人看 | 欧美国产在线观看 | 91麻豆精品国产91久久久久久久久 | 北条麻妃一区二区三区在线观看 | 久久国产精品久久久久久 | 久久久久久久久久影院 | 日韩精品在线一区 | 国产精品精品视频一区二区三区 | 99精品一区二区 | 久久天堂 | 中文字幕乱码一区二区三区 | 国产亚洲精品久久久久久久久 | 欧美成人精品一区二区三区在线看 | 亚洲成人精品区 | 亚洲欧美中文日韩在线v日本 | 精品国产一区二区三区性色 | 91嫩草在线 | 欧美日本久久 | 国产精品婷婷午夜在线观看 | 久久国产成人 | 成人av免费看 | 亚洲免费在线播放 | 国产99精品| 亚洲一区影院 | 国产精品原创巨作av | 伊人二区| 骚黄视频 | 国产艹 | 亚洲男人的天堂在线 | 久久久久久这里只有精品 | 日韩一区二区黄色片 | 四虎影院网 | 久久成人一区 | 韩国精品 | 成人羞羞网站 | 国产成人一区二区三区 | 日韩精品一区二区三区老鸭窝 | 一区二区国产精品 | 中文字幕综合在线 | 日本在线一区二区 | 亚洲天堂一区二区 | 曰本人一级毛片免费完整视频 | 亚洲444kkkk在线观看最新 | 日韩一区在线观看视频 | 91黄色在线观看 | 精品国产成人 | 国产成人精品综合 | 精品中文在线 | 欧美一级三级 | 波多野结衣一区在线观看 | 成人日批 | 精品久久一区 | 一级毛片免费视频 | 国产精品久久久久久久久免费 | 久久国产精品99精国产 | 香蕉久久夜色精品国产使用方法 | 99久久电影 | 男女羞羞视频免费在线观看 | 亚洲美女在线视频 | 亚洲美女视频在线观看 | 久草高清在线 | 黄a在线| 日夜夜精品 | 黄色国产大片 | 欧美性一区二区三区 | 国产精品日韩欧美一区二区三区 | 精品国产欧美一区二区三区成人 | 91精品视频在线播放 | 黄色精品一区二区 | 最近免费中文字幕大全免费版视频 | 99re热精品视频 | 一级欧美一级日韩片 | 国产美女高潮一区二区三区 | 亚洲国产精品视频 | 欧美日韩综合视频 | 欧美久久久久 | 久久亚洲视频 | 精品一区二区三区四区五区 | av免费在线观看网站 | 亚洲精品二区 | av网站网址 | 日韩视频欧美视频 | 国产精品久久久久一区二区三区 | 国产一级视频 | 午夜视频在线观看网址 | 午夜国产精品视频 | 五月婷婷导航 | 国产精品视频yy9299一区 | 奇米影视7777 | 青青草久 | 国产午夜视频 | 狠狠操狠狠操 | 粉嫩高清一区二区三区 | 自拍视频在线观看 | 午夜视频免费 | 久久久影院 | 亚洲成人国产精品 | 老司机精品福利视频 | 久久精品久久久 | 狠狠狠干 | 国产精品久久久久久 | 免费观看一区二区三区 | 久久精品国产99 | 国产高清视频一区二区 | 中文字幕一区在线 | 在线看h | 欧美精品一区二区三区蜜桃视频 | 亚洲首页 | 在线欧美视频 | 国产福利91精品一区二区三区 | 成人午夜激情 | 久久久国产精品视频 | 太平公主一级艳史播放高清 | 日韩91视频 | 国产精品欧美一区二区三区 | 天天摸夜夜摸爽爽狠狠婷婷97 | a级黄色在线观看 | 精品国产乱码久久久久久1区2区 | 久久99精品久久久久久园产越南 | 久久精品在线视频 | 97久久精品人人做人人爽50路 | 欧美激情一区二区 | 羞羞视频网站免费看 | 另类视频在线 | 久久久久久久久久久久久久av | 亚洲一区不卡在线 | 视频二区| 国产99久久精品一区二区永久免费 | 成人免费毛片aaaaaa片 | 欧美国产精品一区二区 | 一级毛片免费 | 日韩三级 | 国产成人一区 | 精品久久久久久亚洲精品 | 国产精品久久久久久久久久免费看 | 欧美精品在线视频 | 91偷拍精品一区二区三区 | 国产精品久久久久一区二区三区 | 欧美日韩在线一区二区 | 日韩欧美中文在线 | 欧美日韩国产精品 | 久久99精品久久久久久按摩秒播 | 红杏aⅴ成人免费视频 | 国产精品99久久久久久久vr | 成人精品久久久 | 亚洲高清在线视频 | 一区二区三区在线观看视频 | 日本一级毛片视频 | 最近的中文字幕在线看视频 | 欧美自拍视频一区 | 国产精品久久久久久久7电影 | 极情综合网 | 香蕉久久久久久 | 精品三级在线观看 | 精品三级在线观看 | 久久国产高清 | 国产精品成人3p一区二区三区 | 欧美韩国日本一区 | 久久99精品国产麻豆婷婷洗澡 | 亚洲精品国产一区 | 天天操夜夜拍 | 日本狠狠操 | 精品一区二区6 | 99看片| 99re视频在线观看 | 国产一区二区三区高清 | 黄色a视频| 久久久精品影院 | 国产片一区二区三区 | 欧美日韩一区二区三区在线观看 | 国产亚洲精品久久久久久青梅 | 一级片免费视频 | 久久国产精品久久精品 | 国产成人在线免费观看 | av网站在线免费观看 | 亚洲精品第一页 | 亚洲欧美综合一区 | 97视频在线 | 国产日韩精品在线 | chengrenzaixian | 精品久久久久久久久久久 | 一区二区三区在线观看国产 | 久久草在线视频 | 成人性大片免费观看网站 | 成人黄色在线视频 | 免费av片网站 | 亚洲 欧美 日韩 在线 | 欧美操穴 | 欧美一级在线观看视频 | 欧美一区二区三区久久精品 | 欧美日韩亚洲视频 | 色伊人| 国产亚洲精品久久久久久久 | 国产老头老太作爱视频 | 色呦呦网站在线观看 | 国产精品久久久久久久一区探花 | 成年人在线视频 | 国产精品欧美一区二区三区 | 亚洲成人精品 | 成人在线免费 | 精品国产一区二区三区高潮视 | 天天看天天干 | 毛片在线视频 | 一级a性色生活片久久毛片波多野 | 高清国产一区二区三区四区五区 | 一区二区在线免费观看 | 日日夜夜狠狠 | 中文字幕在线一区 | 国产精品久久久久久久久免费 | 日韩在线免费视频 | 亚洲激情视频在线播放 | 欧美一区二区在线播放 | 久久99深爱久久99精品 | 互换娇妻呻吟hd中文字幕 | 久久人人爽人人爽 | 国产成人精品999在线观看 | 成人福利影院 | 91在线视频免费观看 | 美国黄色毛片女人性生活片 | 久久久.com| av网站网址| 亚洲一二三区电影 | 久久美女 | 91久久艹| 亚洲精品二区三区 | 黄色手机在线观看 | 中文字幕久久精品 | 久久久国产视频 | 国产xxxx成人精品免费视频频 | 日本a网| 91色乱码一区二区三区 | 中文字幕日韩视频 | 日韩久久精品一区二区 | 久久不卡日韩美女 | 国产va| 日韩精品2区 | 亚洲毛片在线观看 | 日韩毛片在线视频 | 精品一区在线视频 | 国产日韩欧美在线 | 欧美日韩精品一区二区在线播放 | 亚洲国产精品成人综合色在线婷婷 | 日本在线一区二区三区 | 亚洲一区二区在线 | 日韩精品久久理论片 | 国产亚洲精品精品国产亚洲综合 | 日韩午夜av| 精品国产乱码久久久久久88av | 亚洲精品久久久久久一区二区 | av网站观看 | av毛片在线免费看 | 亚洲欧美日韩精品 | 久草中文在线 | 国产精品伦一区二区三级视频 | 色婷婷影院 | 国产精品夜夜春夜夜爽久久电影 | 久久99精品久久久久久琪琪 | 狠狠视频 | 精品一二三区在线观看 | 国产wwwcom| 欧美一区亚洲二区 | 中文字幕在线观看 | 久久99久久久久 | 99免费精品 | 国产精品久久久久久久久 | 亚洲在线 | 亚洲精品成人无限看 | 亚洲欧美v国产一区二区 | 午夜精品久久久久久久男人的天堂 | 国产女人免费看a级丨片 | 91麻豆精品国产91久久久资源速度 | www.欧美日韩 | 91久久久久久久久 | 久久久久国产一区二区三区 | www.888www看片| 91亚洲国产成人久久精品网站 | 国产精品久久国产精品 | 亚洲视频在线播放 | 久久中文字幕一区 | 日韩一区二区黄色片 | 国产精品一区二 | 久久久久九九九九九 | 色久视频 | 污片在线免费看 | 天天躁人人躁人人躁狂躁 | 久久91| 亚洲国产欧美一区二区三区久久 | 欧美日韩国产在线观看 | 在线一级视频 | 三级黄色片在线免费观看 | 日韩欧美在线看 | 中文字幕在线视频网站 | 久久国产精品久久久久久 | 亚洲综合二区 | 嫩草私人影院 | 欧美激情精品 | 国产日韩欧美高清 | 久久精品欧美一区二区三区不卡 | 91色在线观看 | 天堂精品一区二区三区 | 一区二区三区四区在线 | 黄色免费一级 | 国产欧美日韩综合精品 | 九九热精品视频 | 三级色黄 | 黄色片视频免费 | 羞羞的视频在线 | 久久久国产精品视频 | 成人精品视频99在线观看免费 | 欧美日韩国产在线观看 | 在线观看免费毛片视频 | aaa天堂| 国产不卡一区 | 日韩精品一区二区三区视频播放 | 一级一片在线观看 | 日日干天天操 | 狠狠综合久久av一区二区老牛 | 成人永久免费视频 | 久久久久国产视频 | 色九九 | 东京久久久 | 久久6 | 日本精品免费 | 国内精品国产成人国产三级粉色 | 一本色道精品久久一区二区三区 | 亚洲成av人片一区二区梦乃 | 天堂资源库 | 国内精品久久久久久中文字幕 | 日本免费在线 | 亚洲成人高清 | 久久精品国产久精国产 | 成人免费视频网 | 97碰碰碰| 日本不卡免费新一二三区 | 色婷婷av一区二区三区大白胸 | 天天摸天天看 | 欧美日韩精品 | 欧美日韩成人在线播放 | 精品不卡 | av性色| 日韩视频在线不卡 | 亚洲日本精品视频 | 欧美另类一二三四 | 中文字幕亚洲一区 | 亚洲日韩欧美一区二区在线 | 国产成人jvid在线播放 | 91综合网 | 91精品国产高清自在线观看 | 成人天堂666 | 久久人妖 | 天天澡天天狠天天天做 | 久久精品免费视频观看 | julia中文字幕久久一区二区 | 国产精品久久久久久久久免费 | 日韩欧美在线综合 | 国产高清在线不卡 | 国产欧美日韩精品一区 | 成人精品一区二区三区中文字幕 | 麻豆国产免费 | 日韩欧美视频在线 | 国产91视频在线观看 | 在线精品亚洲欧美日韩国产 | 亚洲一级一片 | 天天天天天天天天干 | www.久久久久久久久久久久 | 91精品国产综合久久精品 | 国产不卡视频在线观看 | 欧美日一区二区 | 午夜视频在线观看网站 | 久久性| 成人精品一区二区三区中文字幕 | 成人小视频在线观看 | 成人在线亚洲 | 日本一区二区电影 | 国产欧美日韩一区 | 成人黄页在线观看 | 久草电影网| 狠狠久久综合 | 国产精品乱码一二三区的特点 | 欧美一级二级视频 | 日本三级在线观看网站 | 一区二区三区久久 | 自拍偷拍第一页 | 一级一片免费视频 | 精品国产欧美一区二区三区不卡 | 午夜视频网 | 久久久亚洲一区 | 日韩成人精品视频在线观看 | 国产一级二级毛片 | 国产精品免费在线 | 亚洲高清中文字幕 | 国产一区二区三区在线免费观看 | 国产精品美女久久 | www.91av在线 | 91在线精品一区二区 | 欧美精品一区二 | 一级一级黄色片 | 日韩免费在线 | 国产xxx护士爽免费看 | 国产精品久久久久aaaa九色 | 国产中文字幕一区 | 国产在线在线 | 一本一本久久a久久精品综合妖精 | 日韩欧美综合在线 | av一区二区在线播放 | 亚洲精品一二区 | 欧美一区二区在线观看 | 国产一区二区在线视频观看 | 97在线视频免费 | 欧美日韩一区二区三区在线观看 | 精品毛片| 欧美精品亚洲精品 | 欧美日韩精品一区二区三区在线观看 | 久久精品99 | 国产99久久久久久免费看农村 | 91大神免费在线观看 | 精品日韩一区二区三区 | 亚洲欧洲一区二区 | 久久久久久久99精品免费观看 | www.久久视频 | 成人午夜| 久久se精品一区精品二区 | 久久精品国产77777蜜臀 | 亚洲精品久久久一区二区三区 | 国产一区二区久久 | 精品一区二区三区在线视频 |