Explorar o código

修改二维码识别库以及相应页面识别逻辑

Pq hai 1 ano
pai
achega
1590e1c278

+ 1 - 1
BaseLibrary/build.gradle

@@ -193,7 +193,7 @@ dependencies {
     api project(path: ':midiplaylib')
     api 'org.greenrobot:eventbus:3.1.1'
 
-    api 'cn.yipianfengye.android:zxing-library:2.2'
+    api 'com.github.bingoogolapple.BGAQRCode-Android:zxing:1.3.8'
     api ('com.github.AlexLiuSheng:CheckVersionLib:2.4.1_androidx'){
         exclude(group: 'com.squareup.okhttp3', module: 'okhttp')
         exclude(group: ' org.greenrobot', module: 'eventbus')

+ 76 - 42
BaseLibrary/src/main/java/com/cooleshow/base/ui/activity/scan/ScanActivity.java

@@ -20,8 +20,10 @@ import com.cooleshow.base.databinding.ActivityScanLayoutBinding;
 import com.cooleshow.base.presenter.ScanPresenter;
 import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.base.utils.LOG;
 import com.cooleshow.base.utils.LogUtils;
 import com.cooleshow.base.utils.PermissionUtils;
+import com.cooleshow.base.utils.ThreadUtils;
 import com.cooleshow.base.utils.ToastUtil;
 import com.cooleshow.base.utils.UiUtils;
 import com.cooleshow.base.utils.helper.GlideEngine;
@@ -33,21 +35,27 @@ import com.luck.picture.lib.config.PictureMimeType;
 import com.luck.picture.lib.entity.LocalMedia;
 import com.luck.picture.lib.tools.PictureFileUtils;
 import com.tbruyelle.rxpermissions3.RxPermissions;
-import com.uuzuche.lib_zxing.activity.CaptureFragment;
-import com.uuzuche.lib_zxing.activity.CodeUtils;
 
 import java.io.File;
 import java.util.List;
 
 import androidx.annotation.Nullable;
+import cn.bingoogolapple.qrcode.core.QRCodeView;
 
 /**
  * Author by pq, Date on 2022/7/11.
  */
 @Route(path = RouterPath.BaseCenter.SCAN_QR_CODE)
-public class ScanActivity extends BaseMVPActivity<ActivityScanLayoutBinding, ScanPresenter> implements ScanContract.ScanView, CodeUtils.AnalyzeCallback, View.OnClickListener {
+public class ScanActivity extends BaseMVPActivity<ActivityScanLayoutBinding, ScanPresenter> implements ScanContract.ScanView, View.OnClickListener {
     public static final int SELECT_IMG_REQUEST_CODE = 1001;
 
+    private Runnable mRunnable = new Runnable() {
+        @Override
+        public void run() {
+            reset();
+        }
+    };
+
     @Override
     protected void initView() {
         initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "扫码登录");
@@ -59,22 +67,47 @@ public class ScanActivity extends BaseMVPActivity<ActivityScanLayoutBinding, Sca
     @Override
     public void initData() {
         super.initData();
+        initListener();
+    }
+
+    private void initListener() {
+        viewBinding.zxingview.setDelegate(new QRCodeView.Delegate() {
+            @Override
+            public void onScanQRCodeSuccess(String result) {
+                if (!checkActivityExist()) {
+                    return;
+                }
+                LOG.i("pq,thread:" + Thread.currentThread().getName());
+                if (!TextUtils.isEmpty(result)) {
+                    LOG.i("pq", "解析成功:" + result);
+                    parseResult(result);
+                } else {
+                    sendResetMsg();
+                    ToastUtil.getInstance().showShort("解析失败");
+                }
+            }
+
+            @Override
+            public void onCameraAmbientBrightnessChanged(boolean isDark) {
+
+            }
+
+            @Override
+            public void onScanQRCodeOpenCameraError() {
+                ToastUtil.getInstance().showShort("开启摄像头失败,请检查设备状态");
+            }
+        });
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
         checkCameraPermission();
     }
 
     private void initQrScan() {
-        /**
-         * 执行扫面Fragment的初始化操作
-         */
-        CaptureFragment captureFragment = new CaptureFragment();
-        // 为二维码扫描界面设置定制化界面
-        CodeUtils.setFragmentArgs(captureFragment, R.layout.my_camera);
-
-        captureFragment.setAnalyzeCallback(this);
-        /**
-         * 替换我们的扫描控件
-         */
-        getSupportFragmentManager().beginTransaction().replace(R.id.fl_my_container, captureFragment).commit();
+        LOG.i("pq", "startSpotAndShowRect");
+        viewBinding.zxingview.startSpotAndShowRect();
     }
 
     @Override
@@ -87,18 +120,13 @@ public class ScanActivity extends BaseMVPActivity<ActivityScanLayoutBinding, Sca
         return new ScanPresenter();
     }
 
-    @Override
-    public void onAnalyzeSuccess(Bitmap mBitmap, String result) {
-        LogUtils.i("pq", "解析成功:" + result);
-        LogUtils.i("pq", "解析成功mBitmap:" + mBitmap);
-        parseResult(result);
-    }
 
     private void parseResult(String result) {
         if (TextUtils.isEmpty(result)) {
             return;
         }
         if (!checkUrlIsEnable(result)) {
+            sendResetMsg();
             ToastUtil.getInstance().showShort("请扫描酷乐秀二维码");
             return;
         }
@@ -109,11 +137,11 @@ public class ScanActivity extends BaseMVPActivity<ActivityScanLayoutBinding, Sca
         finish();
     }
 
-    @Override
-    public void onAnalyzeFailed() {
-        ToastUtil.getInstance().showShort("解析失败");
+    private void sendResetMsg() {
+        ThreadUtils.getMainHandler().postDelayed(mRunnable, 1000);
     }
 
+
     @Override
     public void onClick(View v) {
         int id = v.getId();
@@ -133,7 +161,7 @@ public class ScanActivity extends BaseMVPActivity<ActivityScanLayoutBinding, Sca
                     if (permission) {
                         initQrScan();
                     } else {
-                        UiUtils.showPermissionTipDialog(getSupportFragmentManager(),this,"提示","扫描二维码需要相机权限,去设置?");
+                        UiUtils.showPermissionTipDialog(getSupportFragmentManager(), this, "提示", "扫描二维码需要相机权限,去设置?");
                     }
                 });
     }
@@ -157,7 +185,7 @@ public class ScanActivity extends BaseMVPActivity<ActivityScanLayoutBinding, Sca
                                 .circleDimmedLayer(false)// 是否圆形裁剪 true or false
                                 .forResult(PictureConfig.CHOOSE_REQUEST);
                     } else {
-                        UiUtils.showPermissionTipDialog(getSupportFragmentManager(),this,"提示","选择照片需要相机、储存权限,去设置?");
+                        UiUtils.showPermissionTipDialog(getSupportFragmentManager(), this, "提示", "选择照片需要相机、储存权限,去设置?");
                     }
                 });
     }
@@ -170,22 +198,7 @@ public class ScanActivity extends BaseMVPActivity<ActivityScanLayoutBinding, Sca
                 // 图片、视频、音频选择结果回调
                 List<LocalMedia> selectList = PictureSelector.obtainMultipleResult(data);
                 String avatar = selectList.get(0).getCompressPath();
-                try {
-                    CodeUtils.analyzeBitmap(avatar, new CodeUtils.AnalyzeCallback() {
-                        @Override
-                        public void onAnalyzeSuccess(Bitmap mBitmap, String result) {
-                            ToastUtil.getInstance().showShort("解析成功");
-                            parseResult(result);
-                        }
-
-                        @Override
-                        public void onAnalyzeFailed() {
-                            ToastUtil.getInstance().showShort("解析二维码失败");
-                        }
-                    });
-                } catch (Exception e) {
-                    e.printStackTrace();
-                }
+                viewBinding.zxingview.decodeQRCode(avatar);
             }
         }
     }
@@ -196,4 +209,25 @@ public class ScanActivity extends BaseMVPActivity<ActivityScanLayoutBinding, Sca
         }
         return false;
     }
+
+    private void reset() {
+        if (viewBinding != null && viewBinding.zxingview != null) {
+            LOG.i("重置");
+            viewBinding.zxingview.startSpot();
+        }
+    }
+
+    @Override
+    protected void onStop() {
+        LOG.i("pq", "stopCamera");
+        viewBinding.zxingview.stopCamera(); // 关闭摄像头预览,并且隐藏扫描框
+        super.onStop();
+    }
+
+    @Override
+    public void onDestroy() {
+        viewBinding.zxingview.onDestroy();
+        super.onDestroy();
+        ThreadUtils.getMainHandler().removeCallbacks(mRunnable);
+    }
 }

+ 0 - 2
BaseLibrary/src/main/java/com/cooleshow/base/ui/activity/tools/SmallToolsActivity.java

@@ -30,8 +30,6 @@ import com.luck.picture.lib.config.PictureConfig;
 import com.luck.picture.lib.config.PictureMimeType;
 import com.luck.picture.lib.entity.LocalMedia;
 import com.tbruyelle.rxpermissions3.RxPermissions;
-import com.uuzuche.lib_zxing.activity.CaptureFragment;
-import com.uuzuche.lib_zxing.activity.CodeUtils;
 
 import java.util.List;
 

BIN=BIN
BaseLibrary/src/main/res/drawable-xxhdpi/icon_scan_border.png


+ 31 - 0
BaseLibrary/src/main/res/layout/activity_scan_layout.xml

@@ -13,6 +13,37 @@
         app:layout_constraintRight_toRightOf="parent"
         app:layout_constraintTop_toBottomOf="parent" />
 
+    <cn.bingoogolapple.qrcode.zxing.ZXingView
+        android:id="@+id/zxingview"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        app:qrcv_animTime="1000"
+        app:qrcv_borderColor="@color/transparent"
+        app:qrcv_borderSize="1dp"
+        app:qrcv_cornerColor="@color/transparent"
+        app:qrcv_cornerLength="20dp"
+        app:qrcv_cornerSize="3dp"
+        app:qrcv_isTipTextBelowRect="true"
+        app:qrcv_maskColor="#99000000"
+        app:qrcv_qrCodeTipText="请对准需要识别的二维码"
+        app:qrcv_rectWidth="255dp"
+        app:qrcv_scanLineColor="@color/transparent"
+        app:qrcv_scanLineSize="1dp"
+        app:qrcv_tipTextColor="@color/white"
+        app:qrcv_tipTextMargin="26dp"
+        app:qrcv_tipTextSize="@dimen/sp_16"
+        app:qrcv_topOffset="220dp" />
+
+    <ImageView
+        android:id="@+id/iv_border"
+        android:layout_width="275dp"
+        android:layout_height="275dp"
+        android:layout_marginTop="210dp"
+        android:src="@drawable/icon_scan_border"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
     <include
         android:id="@+id/toolbar_include"
         layout="@layout/common_toolbar_layout_white"

+ 0 - 44
BaseLibrary/src/main/res/layout/my_camera.xml

@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<FrameLayout 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"
-    tools:ignore="MissingDefaultResource">
-
-    <SurfaceView
-        android:id="@+id/preview_view"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent" />
-
-    <FrameLayout
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center"
-        android:gravity="center"
-        android:orientation="vertical">
-
-        <com.uuzuche.lib_zxing.view.ViewfinderView
-            android:id="@+id/viewfinder_view"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            app:inner_corner_color="@color/white"
-            app:inner_corner_length="30dp"
-            app:inner_corner_width="5dp"
-            app:inner_height="@dimen/qb_px_255"
-            app:inner_scan_bitmap="@null"
-            app:inner_scan_iscircle="false"
-            app:inner_scan_speed="20"
-            app:inner_width="@dimen/qb_px_255" />
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center"
-            android:layout_marginTop="@dimen/qb_px_153"
-            android:includeFontPadding="false"
-            android:text="请对准需要识别的二维码。"
-            android:textColor="@color/white"
-            android:textSize="@dimen/sp_16" />
-    </FrameLayout>
-</FrameLayout>

+ 0 - 3
student/src/main/java/com/cooleshow/student/App.java

@@ -35,7 +35,6 @@ import com.tencent.bugly.crashreport.CrashReport;
 import com.tencent.tauth.Tencent;
 import com.umeng.commonsdk.UMConfigure;
 import com.umeng.socialize.PlatformConfig;
-import com.uuzuche.lib_zxing.activity.ZXingLibrary;
 import com.vanniktech.emoji.EmojiManager;
 import com.vanniktech.emoji.ios.IosEmojiProvider;
 
@@ -92,8 +91,6 @@ public class App extends BaseApplication {
         initBugly();
         initIM();
         initUmeng();
-        //二维码扫描
-        ZXingLibrary.initDisplayOpinion(this);
     }
 
     private void initBugly() {

+ 5 - 2
student/src/main/java/com/cooleshow/student/widgets/dialog/LiveRoomShareDialog.java

@@ -4,6 +4,7 @@ import android.app.Activity;
 import android.app.Dialog;
 import android.content.Context;
 import android.graphics.Bitmap;
+import android.graphics.Color;
 import android.os.Bundle;
 import android.text.TextUtils;
 import android.view.View;
@@ -28,11 +29,11 @@ import com.umeng.socialize.bean.SHARE_MEDIA;
 import com.umeng.socialize.media.UMImage;
 import com.umeng.socialize.shareboard.SnsPlatform;
 import com.umeng.socialize.utils.ShareBoardlistener;
-import com.uuzuche.lib_zxing.activity.CodeUtils;
 
 import java.io.File;
 
 import androidx.annotation.NonNull;
+import cn.bingoogolapple.qrcode.zxing.QRCodeEncoder;
 import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
 import io.reactivex.rxjava3.core.Observable;
 import io.reactivex.rxjava3.core.ObservableEmitter;
@@ -137,7 +138,9 @@ public class LiveRoomShareDialog extends Dialog {
         Observable.create(new ObservableOnSubscribe<Bitmap>() {
             @Override
             public void subscribe(@io.reactivex.rxjava3.annotations.NonNull ObservableEmitter<Bitmap> emitter) throws Throwable {
-                Bitmap bitmap = CodeUtils.createImage(url, SizeUtils.dp2px(89), SizeUtils.dp2px(89), null);
+
+                Bitmap bitmap = QRCodeEncoder.syncEncodeQRCode(url, SizeUtils.dp2px(89), Color.BLACK, null);
+//                Bitmap bitmap = CodeUtils.createImage(url, SizeUtils.dp2px(89), SizeUtils.dp2px(89), null);
                 emitter.onNext(bitmap);
             }
         }).subscribeOn(Schedulers.newThread())

+ 0 - 3
teacher/src/main/java/com/cooleshow/teacher/App.java

@@ -32,7 +32,6 @@ import com.tencent.bugly.crashreport.CrashReport;
 import com.tencent.tauth.Tencent;
 import com.umeng.commonsdk.UMConfigure;
 import com.umeng.socialize.PlatformConfig;
-import com.uuzuche.lib_zxing.activity.ZXingLibrary;
 import com.vanniktech.emoji.EmojiManager;
 import com.vanniktech.emoji.ios.IosEmojiProvider;
 
@@ -90,8 +89,6 @@ public class App extends BaseApplication {
         registrationId = JPushInterface.getRegistrationID(this);
         initRong();
         initUmeng();
-        //二维码扫描
-        ZXingLibrary.initDisplayOpinion(this);
     }
 
     private void initBugly() {

+ 43 - 3
teacher/src/main/java/com/cooleshow/teacher/ui/score/MineScoreActivity.java

@@ -3,6 +3,8 @@ package com.cooleshow.teacher.ui.score;
 import android.content.Intent;
 import android.content.res.Configuration;
 import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Color;
 import android.os.Bundle;
 import android.text.TextUtils;
 import android.view.View;
@@ -20,6 +22,7 @@ import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.ui.activity.BaseMVPActivity;
 import com.cooleshow.base.utils.FileUtils;
 import com.cooleshow.base.utils.KeyboardUtils;
+import com.cooleshow.base.utils.SizeUtils;
 import com.cooleshow.base.utils.SoftKeyboardUtils;
 import com.cooleshow.base.utils.ToastUtil;
 import com.cooleshow.base.utils.ToastUtils;
@@ -63,6 +66,14 @@ import java.util.List;
 
 import androidx.viewpager2.adapter.FragmentStateAdapter;
 import androidx.viewpager2.widget.ViewPager2;
+import cn.bingoogolapple.qrcode.zxing.QRCodeEncoder;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.ObservableEmitter;
+import io.reactivex.rxjava3.core.ObservableOnSubscribe;
+import io.reactivex.rxjava3.core.Observer;
+import io.reactivex.rxjava3.disposables.Disposable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 /**
  * 创建日期:2022/5/20 16:34
@@ -237,7 +248,7 @@ public class MineScoreActivity extends BaseMVPActivity<ActivityMineScoreBinding,
                 return fragments != null ? fragments.size() : 0;
             }
         });
-        TabLayoutMediator tabLayoutMediator=new TabLayoutMediator(tabLayout, viewPager, (tab, position) -> {
+        TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(tabLayout, viewPager, (tab, position) -> {
             //这里需要根据position修改tab的样式和文字等
             tab.setText(titles.get(position));
             tab.select();
@@ -265,12 +276,41 @@ public class MineScoreActivity extends BaseMVPActivity<ActivityMineScoreBinding,
     }
 
     private void showScoreShareDialog(MusicSheetShareBean data) {
-        DialogUtils.showScoreShare(this, data, bitmap -> share(bitmap));
+        showLoading("图片生成中");
+        Observable.create(new ObservableOnSubscribe<Bitmap>() {
+                    @Override
+                    public void subscribe(@io.reactivex.rxjava3.annotations.NonNull ObservableEmitter<Bitmap> emitter) throws Throwable {
+                        Bitmap bitmap = QRCodeEncoder.syncEncodeQRCode(data.url, SizeUtils.dp2px(89), Color.BLACK, BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
+                        emitter.onNext(bitmap);
+                    }
+                }).subscribeOn(Schedulers.newThread())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribe(new Observer<Bitmap>() {
+                    @Override
+                    public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) {
+
+                    }
+
+                    @Override
+                    public void onNext(@io.reactivex.rxjava3.annotations.NonNull Bitmap qrBitmap) {
+                        DialogUtils.showScoreShare(MineScoreActivity.this, qrBitmap, data, bitmap -> share(bitmap));
+                    }
+
+                    @Override
+                    public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) {
+                        hideLoading();
+                    }
+
+                    @Override
+                    public void onComplete() {
+                        hideLoading();
+                    }
+                });
     }
 
     private void share(Bitmap bitmap) {
         mShareAction = new ShareAction(MineScoreActivity.this).setDisplayList(
-                SHARE_MEDIA.WEIXIN, SHARE_MEDIA.WEIXIN_CIRCLE, SHARE_MEDIA.SINA)
+                        SHARE_MEDIA.WEIXIN, SHARE_MEDIA.WEIXIN_CIRCLE, SHARE_MEDIA.SINA)
                 .setShareboardclickCallback(new ShareBoardlistener() {
                     @Override
                     public void onclick(SnsPlatform snsPlatform, SHARE_MEDIA share_media) {

+ 1 - 3
teacher/src/main/java/com/cooleshow/teacher/widgets/DialogUtils.java

@@ -32,7 +32,6 @@ import com.cooleshow.teacher.adapter.MessageBoxAdapter;
 import com.cooleshow.teacher.adapter.ScoreShareListAdapter;
 import com.cooleshow.teacher.bean.MusicSheetShareBean;
 import com.cooleshow.usercenter.utils.SavePicUtil;
-import com.uuzuche.lib_zxing.activity.CodeUtils;
 
 /**
  * 创建日期:2022/5/24 15:22
@@ -59,14 +58,13 @@ public class DialogUtils {
         void onShareClick(Bitmap bitmap);
     }
 
-    public static void showScoreShare(Context context, MusicSheetShareBean data, ActionShareCallback callback) {
+    public static void showScoreShare(Context context,Bitmap bitmap, MusicSheetShareBean data, ActionShareCallback callback) {
         LinearLayout.LayoutParams pm = new LinearLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
         AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.Dialog);
         LayoutInflater inflater = LayoutInflater.from(context);
         View view = inflater.inflate(R.layout.dialog_score_share, null);//这里的R.layout.alertdialog即为你自定义的布局文件
         TextView tv_teacher_name = view.findViewById(R.id.tv_teacher_name);
         if (!TextUtils.isEmpty(data.url)) {
-            Bitmap bitmap = CodeUtils.createImage(data.url, 400, 400, BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher));
             ImageView im_qr_code = view.findViewById(R.id.im_qr_code);
             if (bitmap != null) {
                 im_qr_code.setImageBitmap(bitmap);