【关键字】
扫码 / customScan / 跳转二级页面 / 黑屏
【问题描述】
使用扫码功能customScan.start时,跳转二级页面,应用前后台后,返回后界面都变成全黑。在onPageShow和onPageHide里去分别调用start和stop,发现这样是不行的。必须是start和release。这个设计也很奇怪,既然必须release的才能start那你这个stop设计的是有什么用呢?
demo代码如下:
import { display } from '@kit.ArkUI';
import { tag } from '@kit.ConnectivityKit';
import { customScan, scanBarcode, scanCore } from '@kit.ScanKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { abilityAccessCtrl } from '@kit.AbilityKit';
@Entry
@Component
export struct BarcodeDemo{
private mXComponentController: XComponentController = new XComponentController();
private viewControl: customScan.ViewControl | null = null;
@State showScan: boolean = false;
aboutToAppear(): void {
//相机权限申请
let atManager = abilityAccessCtrl.createAtManager();
try {
atManager.requestPermissionsFromUser(getContext(this), ["ohos.permission.CAMERA"]).then((data) => {
data.permissions.forEach((permission: string, index: number) => {
if (permission === "ohos.permission.CAMERA") {
if (data.authResults[index] === 0) {
//说明相机权限申请成功
this.showScan = true;
}
}
})
}).catch((err: Error) => {
console.info("data:" + JSON.stringify(err));
})
} catch (err) {
console.error(`catch err->${JSON.stringify(err)}`);
}
}
build() {
Column(){
if (this.showScan) {
XComponent({
id: 'componentId',
type: 'surface',
controller: this.mXComponentController
})
.onLoad(() => {
// 获取XComponent的surfaceId
let surfaceId: string = this.mXComponentController.getXComponentSurfaceId();
// 设置ViewControl相应字段
this.viewControl = {
width: display.getDefaultDisplaySync().width,
height: display.getDefaultDisplaySync().height,
surfaceId: surfaceId
};
//init
let options: scanBarcode.ScanOptions = {
scanTypes: [scanCore.ScanType.TWO_D_CODE],
enableMultiMode: false,
enableAlbum: false
}
try {
customScan.init(options);
} catch (error) {
console.error('Failed to init, error: %{public}s', JSON.stringify(error))
}
//start
try {
customScan.start(this.viewControl, (error: BusinessError, scanResult: Array<scanBarcode.ScanResult>) => {
if (error) {
return;
}
});
} catch (error) {
}
})// 预览流宽、高,默认单位vp,支持px、lpx、vp
.height('100%')
.width('100%')
}
}
}
}
【解决方案】
跳转二级页面,应用前后台后是需要使用init和release初始化/释放相机的。stop主要是用于暂停相机流,考虑到可能有其他开发者有暂停相机流的需求,所以开放了这个接口。