Android扫描zxing定制化界面实现扫描和图片解析定制ui

这里我用的zxing封装后的框架

https://github.com/yipianfengye/android-zxingLibrary

这是基本的使用:
1.compile ‘cn.yipianfengye.android:zxing-library:2.2’ 然后sync一下
2.在Application的OnCreate方法中加入:

 ZXingLibrary.initDisplayOpinion(this);

3.在需要掉起这个功能的地方加入:

Intent intent = new Intent(MainActivity.this, CaptureActivity.class);
               startActivityForResult(intent, REQUEST_CODE);

然后在该Activity重写OnActivityResult方法:

if (requestCode == REQUEST_CODE) {
           //处理扫描结果(在界面上显示)
           if (null != data) {
               Bundle bundle = data.getExtras();
               if (bundle == null) {
                   return;
               }
               if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS) {
                   String result = bundle.getString(CodeUtils.RESULT_STRING);
                   Toast.makeText(this, "解析结果:" + result, Toast.LENGTH_LONG).show();
               } else if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED) {
                   Toast.makeText(MainActivity.this, "解析二维码失败", Toast.LENGTH_LONG).show();
               }
           }
       }

4.解析图片:

if (requestCode == REQUEST_IMAGE) {
            if (data != null) {
                Uri uri = data.getData();
                ContentResolver cr = getContentResolver();
                try {
                    Bitmap mBitmap = MediaStore.Images.Media.getBitmap(cr, uri);//显得到bitmap图片

                    CodeUtils.analyzeBitmap(mBitmap, new CodeUtils.AnalyzeCallback() {
                        @Override
                        public void onAnalyzeSuccess(Bitmap mBitmap, String result) {
                            Toast.makeText(MainActivity.this, "解析结果:" + result, Toast.LENGTH_LONG).show();
                        }

                        @Override
                        public void onAnalyzeFailed() {
                            Toast.makeText(MainActivity.this, "解析二维码失败", Toast.LENGTH_LONG).show();
                        }
                    });

                    if (mBitmap != null) {
                        mBitmap.recycle();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

当然也可以选择相册图片进行解析:

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
startActivityForResult(intent, REQUEST_IMAGE);

5.定制化扫描界面:这个库的扫描组件是fragment,所以我们就是在自己的定制化的界面中加入自己的风格和控件然后留一个framelayout来给库的扫描留位置.
步骤1:在定制化的Activity中留一个fragment,这里我们可以就定制一个按钮

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_second"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/second_button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="确定"
        android:layout_marginTop="20dp"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginBottom="10dp"
        android:layout_gravity="bottom|center_horizontal"
        />

    <FrameLayout
        android:id="@+id/fl_my_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        ></FrameLayout>

</FrameLayout>

步骤2:将zxing库里的扫描fragment new出来然后替换那个framelayout的id

 CaptureFragment captureFragment = new CaptureFragment();
        // 为二维码扫描界面设置定制化界面
        CodeUtils.setFragmentArgs(captureFragment, R.layout.my_camera);
        
        captureFragment.setAnalyzeCallback(analyzeCallback);
        /**
         * 替换我们的扫描控件
         */ getSupportFragmentManager().beginTransaction().replace(R.id.fl_my_container, captureFragment).commit();

步骤3:扫描的回调函数:

/**
    * 二维码解析回调函数
    */
   CodeUtils.AnalyzeCallback analyzeCallback = new CodeUtils.AnalyzeCallback() {
       @Override
       public void onAnalyzeSuccess(Bitmap mBitmap, String result) {
           Intent resultIntent = new Intent();
           Bundle bundle = new Bundle();
           bundle.putInt(CodeUtils.RESULT_TYPE, CodeUtils.RESULT_SUCCESS);
           bundle.putString(CodeUtils.RESULT_STRING, result);
           resultIntent.putExtras(bundle);
           SecondActivity.this.setResult(RESULT_OK, resultIntent);
           SecondActivity.this.finish();
       }

       @Override
       public void onAnalyzeFailed() {
           Intent resultIntent = new Intent();
           Bundle bundle = new Bundle();
           bundle.putInt(CodeUtils.RESULT_TYPE, CodeUtils.RESULT_FAILED);
           bundle.putString(CodeUtils.RESULT_STRING, "");
           resultIntent.putExtras(bundle);
           SecondActivity.this.setResult(RESULT_OK, resultIntent);
           SecondActivity.this.finish();
       }
   };

如果还是不满意ui,可以下载该github的项目然后将lib-zxing module导入你的项目,然后进行修改.
这个库还可以生成带/不带logo的二维吗图片

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Android应用中使用ZXing库来实现扫描二维码功能,您可以按照以下步骤操作: 1. 在您的项目中添加ZXing库的依赖。您可以在build.gradle文件中添加以下依赖: ```gradle implementation 'com.google.zxing:core:3.4.0' implementation 'com.journeyapps:zxing-android-embedded:3.6.0' ``` 2. 在您的布局文件中添加一个用于显示摄像头预览的SurfaceView: ```xml <SurfaceView android:id="@+id/surfaceView" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 3. 在您的代码中创建一个ZXing库的核心对象和一个用于处理扫描结果的回调函数: ```java private CaptureManager capture; private ZXingScannerView scannerView; private void initScanner() { scannerView = new ZXingScannerView(this); setContentView(scannerView); capture = new CaptureManager(this, scannerView); capture.initializeFromIntent(getIntent(), null); capture.decode(); scannerView.setResultHandler(new ResultHandler()); } private class ResultHandler implements ZXingScannerView.ResultHandler { @Override public void handleResult(Result rawResult) { // 处理扫描结果 String result = rawResult.getText(); // 在此处添加您的处理逻辑 // ... // 重新开始扫描 scannerView.resumeCameraPreview(this); } } ``` 4. 在您的Activity的onCreate方法中调用initScanner()方法来初始扫描器: ```java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initScanner(); } ``` 5. 在您的Activity的onResume方法中调用capture.onResume()和scannerView.onResume()方法来恢复扫描器: ```java @Override protected void onResume() { super.onResume(); capture.onResume(); scannerView.onResume(); } ``` 6. 在您的Activity的onPause方法中调用capture.onPause()和scannerView.onPause()方法来暂停扫描器: ```java @Override protected void onPause() { super.onPause(); capture.onPause(); scannerView.onPause(); } ``` 7. (可选)您可以在您的Activity的onDestroy方法中调用capture.onDestroy()方法来释放扫描器: ```java @Override protected void onDestroy() { super.onDestroy(); capture.onDestroy(); } ``` 现在您的应用已经可以使用ZXing库来扫描二维码了。在您的应用中启动这个Activity,您将看到一个用于扫描二维码的摄像头预览界面。当您扫描到一个二维码时,它的内容将会传递给您在第3步中创建的ResultHandler对象的handleResult方法中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值