温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么在Android中实现扫码功能

发布时间:2021-05-31 18:23:28 来源:亿速云 阅读:299 作者:Leah 栏目:开发技术

这篇文章将为大家详细讲解有关怎么在Android中实现扫码功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

1、引入

implementation 'com.journeyapps:zxing-android-embedded:3.5.0'

2、使用:

public void initScan() {         IntentIntegrator integrator = new IntentIntegrator(this);         // 设置要扫描的条码类型,ONE_D_CODE_TYPES:一维码,QR_CODE_TYPES-二维码         integrator.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE_TYPES);         integrator.setCaptureActivity(ScanActivity.class); //设置打开摄像头的Activity         integrator.setPrompt(""); //底部的提示文字,设为""可以置空         integrator.setCameraId(0); //前置或者后置摄像头         integrator.setBeepEnabled(true); //扫描成功的「哔哔」声,默认开启         integrator.setBarcodeImageEnabled(true);         integrator.initiateScan();     }       @Override     protected void onActivityResult(int requestCode, int resultCode, Intent intent) {         super.onActivityResult(requestCode, resultCode, intent);         if (requestCode == IntentIntegrator.REQUEST_CODE) {             IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);             if (scanResult != null && scanResult.getContents() != null) {                 String result = scanResult.getContents();                 LogUtil.d("扫码返回: " + result);                 try {                     JSONObject jsonObject = new JSONObject(result);                     if (jsonObject.has(Constant.USERPOLICEMENID)) {                        //TODO  逻辑                                           } else {                         ToastUtil.showShortToast("未扫描到有效的信息");                     }                 } catch (Exception e) {                     ToastUtil.showShortToast("未扫描到有效的信息");                     e.printStackTrace();                 }             } else {                 ToastUtil.showShortToast("未扫描到有效的信息");             }         }     }

3、ScanActivity

public class ScanActivity extends BackActivity {       @BindView(R.id.dbv)     DecoratedBarcodeView mDbv;     private CaptureManager captureManager;       @Override     protected int getLayoutId() {         getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);         return R.layout.activity_scan;     }       @Override     protected void init() {         super.init();         captureManager = new CaptureManager(this, mDbv);         captureManager.initializeFromIntent(getIntent(), getSavedInstanceState());         captureManager.decode();     }       @Override     public void onSaveInstanceState(@NotNull Bundle outState, @NotNull PersistableBundle outPersistentState) {         super.onSaveInstanceState(outState, outPersistentState);         captureManager.onSaveInstanceState(outState);     }       @Override     public boolean onKeyDown(int keyCode, KeyEvent event) {         return mDbv.onKeyDown(keyCode, event) || super.onKeyDown(keyCode, event);     }       @Override     protected void onPause() {         super.onPause();         captureManager.onPause();     }       @Override     public void onResume() {         super.onResume();         captureManager.onResume();     }       @Override     protected void onDestroy() {         super.onDestroy();         captureManager.onDestroy();     }   }

4、布局文件

activity_scan

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:app="http://schemas.android.com/apk/res-auto"     xmlns:tools="http://schemas.android.com/tools"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:orientation="vertical"     tools:context=".ui.main.alarmassistant.ScanActivity">         <com.journeyapps.barcodescanner.DecoratedBarcodeView         android:id="@+id/dbv"         android:layout_width="match_parent"         android:layout_height="match_parent"         android:fitsSystemWindows="true"         app:zxing_framing_rect_height="200dp"         app:zxing_framing_rect_width="200dp"         app:zxing_preview_scaling_strategy="fitXY"         app:zxing_scanner_layout="@layout/view_qr"         app:zxing_use_texture_view="true" /> </LinearLayout>

view_qr

<?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:app="http://schemas.android.com/apk/res-auto">       <com.journeyapps.barcodescanner.BarcodeView         android:id="@+id/zxing_barcode_surface"         android:layout_width="match_parent"         android:layout_height="match_parent"         app:zxing_framing_rect_height="50dp"         app:zxing_framing_rect_width="250dp" />       <com.x.x.widget.QrView         android:id="@+id/zxing_viewfinder_view"         android:layout_width="match_parent"         android:layout_height="match_parent"         app:zxing_possible_result_points="@color/color_white"         app:zxing_result_view="@color/zxing_custom_result_view"         app:zxing_viewfinder_laser="@color/color_white"         app:zxing_viewfinder_mask="@color/zxing_custom_viewfinder_mask" />       <TextView         android:id="@+id/zxing_status_view"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:layout_gravity="bottom|center_horizontal"         android:layout_marginBottom="30dp"         android:background="@color/zxing_transparent"         android:text="@string/zxing_msg_default_status"         android:textColor="@color/zxing_status_text" />       <com.x.common.widget.MyActionBar         android:id="@+id/action_bar"         android:layout_width="match_parent"         android:layout_height="wrap_content"         app:dark_mode="true"         app:title="扫一扫" /> </merge>

5、

/**  * 自定义扫描界面  */   public class QrView extends ViewfinderView {       public int laserLinePosition = 0;     public float[] position = new float[]{0f, 0.5f, 1f};     public int[] colors = new int[]{0x0027B14D, 0xff27B14D, 0x0027B14D};     public LinearGradient linearGradient;     private int ScreenRate;       public QrView(Context context, AttributeSet attrs) {         super(context, attrs);         float density = context.getResources().getDisplayMetrics().density;         ScreenRate = (int) (15 * density);     }       @Override     public void onDraw(Canvas canvas) {         int CORNER_WIDTH = 15;         refreshSizes();           if (framingRect == null || previewFramingRect == null) {             return;         }           Rect frame = framingRect;         Rect previewFrame = previewFramingRect;           int width = canvas.getWidth();         int height = canvas.getHeight();         //绘制4个角           paint.setColor(getResources().getColor(R.color.color_white));//定义画笔的颜色         canvas.drawRect(frame.left, frame.top, frame.left + ScreenRate, frame.top + CORNER_WIDTH, paint);         canvas.drawRect(frame.left, frame.top, frame.left + CORNER_WIDTH, frame.top + ScreenRate, paint);           canvas.drawRect(frame.right - ScreenRate, frame.top, frame.right, frame.top + CORNER_WIDTH, paint);         canvas.drawRect(frame.right - CORNER_WIDTH, frame.top, frame.right, frame.top + ScreenRate, paint);           canvas.drawRect(frame.left, frame.bottom - CORNER_WIDTH, frame.left + ScreenRate, frame.bottom, paint);         canvas.drawRect(frame.left, frame.bottom - ScreenRate, frame.left + CORNER_WIDTH, frame.bottom, paint);           canvas.drawRect(frame.right - ScreenRate, frame.bottom - CORNER_WIDTH, frame.right, frame.bottom, paint);         canvas.drawRect(frame.right - CORNER_WIDTH, frame.bottom - ScreenRate, frame.right, frame.bottom, paint);           // 画出外部(即构图矩形之外)变暗         paint.setColor(resultBitmap != null ? resultColor : 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);           if (resultBitmap != null) {             // Draw the opaque result bitmap over the scanning rectangle             paint.setAlpha(CURRENT_POINT_OPACITY);             canvas.drawBitmap(resultBitmap, null, frame, paint);         } else {               laserLinePosition = laserLinePosition + 8;             if (laserLinePosition >= frame.height()) {                 laserLinePosition = 0;             }             linearGradient = new LinearGradient(frame.left + 1, frame.top + laserLinePosition, frame.right - 1, frame.top + 10 + laserLinePosition, colors, position, Shader.TileMode.CLAMP);             // Draw a red "laser scanner" line through the middle to show decoding is active               paint.setShader(linearGradient);             //绘制扫描线             canvas.drawRect(frame.left + 1, frame.top + laserLinePosition, frame.right - 1, frame.top + 10 + laserLinePosition, paint);             paint.setShader(null);             float scaleX = frame.width() / (float) previewFrame.width();             float scaleY = frame.height() / (float) previewFrame.height();               List<ResultPoint> currentPossible = possibleResultPoints;             List<ResultPoint> currentLast = lastPossibleResultPoints;             int frameLeft = frame.left;             int frameTop = frame.top;             if (currentPossible.isEmpty()) {                 lastPossibleResultPoints = null;             } else {                 possibleResultPoints = new ArrayList<>(5);                 lastPossibleResultPoints = currentPossible;                 paint.setAlpha(CURRENT_POINT_OPACITY);                 paint.setColor(resultPointColor);                 for (ResultPoint point : currentPossible) {                     canvas.drawCircle(frameLeft + (int) (point.getX() * scaleX), frameTop + (int) (point.getY() * scaleY), POINT_SIZE, paint);                 }             }             if (currentLast != null) {                 paint.setAlpha(CURRENT_POINT_OPACITY / 2);                 paint.setColor(resultPointColor);                 float radius = POINT_SIZE / 2.0f;                 for (ResultPoint point : currentLast) {                     canvas.drawCircle(frameLeft + (int) (point.getX() * scaleX), frameTop + (int) (point.getY() * scaleY), radius, paint);                 }             }             postInvalidateDelayed(16, frame.left, frame.top, frame.right, frame.bottom);         }     } }

关于怎么在Android中实现扫码功能就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI