进阶指南

窗口扫码表示在旧的标准 UI 下使用扫码功能。若需使用支持多码识别的全屏扫码功能,请将 mPaaS 基线版本升级至 10.1.68.33 及以上。

下图是扫一扫支持的三种 UI 扫码样式。扫一扫进阶指南

标准 UI 下使用扫一扫

全屏扫码

说明

多码识别功能只支持在标准 UI 下使用。

如需连续扫码,即扫码识别成功后不退出继续识别,可根据如下代码来实现。

ScanRequest scanRequest = new ScanRequest();
        MPScan.startMPaasScanFullScreenActivity(this, scanRequest, new MPScanCallbackAdapter() {
            @Override
            public boolean onScanFinish(Context context, MPScanResult mpScanResult, final MPScanStarter mpScanStarter) {
                new android.app.AlertDialog.Builder(context)
                        .setMessage(mpScanResult != null ? mpScanResult.getText() : "没有识别到码")
                        .setPositiveButton(R.string.confirm, new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                mpScanStarter.restart();
                            }
                        })
                        .create()
                        .show();
                // 返回 false 表示该回调未消费,下次识别继续回调
                return false;
            }
        });

重写 MPScanCallbackAdapter 的其他方法来监听其他事件:

MPScan.startMPaasScanFullScreenActivity(this, scanRequest, new MPScanCallbackAdapter() {
    @Override
    public boolean onScanFinish(final Context context, MPScanResult mpScanResult, final MPScanStarter mpScanStarter) {
        return true;
    }

    @Override
    public boolean onScanError(Context context, MPScanError error) {
        // 识别错误
        return super.onScanError(context, error);
    }

    @Override
    public boolean onScanCancel(Context context) {
        // 识别取消
        return super.onScanCancel(context);
    }
});

在启动全屏扫码功能前,可根据如下代码设置启动参数。

ScanRequest scanRequest = new ScanRequest();

// 设置提示文字
scanRequest.setViewText("提示文字");

// 设置打开手电筒提示文字
scanRequest.setOpenTorchText("打开手电筒");

// 设置关闭手电筒提示文字
scanRequest.setCloseTorchText("关闭手电筒");

// 设置扫码识别类型
// 该设置仅对直接扫码生效,对识别相册图片无效
scanRequest.setRecognizeType(
    ScanRequest.RecognizeType.QR_CODE,    // 二维码
    ScanRequest.RecognizeType.BAR_CODE,   // 条形码
    ScanRequest.RecognizeType.DM_CODE,    // DM 码
    ScanRequest.RecognizeType.PDF417_Code // PDF417 码
); // 不设置,则默认识别前三种

// 设置隐藏相册按钮
scanRequest.setNotSupportAlbum(true);

// 设置多码标记图片
scanRequest.setMultiMaMarker(R.drawable.green_arrow);

// 设置多码提示文字
scanRequest.setMultiMaTipText("点击绿色箭头选择码");

// 设置选中单个码后的圆点颜色
scanRequest.setMaTargetColor("#32CD32");

窗口扫码

使用在窗口扫码功能时,可根据如下代码设置启动参数。

ScanRequest scanRequest = new ScanRequest();

// 设置扫码页 UI 风格
scanRequest.setScanType(ScanRequest.ScanType.QRCODE);  // 二维码风格
scanRequest.setScanType(ScanRequest.ScanType.BARCODE); // 条形码风格,默认

// 设置扫码界面 title
scanRequest.setTitleText("标准扫码");

// 设置扫码窗口下提示文字
scanRequest.setViewText("提示文字");

// 设置打开手电筒提示文字,仅 10.1.60 及以上基线支持
scanRequest.setOpenTorchText("打开手电筒");

// 设置关闭手电筒提示文字,仅 10.1.60 及以上基线支持
scanRequest.setCloseTorchText("关闭手电筒");

// 设置扫码识别类型,仅 10.1.60.6+ 和 10.1.68.2+ 基线支持
// 该设置仅对直接扫码生效,对识别相册图片无效
scanRequest.setRecognizeType(
    ScanRequest.RecognizeType.QR_CODE,    // 二维码
    ScanRequest.RecognizeType.BAR_CODE,   // 条形码
    ScanRequest.RecognizeType.DM_CODE,    // DM 码
    ScanRequest.RecognizeType.PDF417_Code // PDF417 码
); // 不设置,则默认识别前三种

// 设置透明状态栏(在 Android 4.4+ 系统上生效),仅 10.1.68.15+ 基线支持
scanRequest.setTranslucentStatusBar(true);

// 设置隐藏相册按钮,仅 10.1.68.22+ 基线支持
scanRequest.setNotSupportAlbum(true);

自定义 UI 下使用扫一扫

请参考 代码示例

自定义 UI 升级适配

从 10.1.68.5 和 10.1.60.11 开始,扫一扫 SDK 新增了类 MPScanner 以及相关接口,用来替代此前自定义扫码需要使用的 BQCScanCallback、MaScanCallback 等原始接口。相比原始接口,MPScanner 提供了完整的封装性、简洁易懂的 API,以及更多新特性的支持(例如环境亮度不足的回调),强烈推荐您使用 MPScanner 来开发自定义扫码页。如果您仍然在使用 BQCScanCallback、MaScanCallback 等原始接口,当您从低版本升级时可能需要适配以下变更:

  • 10.1.68.22 版本:MaScanCallback 类、BQCScanCallback 类、IOnMaSDKDecodeInfo 类新增部分接口,您只需空实现这些接口即可,其中 MaScanCallback.onMaCodeInterceptor 方法返回 false 。

  • 10.1.60.6 版本:BQCScanCallback 类新增部分接口,您只需空实现这些接口即可。

  • 10.1.60 版本:BQCScanCallback 类新增部分接口,您只需空实现这些接口即可。

  • 10.1.20 版本:MaScanCallback 类接口变更如下:void onResultMa(MaScanResult maScanResult) 变更为 void onResultMa(MultiMaScanResult multiMaScanResult) 您可以按照以下方式获取 MaScanResult

    MaScanResult maScanResult = multiMaScanResult.maScanResults[0];

自定义 UI API 说明

MPScanner

自定义 UI 相关的设置内容如下:

/**
 * 设置显示相机内容的 View
 * 推荐在 {@link MPScanListener} 的 onConfiguration 方法中调用
 *
 * @param textureView 自定义扫码页中的 TextureView
 */
public void setDisplayView(TextureView textureView);

/**
 * 设置扫描识别的区域
 * 
 * @param rect 识别的区域
 */
public void setScanRegion(Rect rect);

/**
 * 设置扫描监听器
 */
public void setMPScanListener(MPScanListener mpScanListener);

/**
 * 设置识别图像灰度值监听器
 */
public void setMPImageGrayListener(MPImageGrayListener mpImageGrayListener);

/**
 * 获取 Camera 对象
 * 
 * @return Camera 对象
 */
public Camera getCamera();

/**
 * 设置识别的码类型
 * 仅对直接扫码生效,对从 bitmap 中识别码无效
 *
 *
 * @param recognizeTypes BAR_CODE 条形码;
 *                       QR_CODE 二维码;
 *                       DM_CODE DM 码;
 *                       PDF417_CODE PDF417 码;
 *                       不设置则默认识别前三种
 */
public void setRecognizeType(MPRecognizeType... recognizeTypes);

自定义 UI 相关的扫描内容如下:

/**
 * 打开相机并开始扫描
 * 
 * 首次进入页面时或相机关闭状态下调用
 */
public void openCameraAndStartScan();

/**
 * 关闭相机并停止扫描
 */
public void closeCameraAndStopScan();

/**
 * 开始扫描
 * 
 * 不会更改相机状态,需在相机打开的状态下调用才能生效
 */
public void startScan();

/**
 * 停止扫描
 *
 * 不会更改相机状态
 */
public void stopScan();

/**
 * 从 bitmap 中识别码
 *
 * @param bitmap 需要识别的 bitmap
 * @return 识别结果
 */
public MPScanResult scanFromBitmap(Bitmap bitmap);

其他:

/**
 * 打开或关闭手电筒
 *
 * @return 调用方法后,手电筒是否打开
 */
public boolean switchTorch();

/**
 * 打开手电筒
 */
public void openTorch();

/**
 * 关闭手电筒
 */
public void closeTorch();

/**
 * 播放默认的“哔哔”声
 */
public void beep();

/**
 * 释放资源
 * 
 * 请在 onDestroy 中调用
 */
public void release();

MPScanListener

/**
 * 扫描参数配置完成
 */
void onConfiguration();

/**
 * 扫描识别开始
 */
void onStart();

/**
 * 识别成功
 *
 * @param result 识别结果
 */
void onSuccess(MPScanResult result);

/**
 * 识别错误
 *
 * @param error 错误
 */
void onError(MPScanError error);

MPImageGrayListener

/**
 * 获取识别图像的平均灰度值
 *
 * 正常范围大约在 50-140 之间,
 * 当灰度值低于或高于正常范围时,通常意味着环境亮度过低或过高,可以提示用户打开或关闭手电筒
 * 注意:该方法在识别过程中会不断被调用
 *
 * @param gray 图像的平均灰度值
 */
void onGetImageGray(int gray);

MPScanResult

/**
 * 识别结果字符串
 */
private String text;

/**
 * 识别的码类型
 */
private MPRecognizeType mpRecognizeType;
阿里云首页 移动开发平台 mPaaS 相关技术圈