進階指南
窗口掃碼表示在舊的標準 UI 下使用掃碼功能。若需使用支持多碼識別的全屏掃碼功能,請將 mPaaS 基線版本升級至 10.1.68.33 及以上。
下圖是掃一掃支持的三種 UI 掃碼樣式。
標準 UI 下使用掃一掃
全屏掃碼
如需連續(xù)掃碼,即掃碼識別成功后不退出繼續(xù)識別,可根據(jù)如下代碼來實現(xiàn)。
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 表示該回調(diào)未消費,下次識別繼續(xù)回調(diào)
return false;
}
});
重寫 MPScanCallbackAdapter
的其他方法來監(jiān)聽其他事件:
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);
}
});
在啟動全屏掃碼功能前,可根據(jù)如下代碼設置啟動參數(shù)。
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");
// 開啟 AI 識別小碼并自動放大,僅 10.2.3 及以上基線支持,需接入掃一掃 AI 組件
scanRequest.setEnableAI(true);
// 設置延時提示文案,僅 10.2.3 及以上基線支持
scanRequest.setDelayTipText("延時x秒彈出toast");
// 設置延時提示時間,單位毫秒,僅 10.2.3 及以上基線支持
scanRequest.setDelayTipTime(5000);
窗口掃碼
使用在窗口掃碼功能時,可根據(jù)如下代碼設置啟動參數(shù)。
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 碼
); // 不設置,則默認識別前三種
// 設置透明狀態(tài)欄(在 Android 4.4+ 系統(tǒng)上生效),僅 10.1.68.15+ 基線支持
scanRequest.setTranslucentStatusBar(true);
// 設置隱藏相冊按鈕,僅 10.1.68.22+ 基線支持
scanRequest.setNotSupportAlbum(true);
自定義 UI 下使用掃一掃
請參考 代碼示例。
自定義 UI 升級適配
自 10.2.3.35 起,掃一掃 SDK 新增了
MPCustomScanView
類以及相關接口,以代替此前使用的MPScanner
來實現(xiàn)自定義 UI。相比MPScanner
,使用MPCustomScanView
的方案封裝了相機管理、碼識別、多碼識別、畫面放大與縮小、碼結(jié)果解析等掃一掃服務核心流程,您在開發(fā)時無需關注相關操作,只需專注于在MPCustomScanView
中實現(xiàn)您自定義的 UI。您仍然可以繼續(xù)使用MPScanner
,但該方案將不再維護,無法在后續(xù)的升級中獲得和全屏 UI 一致的特性更新(例如多碼識別)。推薦您在合適的時機改用MPCustomScanView
方案來實現(xiàn)自定義 UI,該方案會在后續(xù)的特性升級中和全屏 UI 保持一致。自 10.1.68.5 和 10.1.60.11 起,掃一掃 SDK 新增了類
MPScanner
以及相關接口,用來替代此前自定義掃碼需要使用的BQCScanCallback
、MaScanCallback
等原始接口。相比原始接口,MPScanner
提供了完整的封裝性、簡潔易懂的 API,以及更多新特性的支持(例如環(huán)境亮度不足的回調(diào))。如果您仍然在使用BQCScanCallback
、MaScanCallback
等原始接口,當您從低版本升級時可能需要適配以下變更:10.1.68.22 版本:
MaScanCallback
類、BQCScanCallback
類、IOnMaSDKDecodeInfo
類新增部分接口,您只需空實現(xiàn)這些接口即可,其中MaScanCallback.onMaCodeInterceptor
方法返回 false 。10.1.60.6 版本:
BQCScanCallback
類新增部分接口,您只需空實現(xiàn)這些接口即可。10.1.60 版本:
BQCScanCallback
類新增部分接口,您只需空實現(xiàn)這些接口即可。10.1.20 版本:
MaScanCallback
類接口變更如下:void onResultMa(MaScanResult maScanResult)
變更為void onResultMa(MultiMaScanResult multiMaScanResult)
您可以按照以下方式獲取MaScanResult
:MaScanResult maScanResult = multiMaScanResult.maScanResults[0];
自定義 UI API 說明
MPCustomScanView
使用MPCustomScanView
,需要讓您的 Activity
繼承 MPaasToolsCaptureActivity
,并實現(xiàn) getCustomScanView
方法并返回自定義的 MPCustomScanView
。
public class MyScanActivity extends MPaasToolsCaptureActivity {
private MyScanView myScanView;
@Override
protected MPCustomScanView getCustomScanView() {
myScanView = new MyScanView(this);
// 具體可參考 github 代碼示例
return myScanView;
}
}
在 MPCustomScanView
中您可以實現(xiàn)或調(diào)用以下方法:
/**
* 掃描開始的回調(diào)
*/
public void onStartScan();
/**
* 相機首幀顯示的回調(diào)
*
* 本方法和掃描開始的回調(diào),無法保證哪個會先執(zhí)行
*/
public void onPreviewShow();
/**
* 掃描結(jié)束的回調(diào)
*/
public void onStopScan();
/**
* 相機幀的灰度值回調(diào)
* 掃描過程中每一幀都會回調(diào)一次
*
* @param gray 平均灰度值,可用來衡量環(huán)境亮度
*/
public void onGetAvgGray(int gray);
/**
* 掃描成功的回調(diào)(識別到碼)
*
* @param context 當前上下文
* @param list 識別的碼結(jié)果
*/
public abstract void onScanFinished(Context context, List<MPScanResult> list);
/**
* 掃描失敗的回調(diào)
*
* @param context 當前上下文
* @param list 失敗原因
*/
public abstract void onScanFailed(Context context, MPScanError error);
/**
* 打開相機失敗的回調(diào)
*/
public void onCameraOpenFailed();
/**
* 打開或關閉閃光燈
*
* @return 調(diào)用完該方法后閃光燈的狀態(tài)
*/
public boolean switchTorch();
/**
* 從文件中識別碼
*
* @param path 文件路徑
* @return 識別的碼結(jié)果
*/
public List<MPScanResult> scanFromPath(String path);
MPScanResult
/**
* 識別結(jié)果字符串
*/
private String text;
/**
* 識別的碼類型
*/
private MPRecognizeType mpRecognizeType;
/**
* 識別的碼的中心點坐標
*/
private Point centerPoint;
MPScanner(廢棄)
自定義 UI 相關的設置內(nèi)容如下:
/**
* 設置顯示相機內(nèi)容的 View
* 推薦在 {@link MPScanListener} 的 onConfiguration 方法中調(diào)用
*
* @param textureView 自定義掃碼頁中的 TextureView
*/
public void setDisplayView(TextureView textureView);
/**
* 設置掃描識別的區(qū)域
*
* @param rect 識別的區(qū)域
*/
public void setScanRegion(Rect rect);
/**
* 設置掃描監(jiān)聽器
*/
public void setMPScanListener(MPScanListener mpScanListener);
/**
* 設置識別圖像灰度值監(jiān)聽器
*/
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 相關的掃描內(nèi)容如下:
/**
* 打開相機并開始掃描
*
* 首次進入頁面時或相機關閉狀態(tài)下調(diào)用
*/
public void openCameraAndStartScan();
/**
* 關閉相機并停止掃描
*/
public void closeCameraAndStopScan();
/**
* 開始掃描
*
* 不會更改相機狀態(tài),需在相機打開的狀態(tài)下調(diào)用才能生效
*/
public void startScan();
/**
* 停止掃描
*
* 不會更改相機狀態(tài)
*/
public void stopScan();
/**
* 從 bitmap 中識別碼
*
* @param bitmap 需要識別的 bitmap
* @return 識別結(jié)果
*/
public MPScanResult scanFromBitmap(Bitmap bitmap);
其他:
/**
* 打開或關閉手電筒
*
* @return 調(diào)用方法后,手電筒是否打開
*/
public boolean switchTorch();
/**
* 打開手電筒
*/
public void openTorch();
/**
* 關閉手電筒
*/
public void closeTorch();
/**
* 播放默認的“嗶嗶”聲
*/
public void beep();
/**
* 釋放資源
*
* 請在 onDestroy 中調(diào)用
*/
public void release();
MPScanListener(廢棄)
/**
* 掃描參數(shù)配置完成
*/
void onConfiguration();
/**
* 掃描識別開始
*/
void onStart();
/**
* 識別成功
*
* @param result 識別結(jié)果
*/
void onSuccess(MPScanResult result);
/**
* 識別錯誤
*
* @param error 錯誤
*/
void onError(MPScanError error);
MPImageGrayListener(廢棄)
/**
* 獲取識別圖像的平均灰度值
*
* 正常范圍大約在 50-140 之間,
* 當灰度值低于或高于正常范圍時,通常意味著環(huán)境亮度過低或過高,可以提示用戶打開或關閉手電筒
* 注意:該方法在識別過程中會不斷被調(diào)用
*
* @param gray 圖像的平均灰度值
*/
void onGetImageGray(int gray);