From fd77c31bba3520ab6d540377708b91a8a8dc6dd8 Mon Sep 17 00:00:00 2001 From: liugang9704 <2745340733@qq.com> Date: Tue, 23 Sep 2025 20:57:52 +0800 Subject: [PATCH 1/2] =?UTF-8?q?AVRecorder=E3=80=81ProcessingInterfaceTest?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=9C=AA=E6=8D=95=E8=8E=B7=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HDRVivid/AVRecorder/README.en.md | 6 +- HDRVivid/AVRecorder/README.md | 6 +- HDRVivid/AVRecorder/build-profile.json5 | 4 +- .../main/ets/entryability/EntryAbility.ets | 32 ++- .../entry/src/main/ets/pages/Index.ets | 16 +- .../entry/src/main/ets/pages/Record.ets | 89 ++++-- .../entry/src/main/ets/utils/FileUtil.ets | 20 +- .../main/ets/entryability/EntryAbility.ets | 2 - .../entry/src/main/ets/pages/Index.ets | 14 +- .../entry/src/main/ets/pages/VideoPage.ets | 70 +++-- .../entry/src/main/ets/utils/AVPlayerDemo.ets | 262 ++++++++++++------ .../entry/src/main/ets/utils/WindowUtil.ets | 44 ++- 12 files changed, 388 insertions(+), 177 deletions(-) diff --git a/HDRVivid/AVRecorder/README.en.md b/HDRVivid/AVRecorder/README.en.md index e2ed75d9..7e9ce127 100644 --- a/HDRVivid/AVRecorder/README.en.md +++ b/HDRVivid/AVRecorder/README.en.md @@ -35,8 +35,8 @@ This sample demonstrates the use of Camera Kit to customize a camera and use the 1. The sample app is supported only on Huawei phones running the standard system. -2. The HarmonyOS version must be HarmonyOS 5.0.5 Release or later. +2. The HarmonyOS version must be HarmonyOS 5.1.0 Release or later. -3. The DevEco Studio version must be DevEco Studio 5.0.5 Release or later. +3. The DevEco Studio version must be DevEco Studio 5.1.0 Release or later. -4. The HarmonyOS SDK version must be HarmonyOS 5.0.5 Release SDK or later. +4. The HarmonyOS SDK version must be HarmonyOS 5.1.0 Release SDK or later. diff --git a/HDRVivid/AVRecorder/README.md b/HDRVivid/AVRecorder/README.md index 94c329e0..184ac4ff 100644 --- a/HDRVivid/AVRecorder/README.md +++ b/HDRVivid/AVRecorder/README.md @@ -33,9 +33,9 @@ 1. 本示例仅支持标准系统上运行,支持设备:华为手机。 -2. HarmonyOS系统:HarmonyOS 5.0.5 Release及以上。 +2. HarmonyOS系统:HarmonyOS 5.1.0 Release及以上。 -3. DevEco Studio版本:DevEco Studio 5.0.5 Release及以上。 +3. DevEco Studio版本:DevEco Studio 5.1.0 Release及以上。 -4. HarmonyOS SDK版本:HarmonyOS 5.0.5 Release SDK及以上。 +4. HarmonyOS SDK版本:HarmonyOS 5.1.0 Release SDK及以上。 diff --git a/HDRVivid/AVRecorder/build-profile.json5 b/HDRVivid/AVRecorder/build-profile.json5 index b2ca56e3..9f4024dd 100644 --- a/HDRVivid/AVRecorder/build-profile.json5 +++ b/HDRVivid/AVRecorder/build-profile.json5 @@ -5,8 +5,8 @@ { "name": "default", "signingConfig": "default", - "compatibleSdkVersion": "5.0.5(17)", - "targetSdkVersion": "5.0.5(17)", + "compatibleSdkVersion": "5.1.0(18)", + "targetSdkVersion": "5.1.0(18)", "runtimeOS": "HarmonyOS", } ], diff --git a/HDRVivid/AVRecorder/entry/src/main/ets/entryability/EntryAbility.ets b/HDRVivid/AVRecorder/entry/src/main/ets/entryability/EntryAbility.ets index ef7705b3..ad1fe45c 100644 --- a/HDRVivid/AVRecorder/entry/src/main/ets/entryability/EntryAbility.ets +++ b/HDRVivid/AVRecorder/entry/src/main/ets/entryability/EntryAbility.ets @@ -39,19 +39,25 @@ export default class EntryAbility extends UIAbility { return; } Logger.info(TAG, 'testTag', 'Succeeded in loading the content.'); - let windowClass: window.Window = windowStage.getMainWindowSync(); - let isLayoutFullScreen = true; - let uiContext: UIContext | undefined = windowStage.getMainWindowSync().getUIContext(); - AppStorage.setOrCreate('uiContext', uiContext); - windowClass.setWindowLayoutFullScreen(isLayoutFullScreen) - .then(() => { - Logger.info(TAG, 'testTag', 'Succeeded in setting the window layout to full-screen mode. Data: %{public}s', - JSON.stringify(data) ?? ''); - }) - .catch((err: BusinessError) => { - Logger.error(TAG, 'testTag', 'Failed to set the window layout to full-screen mode. Cause: %{public}s', - JSON.stringify(err) ?? ''); - }) + + try { + let windowClass: window.Window = windowStage.getMainWindowSync(); + let isLayoutFullScreen = true; + let uiContext: UIContext | undefined = windowStage.getMainWindowSync().getUIContext(); + AppStorage.setOrCreate('uiContext', uiContext); + windowClass.setWindowLayoutFullScreen(isLayoutFullScreen) + .then(() => { + Logger.info(TAG, 'testTag', 'Succeeded in setting the window layout to full-screen mode. Data: %{public}s', + JSON.stringify(data) ?? ''); + }) + .catch((err: BusinessError) => { + Logger.error(TAG, 'testTag', 'Failed to set the window layout to full-screen mode. Cause: %{public}s', + JSON.stringify(err) ?? ''); + }) + } catch (error) { + let err = error as BusinessError; + Logger.error(TAG, `getMainWindowSync or getUIContext failed, code=${err.code}, message=${err.message}`); + } }); } diff --git a/HDRVivid/AVRecorder/entry/src/main/ets/pages/Index.ets b/HDRVivid/AVRecorder/entry/src/main/ets/pages/Index.ets index 8e530f47..6780fd6d 100644 --- a/HDRVivid/AVRecorder/entry/src/main/ets/pages/Index.ets +++ b/HDRVivid/AVRecorder/entry/src/main/ets/pages/Index.ets @@ -87,7 +87,13 @@ struct Index { message: $r('app.string.show_toast_message'), duration: CommonConstants.SHOW_TOAST_DURATION, bottom: CommonConstants.SHOW_TOAST_BOTTOM - }); + }) + .then(() => { + Logger.info(TAG, 'openToast success'); + }) + .catch((err: BusinessError) => { + Logger.error(TAG, `openToast failed, code=${err.code}, message=${err.message}`) + }) break; } } @@ -117,7 +123,13 @@ struct Index { .onClick(async () => { this.checkAccessToken(this.permissions); if (this.result) { - router?.pushUrl({ url: 'pages/Record' }); + router?.pushUrl({ url: 'pages/Record' }) + .then(() => { + Logger.info(TAG, 'pushUrl success'); + }) + .catch((err: BusinessError) => { + Logger.error(TAG, `pushUrl failed, code=${err.code}, message=${err.message}`) + }) } }) } diff --git a/HDRVivid/AVRecorder/entry/src/main/ets/pages/Record.ets b/HDRVivid/AVRecorder/entry/src/main/ets/pages/Record.ets index 94ffa836..130d41bd 100644 --- a/HDRVivid/AVRecorder/entry/src/main/ets/pages/Record.ets +++ b/HDRVivid/AVRecorder/entry/src/main/ets/pages/Record.ets @@ -51,7 +51,7 @@ struct Record { aboutToAppear() { this.path = context.filesDir + '/' + 'VIDEO_' + Date.parse(new Date().toString()) + '.mp4'; let file = FileUtil.createOrOpen(this.path); - this.url = 'fd://' + file.fd; + this.url = 'fd://' + file?.fd; this.videoUri = fileUri.getUriFromPath(this.path); } @@ -107,7 +107,14 @@ struct Record { } async initCamera(context: common.Context | undefined, surfaceId: string) { - this.cameraManager = camera.getCameraManager(context); + // this.cameraManager = camera.getCameraManager(context); + try { + this.cameraManager = camera.getCameraManager(context) + } catch (error) { + let err = error as BusinessError; + Logger.error(TAG, `getCameraManager failed, code=${err.code}, message=${err.message}`); + } + if (!this.cameraManager) { Logger.error(TAG, 'camera.getCameraManager error'); return; @@ -361,10 +368,16 @@ struct Record { Logger.error(`The isVideoStabilizationModeSupported call failed. error code: ${err.code}`); } if (isSupported) { - // Setting video anti-shake - this.captureSession.setVideoStabilizationMode(mode); - let activeVideoStabilizationMode = this.captureSession.getActiveVideoStabilizationMode(); - Logger.info(`activeVideoStabilizationMode: ${activeVideoStabilizationMode}`); + try { + // Setting video anti-shake + this.captureSession.setVideoStabilizationMode(mode); + let activeVideoStabilizationMode = this.captureSession.getActiveVideoStabilizationMode(); + Logger.info(`activeVideoStabilizationMode: ${activeVideoStabilizationMode}`); + } catch (error) { + let err = error as BusinessError; + Logger.warn(TAG, + `setVideoStabilizationMode or getActiveVideoStabilizationMode failed, code=${err.code}, message=${err.message}`); + } } else { Logger.error(`videoStabilizationMode: ${mode} is not support`); } @@ -388,8 +401,13 @@ struct Record { let err = error as BusinessError; Logger.error(`The setColorSpace call failed, error code: ${err.code}`); } - let activeColorSpace: colorSpaceManager.ColorSpace = this.captureSession.getActiveColorSpace(); - Logger.info(`activeColorSpace: ${activeColorSpace}`); + try { + let activeColorSpace: colorSpaceManager.ColorSpace = this.captureSession.getActiveColorSpace(); + Logger.info(`activeColorSpace: ${activeColorSpace}`); + } catch (error) { + let err = error as BusinessError; + Logger.error(`getActiveColorSpace failed, code=${err.code}, message=${err.message}`); + } } else { Logger.error(`colorSpace: ${colorSpace} is not support`); } @@ -425,6 +443,7 @@ struct Record { } } } + // [End start_record] async stopRecord() { @@ -450,28 +469,38 @@ struct Record { let err = error as BusinessError; Logger.error(TAG, `avRecorder stop error: ${JSON.stringify(err)}`); } - try { - if (this.captureSession) { - this.captureSession.stop(); - } - if (this.cameraInput) { - this.cameraInput.close(); - } - if (this.previewOutput) { - this.previewOutput.release(); - } - if (this.videoOutput) { - this.videoOutput.release(); - } - if (this.captureSession) { - this.captureSession.release(); - } - if (this.captureSession) { - this.captureSession = undefined; - } - } catch (error) { - let err = error as BusinessError; - Logger.error(TAG, `avRecorder stop error: ${JSON.stringify(err)}`); + if (this.captureSession) { + this.captureSession.stop() + .catch((err: BusinessError) => { + Logger.error(`avRecorder stop failed, code=${err.code}, message=${err.message}`) + }) + } + if (this.cameraInput) { + this.cameraInput.close() + .catch((err: BusinessError) => { + Logger.error(`avRecorder close failed, code=${err.code}, message=${err.message}`) + }) + } + if (this.previewOutput) { + this.previewOutput.release() + .catch((err: BusinessError) => { + Logger.error(`avRecorder release failed, code=${err.code}, message=${err.message}`) + }) + } + if (this.videoOutput) { + this.videoOutput.release() + .catch((err: BusinessError) => { + Logger.error(`avRecorder release failed, code=${err.code}, message=${err.message}`) + }) + } + if (this.captureSession) { + this.captureSession.release() + .catch((err: BusinessError) => { + Logger.error(`avRecorder release failed, code=${err.code}, message=${err.message}`) + }) + } + if (this.captureSession) { + this.captureSession = undefined; } } } diff --git a/HDRVivid/AVRecorder/entry/src/main/ets/utils/FileUtil.ets b/HDRVivid/AVRecorder/entry/src/main/ets/utils/FileUtil.ets index bb9612f4..e59fbb47 100644 --- a/HDRVivid/AVRecorder/entry/src/main/ets/utils/FileUtil.ets +++ b/HDRVivid/AVRecorder/entry/src/main/ets/utils/FileUtil.ets @@ -14,17 +14,23 @@ */ import { fileIo } from '@kit.CoreFileKit'; +import { BusinessError } from '@kit.BasicServicesKit'; import Logger from './Logger'; export class FileUtil { // Create and open a file. - static createOrOpen(path: string): fileIo.File { - let isExist = fileIo.accessSync(path); - let file: fileIo.File; - if (isExist) { - file = fileIo.openSync(path, fileIo.OpenMode.READ_WRITE); - } else { - file = fileIo.openSync(path, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE); + static createOrOpen(path: string): fileIo.File | null { + let file: fileIo.File | null = null; + try { + let isExist = fileIo.accessSync(path); + if (isExist) { + file = fileIo.openSync(path, fileIo.OpenMode.READ_WRITE); + } else { + file = fileIo.openSync(path, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE); + } + } catch (error) { + let err = error as BusinessError; + Logger.warn('testTag', `setColorMode failed, code=${err.code}, message=${err.message}`); } return file; } diff --git a/HDRVivid/ProcessingInterfaceTest/entry/src/main/ets/entryability/EntryAbility.ets b/HDRVivid/ProcessingInterfaceTest/entry/src/main/ets/entryability/EntryAbility.ets index eb96be48..9d78462e 100644 --- a/HDRVivid/ProcessingInterfaceTest/entry/src/main/ets/entryability/EntryAbility.ets +++ b/HDRVivid/ProcessingInterfaceTest/entry/src/main/ets/entryability/EntryAbility.ets @@ -22,8 +22,6 @@ import Logger from '../utils/Logger'; import { WindowUtil } from '../utils/WindowUtil'; export default class EntryAbility extends UIAbility { - private uiContext: UIContext | null = null; - onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { GlobalContext.getContext().setObject('context', this.context) hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); diff --git a/HDRVivid/ProcessingInterfaceTest/entry/src/main/ets/pages/Index.ets b/HDRVivid/ProcessingInterfaceTest/entry/src/main/ets/pages/Index.ets index b571c953..b32d8f30 100644 --- a/HDRVivid/ProcessingInterfaceTest/entry/src/main/ets/pages/Index.ets +++ b/HDRVivid/ProcessingInterfaceTest/entry/src/main/ets/pages/Index.ets @@ -14,6 +14,7 @@ */ import { router } from '@kit.ArkUI'; +import { BusinessError } from '@kit.BasicServicesKit'; import Logger from '../utils/Logger'; const TAG: string = 'PickerPage'; @@ -34,9 +35,16 @@ struct Index { .borderRadius(10) .onClick(() => { Logger.info(TAG, 'Picker init VideoPage ') - this.uiContext.getRouter().pushUrl({ - url: 'pages/VideoPage', - }, router.RouterMode.Standard); + this.uiContext.getRouter() + .pushUrl({ + url: 'pages/VideoPage', + }, router.RouterMode.Standard) + .then(() => { + Logger.info(TAG, 'pushUrl success'); + }) + .catch((err: BusinessError) => { + Logger.warn(TAG, `pushUrl failed, code=${err.code}, message=${err.message}`) + }) }) .margin('30') if (this.showProgressBar) { diff --git a/HDRVivid/ProcessingInterfaceTest/entry/src/main/ets/pages/VideoPage.ets b/HDRVivid/ProcessingInterfaceTest/entry/src/main/ets/pages/VideoPage.ets index b11123dd..79a75487 100644 --- a/HDRVivid/ProcessingInterfaceTest/entry/src/main/ets/pages/VideoPage.ets +++ b/HDRVivid/ProcessingInterfaceTest/entry/src/main/ets/pages/VideoPage.ets @@ -68,22 +68,30 @@ struct VideoPage { controlDst: XComponentController = new XComponentController() preload() { - let inputFile = fileIo.openSync(this.myUris, fileIo.OpenMode.READ_ONLY); - let inputFileState = fileIo.statSync(inputFile.fd); - let msg: string = player.preload(inputFile.fd, inputFileState.size); - this.hdrMode = msg; - if (msg.includes('HDRVivid HLG')) { - this.canConvertVividPQ = true; - this.canConvertSDR = true; - } else if (msg.includes('HDRVivid PQ')) { - this.canConvertVividHLG = true; - this.canConvertSDR = true; - } else if (msg.includes('HDR')) { - this.canConvertHLG = true; - } else if (msg.includes('SDR')) { - this.canConvertSDR = true; + try { + let inputFile = fileIo.openSync(this.myUris, fileIo.OpenMode.READ_ONLY); + let inputFileState = fileIo.statSync(inputFile.fd); + let msg: string = player.preload(inputFile.fd, inputFileState.size); + this.hdrMode = msg; + if (msg.includes('HDRVivid HLG')) { + this.canConvertVividPQ = true; + this.canConvertSDR = true; + } else if (msg.includes('HDRVivid PQ')) { + this.canConvertVividHLG = true; + this.canConvertSDR = true; + } else if (msg.includes('HDR')) { + this.canConvertHLG = true; + } else if (msg.includes('SDR')) { + this.canConvertSDR = true; + } + fileIo.close(inputFile) + .catch((err: BusinessError) => { + Logger.error(`fileIo close failed, code=${err.code}, message=${err.message}`) + }) + } catch (error) { + let err = error as BusinessError; + Logger.error(`fileIo openSync or statSync failed, code=${err.code}, message=${err.message}`); } - fileIo.close(inputFile); } async callFilePickerSelectImage(): Promise { @@ -134,17 +142,27 @@ struct VideoPage { } play() { - let inputFile = fileIo.openSync(this.myUris, fileIo.OpenMode.READ_ONLY); - let inputFile2 = fileIo.openSync(this.myUris, fileIo.OpenMode.READ_ONLY); - - let inputFileState = fileIo.statSync(inputFile.fd); - let inputFileState2 = fileIo.statSync(inputFile2.fd); - player.playNative(inputFile.fd, 0, inputFileState.size, 0, this.targetVal, this.targetMetadata, () => { - fileIo.close(inputFile); - }) - player.playNative(inputFile2.fd, 0, inputFileState2.size, 1, this.targetVal, this.targetMetadata, () => { - fileIo.close(inputFile2); - }) + try { + let inputFile = fileIo.openSync(this.myUris, fileIo.OpenMode.READ_ONLY); + let inputFile2 = fileIo.openSync(this.myUris, fileIo.OpenMode.READ_ONLY); + let inputFileState = fileIo.statSync(inputFile.fd); + let inputFileState2 = fileIo.statSync(inputFile2.fd); + player.playNative(inputFile.fd, 0, inputFileState.size, 0, this.targetVal, this.targetMetadata, () => { + fileIo.close(inputFile) + .catch((err: BusinessError) => { + Logger.warn(`fileIo close failed, code=${err.code}, message=${err.message}`) + }) + }) + player.playNative(inputFile2.fd, 0, inputFileState2.size, 1, this.targetVal, this.targetMetadata, () => { + fileIo.close(inputFile2) + .catch((err: BusinessError) => { + Logger.warn(`fileIo close failed, code=${err.code}, message=${err.message}`) + }) + }) + } catch (error) { + let err = error as BusinessError; + Logger.warn(`fileIo openSync or statSync failed, code=${err.code}, message=${err.message}`); + } } @Builder diff --git a/HDRVivid/ProcessingInterfaceTest/entry/src/main/ets/utils/AVPlayerDemo.ets b/HDRVivid/ProcessingInterfaceTest/entry/src/main/ets/utils/AVPlayerDemo.ets index 7ea46695..262a6885 100644 --- a/HDRVivid/ProcessingInterfaceTest/entry/src/main/ets/utils/AVPlayerDemo.ets +++ b/HDRVivid/ProcessingInterfaceTest/entry/src/main/ets/utils/AVPlayerDemo.ets @@ -19,17 +19,19 @@ import { common } from '@kit.AbilityKit'; import { BusinessError } from '@kit.BasicServicesKit'; import Logger from '../utils/Logger'; import { SizeChangeListener } from '../utils/SizeChangeInterface'; +import { resourceManager } from '@kit.LocalizationKit'; const TAG: string = 'AVPlayerDemo'; export class AVPlayerDemo { private count: number = 0; - private surfaceID: string = ''; // surfaceID用于播放画面显示,具体的值需要通过Xcomponent接口获取,相关文档链接见上面Xcomponent创建方法 + private surfaceID: string = ''; // surfaceID用于播放画面显示,具体的值需要通过XComponent接口获取,相关文档链接见上面XComponent创建方法 private isSeek: boolean = true; // 用于区分模式是否支持seek操作 private fileSize: number = -1; private fd: number = 0; private avPlayer: media.AVPlayer | undefined = undefined private UIContext: UIContext + constructor(uiContext: UIContext) { this.UIContext = uiContext } @@ -48,14 +50,20 @@ export class AVPlayerDemo { // error回调监听函数,当avPlayer在操作过程中出现错误时调用reset接口触发重置流程 avPlayer.on('error', (err: BusinessError) => { Logger.error(`Invoke avPlayer failed, code is ${err.code}, message is ${err.message}`); - avPlayer.reset(); // 调用reset重置资源,触发idle状态 + avPlayer.reset() // 调用reset重置资源,触发idle状态 + .catch((err: BusinessError) => { + Logger.error(`avPlayer reset failed, code=${err.code}, message=${err.message}`) + }) }) // 状态机变化回调函数 - avPlayer.on('stateChange', async (state: string, reason: media.StateChangeReason) => { + avPlayer.on('stateChange', async (state: string, _reason: media.StateChangeReason) => { switch (state) { case 'idle': // 成功调用reset接口后触发该状态机上报 Logger.info(TAG, 'AVPlayer state idle called.'); - avPlayer.release(); // 调用release接口销毁实例对象 + avPlayer.release() // 调用release接口销毁实例对象 + .catch((err: BusinessError) => { + Logger.error(`avPlayer release failed, code=${err.code}, message=${err.message}`) + }) break; case 'initialized': // avplayer 设置播放源后触发该状态上报 Logger.info(TAG, 'AVPlayer state initialized called.'); @@ -63,12 +71,17 @@ export class AVPlayerDemo { Logger.debug(TAG, 'surfaceID ' + this.surfaceID) avPlayer.surfaceId = this.surfaceID; - avPlayer.prepare(); - + avPlayer.prepare() + .catch((err: BusinessError) => { + Logger.error(`avPlayer prepare failed, code=${err.code}, message=${err.message}`) + }) break; case 'prepared': // prepare调用成功后上报该状态机 Logger.info(TAG, 'AVPlayer state prepared called.'); - avPlayer.play(); // 调用播放接口开始播放 + avPlayer.play() // 调用播放接口开始播放 + .catch((err: BusinessError) => { + Logger.error(`avPlayer play failed, code=${err.code}, message=${err.message}`) + }) Logger.warn(TAG, ' avPlayer surface size ' + avPlayer.width + ' ' + avPlayer.height) callback.onChange(avPlayer.width, avPlayer.height) @@ -84,21 +97,33 @@ export class AVPlayerDemo { Logger.info(TAG, 'AVPlayer wait to play end.'); } } else { - avPlayer.pause(); // 调用暂停接口暂停播放 + avPlayer.pause() // 调用暂停接口暂停播放 + .catch((err: BusinessError) => { + Logger.error(`avPlayer pause failed, code=${err.code}, message=${err.message}`) + }) } this.count++; break; case 'paused': // pause成功调用后触发该状态机上报 Logger.info(TAG, 'AVPlayer state paused called.'); - avPlayer.play(); // 再次播放接口开始播放 + avPlayer.play() // 再次播放接口开始播放 + .catch((err: BusinessError) => { + Logger.error(`avPlayer play failed, code=${err.code}, message=${err.message}`) + }) break; case 'completed': // 播放结束后触发该状态机上报 Logger.info(TAG, 'AVPlayer state completed called.'); - avPlayer.stop(); //调用播放结束接口 + avPlayer.stop() //调用播放结束接口 + .catch((err: BusinessError) => { + Logger.error(`avPlayer stop failed, code=${err.code}, message=${err.message}`) + }) break; case 'stopped': // stop接口成功调用后触发该状态机上报 Logger.info(TAG, 'AVPlayer state stopped called.'); - avPlayer.reset(); // 调用reset接口初始化avplayer状态 + avPlayer.reset() // 调用reset接口初始化avplayer状态 + .catch((err: BusinessError) => { + Logger.error(`avPlayer reset failed, code=${err.code}, message=${err.message}`) + }) break; case 'released': Logger.info(TAG, 'AVPlayer state released called.'); @@ -111,7 +136,7 @@ export class AVPlayerDemo { } private callback: SizeChangeListener = { - onChange: (width: number, height: number): void => { + onChange: (_width: number, _height: number): void => { } } @@ -125,45 +150,73 @@ export class AVPlayerDemo { Logger.debug(TAG, 'avPlayerUrlDemo ..... surface id ' + surfaceId); this.surfaceID = surfaceId; // 创建avPlayer实例对象 - this.avPlayer = await media.createAVPlayer(); - - // 创建状态机变化回调函数 - this.setAVPlayerCallback(this.avPlayer, callBack); + // this.avPlayer = await media.createAVPlayer(); + await media.createAVPlayer() + .then((data: media.AVPlayer) => { + this.avPlayer = data; + // 创建状态机变化回调函数 + this.setAVPlayerCallback(data, callBack); + }) + .catch((err: BusinessError) => { + Logger.error(`createAVPlayer failed, code=${err.code}, message=${err.message}`) + }) let fdPath = 'fd://'; // 通过UIAbilityContext获取沙箱地址filesDir,以Stage模型为例 // 打开相应的资源文件地址获取fd,并为url赋值触发initialized状态机上报 - let file = await fileIo.open(filePath, fileIo.OpenMode.READ_ONLY); - // let pathDir = context.filesDir +''+'VID_20240805_094821.mp4'; - // Logger.debug(TAG,pathDir) - fdPath = fdPath + '' + file.fd; - this.isSeek = true; // 支持seek操作 - this.avPlayer.url = fdPath; - + await fileIo.open(filePath, fileIo.OpenMode.READ_ONLY) + .then((data: fileIo.File) => { + // let pathDir = context.filesDir +''+'VID_20240805_094821.mp4'; + // Logger.debug(TAG,pathDir) + fdPath = fdPath + '' + data.fd; + this.isSeek = true; // 支持seek操作 + this.avPlayer!.url = fdPath; + }) + .catch((err: BusinessError) => { + Logger.error(`fileIo open failed, code=${err.code}, message=${err.message}`) + }) } // 以下demo为使用资源管理接口获取打包在HAP内的媒体资源文件并通过fdSrc属性进行播放示例 async avPlayerFdSrcDemo() { // 创建avPlayer实例对象 - this.avPlayer = await media.createAVPlayer(); - // 创建状态机变化回调函数 - this.setAVPlayerCallback(this.avPlayer, this.callback); + // this.avPlayer = await media.createAVPlayer(); + await media.createAVPlayer() + .then((data: media.AVPlayer) => { + this.avPlayer = data; + // 创建状态机变化回调函数 + this.setAVPlayerCallback(data, this.callback); + }) + .catch((err: BusinessError) => { + Logger.error(`createAVPlayer failed, code=${err.code}, message=${err.message}`) + }) // 通过UIAbilityContext的resourceManager成员的getRawFd接口获取媒体资源播放地址 // 返回类型为{fd,offset,length},fd为HAP包fd地址,offset为媒体资源偏移量,length为播放长度 let context = this.UIContext.getHostContext() as common.UIAbilityContext; - let fileDescriptor = await context.resourceManager.getRawFd('H264_AAC.mp4'); - let avFileDescriptor: media.AVFileDescriptor = - { fd: fileDescriptor.fd, offset: fileDescriptor.offset, length: fileDescriptor.length }; - this.isSeek = true; // 支持seek操作 - // 为fdSrc赋值触发initialized状态机上报 - this.avPlayer.fdSrc = avFileDescriptor; + await context.resourceManager.getRawFd('H264_AAC.mp4') + .then((data: resourceManager.RawFileDescriptor) => { + let avFileDescriptor: media.AVFileDescriptor = { fd: data.fd, offset: data.offset, length: data.length }; + this.isSeek = true; // 支持seek操作 + // 为fdSrc赋值触发initialized状态机上报 + this.avPlayer!.fdSrc = avFileDescriptor; + }) + .catch((err: BusinessError) => { + Logger.error(`setPreferredOrientation failed, code=${err.code}, message=${err.message}`) + }) } // 以下demo为使用fs文件系VideoPage.ets统打开沙箱地址获取媒体文件地址并通过dataSrc属性进行播放(seek模式)示例 async avPlayerDataSrcSeekDemo() { // 创建avPlayer实例对象 - let avPlayer: media.AVPlayer = await media.createAVPlayer(); - // 创建状态机变化回调函数 - this.setAVPlayerCallback(avPlayer, this.callback); + // let avPlayer: media.AVPlayer = await media.createAVPlayer(); + await media.createAVPlayer() + .then((avPlayer: media.AVPlayer) => { + this.avPlayer = avPlayer; + // 创建状态机变化回调函数 + this.setAVPlayerCallback(avPlayer, this.callback); + }) + .catch((err: BusinessError) => { + Logger.error(`createAVPlayer failed, code=${err.code}, message=${err.message}`) + }) // dataSrc播放模式的的播放源地址,当播放为Seek模式时fileSize为播放文件的具体大小,下面会对fileSize赋值 let src: media.AVDataSrcDescriptor = { fileSize: -1, @@ -172,7 +225,12 @@ export class AVPlayerDemo { if (buf == undefined || length == undefined || pos == undefined) { return -1; } - num = fileIo.readSync(this.fd, buf, { offset: pos, length: length }); + try { + num = fileIo.readSync(this.fd, buf, { offset: pos, length: length }); + } catch (error) { + let err = error as BusinessError; + Logger.error(`fileIo failed, code=${err.code}, message=${err.message}`); + } if (num > 0 && (this.fileSize >= pos)) { return num; } @@ -183,14 +241,23 @@ export class AVPlayerDemo { // 通过UIAbilityContext获取沙箱地址filesDir,以Stage模型为例 let pathDir = context.filesDir; let path = pathDir + '/H264_AAC.mp4'; - await fileIo.open(path).then((file: fileIo.File) => { - this.fd = file.fd; - }) - // 获取播放文件的大小 - this.fileSize = fileIo.statSync(path).size; + await fileIo.open(path) + .then((file: fileIo.File) => { + this.fd = file.fd; + }) + .catch((err: BusinessError) => { + Logger.error(`fileIo open failed, code=${err.code}, message=${err.message}`) + }) + try { + // 获取播放文件的大小 + this.fileSize = fileIo.statSync(path).size; + } catch (error) { + let err = error as BusinessError; + Logger.error(`setColorMode failed, code=${err.code}, message=${err.message}`); + } src.fileSize = this.fileSize; this.isSeek = true; // 支持seek操作 - avPlayer.dataSrc = src; + this.avPlayer!.dataSrc = src; } // 以下demo为使用fs文件系统打开沙箱地址获取媒体文件地址并通过dataSrc属性进行播放(No seek模式)示例 @@ -198,16 +265,27 @@ export class AVPlayerDemo { this.surfaceID = surfaceId // 创建状态机变化回调函数 - let file = await fileIo.open(filePath, fileIo.OpenMode.READ_ONLY); - if (!file) { - Logger.error(TAG, 'player inputFile is null'); - } - let inputFileState = fileIo.statSync(file.fd); - if (inputFileState.size <= 0) { - Logger.error(TAG, 'player inputFile size is 0'); - } - Logger.info(TAG, 'inputFileState size ' + inputFileState.size); - this.fd = file.fd; + // let file = await fileIo.open(filePath, fileIo.OpenMode.READ_ONLY); + await fileIo.open(filePath, fileIo.OpenMode.READ_ONLY) + .then((file: fileIo.File) => { + if (!file) { + Logger.error(TAG, 'player inputFile is null'); + } + try { + let inputFileState = fileIo.statSync(file.fd); + if (inputFileState.size <= 0) { + Logger.error(TAG, 'player inputFile size is 0'); + } + Logger.info(TAG, 'inputFileState size ' + inputFileState.size); + } catch (error) { + let err = error as BusinessError; + Logger.error(`setColorMode failed, code=${err.code}, message=${err.message}`); + } + this.fd = file.fd; + }) + .catch((err: BusinessError) => { + Logger.error(`setPreferredOrientation failed, code=${err.code}, message=${err.message}`) + }) Logger.debug(TAG, 'fd --- ' + this.fd); let src: media.AVDataSrcDescriptor = { fileSize: -1, @@ -216,48 +294,74 @@ export class AVPlayerDemo { if (buf == undefined || length == undefined || pos == undefined) { return -1; } - num = fileIo.readSync(this.fd, buf, { offset: pos, length: length }); + try { + num = fileIo.readSync(this.fd, buf, { offset: pos, length: length }); + } catch (error) { + let err = error as BusinessError; + Logger.warn(`setColorMode failed, code=${err.code}, message=${err.message}`); + } if (num > 0 && (this.fileSize >= pos)) { return num; } return -1; } } - - // 创建avPlayer实例对象 - this.avPlayer = await media.createAVPlayer(); - this.setAVPlayerCallback(this.avPlayer, this.callback); - // 获取播放文件的大小 - this.fileSize = fileIo.statSync(filePath).size; + try { + // 创建avPlayer实例对象 + this.avPlayer = await media.createAVPlayer(); + this.setAVPlayerCallback(this.avPlayer, this.callback); + } catch (error) { + let err = error as BusinessError; + Logger.warn(`createAVPlayer failed, code=${err.code}, message=${err.message}`); + } + try { + // 获取播放文件的大小 + this.fileSize = fileIo.statSync(filePath).size; + } catch (error) { + let err = error as BusinessError; + Logger.warn(`createAVPlayer failed, code=${err.code}, message=${err.message}`); + } src.fileSize = this.fileSize; this.isSeek = true; // 支持seek操作 - this.avPlayer.dataSrc = src; - + this.avPlayer!.dataSrc = src; } // 以下demo为通过url设置网络地址来实现播放直播码流的demo async avPlayerLiveDemo() { - // 创建avPlayer实例对象 - let avPlayer: media.AVPlayer = await media.createAVPlayer(); - // 创建状态机变化回调函数 - this.setAVPlayerCallback(avPlayer, this.callback); - this.isSeek = false; // 不支持seek操作 - avPlayer.url = 'http://xxx.xxx.xxx.xxx:xx/xx/index.m3u8'; // 播放hls网络直播码流 + try { + // 创建avPlayer实例对象 + let avPlayer: media.AVPlayer = await media.createAVPlayer(); + // 创建状态机变化回调函数 + this.setAVPlayerCallback(avPlayer, this.callback); + this.isSeek = false; // 不支持seek操作 + avPlayer.url = 'http://xxx.xxx.xxx.xxx:xx/xx/index.m3u8'; // 播放hls网络直播码流 + } catch (error) { + let err = error as BusinessError; + Logger.error(`createAVPlayer failed, code=${err.code}, message=${err.message}`); + } } // 以下demo为通过setMediaSource设置自定义头域及媒体播放优选参数实现初始播放参数设置 async preDownloadDemo() { - // 创建avPlayer实例对象 - let avPlayer: media.AVPlayer = await media.createAVPlayer(); - let mediaSource: media.MediaSource = - media.createMediaSourceWithUrl('http://xxx', { 'User-Agent': 'User-Agent-Value' }); - let playbackStrategy: media.PlaybackStrategy = { - preferredWidth: 1, - preferredHeight: 2, - preferredBufferDuration: 3, - preferredHdr: false - }; - // 设置媒体来源和播放策略 - avPlayer.setMediaSource(mediaSource, playbackStrategy); + try { + // 创建avPlayer实例对象 + let avPlayer: media.AVPlayer = await media.createAVPlayer(); + let mediaSource: media.MediaSource = + media.createMediaSourceWithUrl('http://xxx', { 'User-Agent': 'User-Agent-Value' }); + let playbackStrategy: media.PlaybackStrategy = { + preferredWidth: 1, + preferredHeight: 2, + preferredBufferDuration: 3, + preferredHdr: false + }; + // 设置媒体来源和播放策略 + avPlayer.setMediaSource(mediaSource, playbackStrategy) + .catch((err: BusinessError) => { + Logger.error(`setMediaSource failed, code=${err.code}, message=${err.message}`) + }) + } catch (error) { + let err = error as BusinessError; + Logger.error(`createAVPlayer or createMediaSourceWithUrl failed, code=${err.code}, message=${err.message}`); + } } } \ No newline at end of file diff --git a/HDRVivid/ProcessingInterfaceTest/entry/src/main/ets/utils/WindowUtil.ets b/HDRVivid/ProcessingInterfaceTest/entry/src/main/ets/utils/WindowUtil.ets index 62fe5a44..bd06b579 100644 --- a/HDRVivid/ProcessingInterfaceTest/entry/src/main/ets/utils/WindowUtil.ets +++ b/HDRVivid/ProcessingInterfaceTest/entry/src/main/ets/utils/WindowUtil.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import { deviceInfo } from '@kit.BasicServicesKit'; +import { BusinessError, deviceInfo } from '@kit.BasicServicesKit'; import { window } from '@kit.ArkUI'; import { CommonConstants } from '../utils/CommonConstants'; import Logger from './Logger'; @@ -49,9 +49,15 @@ export class WindowUtil { return; } if (deviceInfo.deviceType !== CommonConstants.DEVICE_TYPES[0] && deviceInfo.deviceType !== - CommonConstants.DEVICE_TYPES[1]) { + CommonConstants.DEVICE_TYPES[1]) { // Set portrait display. - this.mainWindowClass.setPreferredOrientation(window.Orientation.PORTRAIT); + this.mainWindowClass.setPreferredOrientation(window.Orientation.PORTRAIT) + .then(() => { + Logger.info('setPreferredOrientation success'); + }) + .catch((err: BusinessError) => { + Logger.error(`setPreferredOrientation failed, code=${err.code}, message=${err.message}`) + }) } }); } @@ -62,7 +68,13 @@ export class WindowUtil { return; } // Setting orientation. - this.mainWindowClass.setPreferredOrientation(orientation); + this.mainWindowClass.setPreferredOrientation(orientation) + .then(() => { + Logger.info('setPreferredOrientation success'); + }) + .catch((err: BusinessError) => { + Logger.error(`setPreferredOrientation failed, code=${err.code}, message=${err.message}`) + }) } disableWindowSystemBar(): void { @@ -71,7 +83,13 @@ export class WindowUtil { return; } // Set the status bar and navigation bar to be invisible in full-screen mode. - this.mainWindowClass.setWindowSystemBarEnable([]); + this.mainWindowClass.setWindowSystemBarEnable([]) + .then(() => { + Logger.info('setWindowSystemBarEnable success'); + }) + .catch((err: BusinessError) => { + Logger.error(`setWindowSystemBarEnable failed, code=${err.code}, message=${err.message}`) + }) } enableWindowSystemBar(): void { @@ -79,7 +97,13 @@ export class WindowUtil { Logger.error(`MainWindowClass is undefined`); return; } - this.mainWindowClass.setWindowSystemBarEnable(['status', 'navigation']); + this.mainWindowClass.setWindowSystemBarEnable(['status', 'navigation']) + .then(() => { + Logger.info('setWindowSystemBarEnable success'); + }) + .catch((err: BusinessError) => { + Logger.error(`setWindowSystemBarEnable failed, code=${err.code}, message=${err.message}`) + }) } setFullScreen(): void { @@ -88,7 +112,13 @@ export class WindowUtil { return; } // Set full-screen display. - this.mainWindowClass.setWindowLayoutFullScreen(true); + this.mainWindowClass.setWindowLayoutFullScreen(true) + .then(() => { + Logger.info('setWindowLayoutFullScreen success'); + }) + .catch((err: BusinessError) => { + Logger.error(`setWindowLayoutFullScreen failed, code=${err.code}, message=${err.message}`) + }) } getMainWindow(): window.Window | undefined { -- Gitee From d7661c93d31c09cc453fc9ad397c63c83237b323 Mon Sep 17 00:00:00 2001 From: liugang9704 <2745340733@qq.com> Date: Wed, 24 Sep 2025 10:38:45 +0800 Subject: [PATCH 2/2] =?UTF-8?q?AppPrivacyProtection=E3=80=81BackgroundBlur?= =?UTF-8?q?=E3=80=81bptaMultiWindow=E6=9C=AA=E6=8D=95=E8=8E=B7=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ets/pages/ApproximatelyLocationDemo.ets | 26 +++++++--- .../entry/src/main/ets/pages/Index.ets | 52 +++++++++++++++---- .../src/main/ets/pages/ColorPickerMode.ets | 20 +++++-- .../src/main/ets/components/WindowUtil.ets | 50 +++++++++++------- .../main/ets/entryability/EntryAbility.ets | 24 ++++++--- .../main/ets/entryability/EntryAbility1.ets | 49 +++++++++++------ .../main/ets/entryability/EntryAbility2.ets | 50 +++++++++++------- .../main/ets/entryability/EntryAbility3.ets | 19 +++++-- 8 files changed, 203 insertions(+), 87 deletions(-) diff --git a/AppPrivacyProtection/entry/src/main/ets/pages/ApproximatelyLocationDemo.ets b/AppPrivacyProtection/entry/src/main/ets/pages/ApproximatelyLocationDemo.ets index d24fcb14..4d1d7adf 100644 --- a/AppPrivacyProtection/entry/src/main/ets/pages/ApproximatelyLocationDemo.ets +++ b/AppPrivacyProtection/entry/src/main/ets/pages/ApproximatelyLocationDemo.ets @@ -30,12 +30,18 @@ struct ApproximatelyLocationDemo { // [End request_permission] const bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION; const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleFlags); - const grantStatus = accessManager.checkAccessTokenSync(bundleInfo.appInfo.accessTokenId, permissions[0]); - + let grantStatus: abilityAccessCtrl.GrantStatus | null = null; + try { + grantStatus = accessManager.checkAccessTokenSync(bundleInfo.appInfo.accessTokenId, permissions[0]); + } catch (error) { + let err = error as BusinessError; + Logger.error(`showToast failed, code=${err.code}, message=${err.message}`); + } return new Promise((resolve, reject) => { if (grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_DENIED) { // [Start request_permission] - accessManager.requestPermissionsFromUser(this.getUIContext().getHostContext(), ['ohos.permission.APPROXIMATELY_LOCATION']) + accessManager.requestPermissionsFromUser(this.getUIContext().getHostContext(), + ['ohos.permission.APPROXIMATELY_LOCATION']) .then((data) => { let grantStatus: Array = data.authResults; if (grantStatus.length > 0 && grantStatus[0] === 0) { @@ -48,15 +54,20 @@ struct ApproximatelyLocationDemo { // The user rejects the authorization Logger.info('request permissions denied'); // [StartExclude request_permission] - this.getUIContext().getPromptAction().showToast({ - message: 'This function requires the location permission. Go to the settings page to authorize the permission' - }); + try { + this.getUIContext().getPromptAction().showToast({ + message: 'This function requires the location permission. Go to the settings page to authorize the permission' + }); + } catch (error) { + let err = error as BusinessError; + Logger.error(`showToast failed, code=${err.code}, message=${err.message}`); + } resolve(-1); // [EndExclude request_permission] } Logger.info(`request permissions result: ${JSON.stringify(data)}`); }) - // [End request_permission] + // [End request_permission] .catch((error: BusinessError) => { Logger.error(`request permissions exception, Catch error:${JSON.stringify(error)}`); reject(error); @@ -67,7 +78,6 @@ struct ApproximatelyLocationDemo { }); } - getLocation() { this.requestPermissions().then(data => { diff --git a/AppPrivacyProtection/entry/src/main/ets/pages/Index.ets b/AppPrivacyProtection/entry/src/main/ets/pages/Index.ets index d79d3f3b..78cc67a4 100644 --- a/AppPrivacyProtection/entry/src/main/ets/pages/Index.ets +++ b/AppPrivacyProtection/entry/src/main/ets/pages/Index.ets @@ -25,7 +25,13 @@ struct Index { const accessManager = abilityAccessCtrl.createAtManager(); const bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION; const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleFlags); - const grantStatus = accessManager.checkAccessTokenSync(bundleInfo.appInfo.accessTokenId, permissions[0]); + let grantStatus: abilityAccessCtrl.GrantStatus | null = null; + try { + grantStatus = accessManager.checkAccessTokenSync(bundleInfo.appInfo.accessTokenId, permissions[0]); + } catch (error) { + let err = error as BusinessError; + Logger.error(`checkAccessTokenSync failed, code=${err.code}, message=${err.message}`); + } if (grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_DENIED) { // [Start permission_camera] accessManager.requestPermissionsFromUser(this.getUIContext().getHostContext(), ['ohos.permission.CAMERA']) @@ -36,21 +42,31 @@ struct Index { } else { Logger.info('request permissions denied'); // [StartExclude permission_camera] - this.getUIContext().getPromptAction().showToast({ - message: 'This function requires the camera permission. Go to the settings page to authorize the permission' - }); + try { + this.getUIContext().getPromptAction().showToast({ + message: 'This function requires the camera permission. Go to the settings page to authorize the permission' + }); + } catch (error) { + let err = error as BusinessError; + Logger.error(`showToast failed, code=${err.code}, message=${err.message}`); + } // [EndExclude permission_camera] } }) - // [End permission_camera] + // [End permission_camera] .catch((error: BusinessError) => { Logger.error(`request permissions exception, Catch error:${JSON.stringify(error)}`); }) } else { Logger.info('request permissions granted'); - this.getUIContext().getPromptAction().showToast({ - message: 'request permissions has granted' - }); + try { + this.getUIContext().getPromptAction().showToast({ + message: 'request permissions has granted' + }); + } catch (error) { + let err = error as BusinessError; + Logger.error(`showToast failed, code=${err.code}, message=${err.message}`); + } } } @@ -60,13 +76,29 @@ struct Index { .height(40) .width('100%') .onClick(() => { - this.getUIContext().getRouter().pushUrl({ url: 'pages/ApproximatelyLocationDemo' }); + this.getUIContext() + .getRouter() + .pushUrl({ url: 'pages/ApproximatelyLocationDemo' }) + .then(() => { + Logger.info(`showToast success`); + }) + .catch((err: BusinessError) => { + Logger.error(`showToast failed, code=${err.code}, message=${err.message}`); + }) }) Button($r('app.string.use_picker')) .height(40) .width('100%') .onClick(() => { - this.getUIContext().getRouter().pushUrl({ url: 'pages/PickerDemo' }); + this.getUIContext() + .getRouter() + .pushUrl({ url: 'pages/PickerDemo' }) + .then(() => { + Logger.info(`showToast success`); + }) + .catch((err: BusinessError) => { + Logger.error(`showToast failed, code=${err.code}, message=${err.message}`); + }) }) Button($r('app.string.apply_camera_permissions')) .height(40) diff --git a/BackgroundBlur/entry/src/main/ets/pages/ColorPickerMode.ets b/BackgroundBlur/entry/src/main/ets/pages/ColorPickerMode.ets index 5109b43b..56c8451a 100644 --- a/BackgroundBlur/entry/src/main/ets/pages/ColorPickerMode.ets +++ b/BackgroundBlur/entry/src/main/ets/pages/ColorPickerMode.ets @@ -16,6 +16,8 @@ // [Start color_picker] import { image } from '@kit.ImageKit'; import { effectKit } from '@kit.ArkGraphics2D'; +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { BusinessError } from '@kit.BasicServicesKit'; @Component export struct ColorPickerMode { @@ -31,11 +33,18 @@ export struct ColorPickerMode { async blurPix(resource: Resource) { const context = this.getUIContext().getHostContext()!; - const resourceMgr = context.resourceManager - const fileData = await resourceMgr.getMediaContent(resource) - const buffer = fileData.buffer - let imageSource = image.createImageSource(buffer as ArrayBuffer) - this.pixMap = await imageSource.createPixelMap(); + const resourceMgr = context.resourceManager; + let imageSource: image.ImageSource | null = null; + // const fileData = await resourceMgr.getMediaContent(resource) + resourceMgr.getMediaContent(resource) + .then((fileData: Uint8Array) => { + const buffer = fileData.buffer + imageSource = image.createImageSource(buffer as ArrayBuffer) + }) + .catch((err: BusinessError) => { + hilog.error(0x000, 'testTag', `setPreferredOrientation failed, code=${err.code}, message=${err.message}`) + }) + this.pixMap = await imageSource!.createPixelMap(); // create a color picker for color extraction this.kitColor = (await effectKit.createColorPicker(this.pixMap, [0, 0, 1, 1])).getAverageColor(); // convert to the format of the blur interface color parameter @@ -72,4 +81,5 @@ export struct ColorPickerMode { .hideTitleBar(true) } } + // [End color_picker] diff --git a/bptaMultiWindow/entry/src/main/ets/components/WindowUtil.ets b/bptaMultiWindow/entry/src/main/ets/components/WindowUtil.ets index f5b8a250..68334f4a 100644 --- a/bptaMultiWindow/entry/src/main/ets/components/WindowUtil.ets +++ b/bptaMultiWindow/entry/src/main/ets/components/WindowUtil.ets @@ -26,34 +26,48 @@ import { hilog } from '@kit.PerformanceAnalysisKit'; @Observed export class WindowUtil { private mainWindowClass?: window.Window; + // [StartExclude recover] maximize(): void { - if (this.mainWindowClass!.getWindowStatus() === window.WindowStatusType.FLOATING) { - this.mainWindowClass!.maximize() - .then(() => { - hilog.info(0x0000, 'testTag', '%{public}s', `Succeed in maximizing the window.`); - }) - .catch((err: BusinessError) => { - hilog.error(0x0000, 'testTag', `Failed to maximize the window. Code: ${err.code}, message: ${err.message}`, - JSON.stringify(err) ?? ''); - }); + try { + if (this.mainWindowClass!.getWindowStatus() === window.WindowStatusType.FLOATING) { + this.mainWindowClass!.maximize() + .then(() => { + hilog.info(0x0000, 'testTag', '%{public}s', `Succeed in maximizing the window.`); + }) + .catch((err: BusinessError) => { + hilog.error(0x0000, 'testTag', `Failed to maximize the window. Code: ${err.code}, message: ${err.message}`, + JSON.stringify(err) ?? ''); + }); + } + } catch (error) { + let err = error as BusinessError; + hilog.warn(0x000, 'testTag', `getWindowStatus failed, code=${err.code}, message=${err.message}`); } } + // [EndExclude recover] // [StartExclude maximize] recover(): void { - if (this.mainWindowClass!.getWindowStatus() === window.WindowStatusType.FULL_SCREEN) { - this.mainWindowClass!.recover() - .then(() => { - hilog.info(0x0000, 'testTag', '%{public}s', `Succeed in recovering the window.`); - }) - .catch((err: BusinessError) => { - hilog.error(0x0000, 'testTag', `Failed to recover the window. Code: ${err.code}, message: ${err.message}`, - JSON.stringify(err) ?? ''); - }); + try { + if (this.mainWindowClass!.getWindowStatus() === window.WindowStatusType.FULL_SCREEN) { + this.mainWindowClass!.recover() + .then(() => { + hilog.info(0x0000, 'testTag', '%{public}s', `Succeed in recovering the window.`); + }) + .catch((err: BusinessError) => { + hilog.error(0x0000, 'testTag', `Failed to recover the window. Code: ${err.code}, message: ${err.message}`, + JSON.stringify(err) ?? ''); + }); + } + } catch (error) { + let err = error as BusinessError; + hilog.warn(0x000, 'testTag', `getWindowStatus failed, code=${err.code}, message=${err.message}`); } } + // [EndExclude maximize] } + // [End maximize] // [End recover] \ No newline at end of file diff --git a/bptaMultiWindow/entry/src/main/ets/entryability/EntryAbility.ets b/bptaMultiWindow/entry/src/main/ets/entryability/EntryAbility.ets index f0fae342..01893a3a 100644 --- a/bptaMultiWindow/entry/src/main/ets/entryability/EntryAbility.ets +++ b/bptaMultiWindow/entry/src/main/ets/entryability/EntryAbility.ets @@ -19,7 +19,7 @@ // [Start onWindowStageCreate] import { UIAbility } from '@kit.AbilityKit'; import { window } from '@kit.ArkUI'; -import { deviceInfo } from '@kit.BasicServicesKit'; +import { BusinessError, deviceInfo } from '@kit.BasicServicesKit'; import hilog from '@ohos.hilog'; export default class EntryAbility extends UIAbility { @@ -34,12 +34,22 @@ export default class EntryAbility extends UIAbility { }); // [EndExclude onWindowStageCreate] let windowClass: window.Window | null = null; - windowStage.getMainWindow().then((data: window.Window) => { - windowClass = data; - if (deviceInfo.deviceType !== '2in1') { - windowClass.setWindowLayoutFullScreen(true); - } - }); + windowStage.getMainWindow() + .then((data: window.Window) => { + windowClass = data; + if (deviceInfo.deviceType !== '2in1') { + windowClass.setWindowLayoutFullScreen(true) + .catch((err: BusinessError) => { + hilog.error(0x000, 'testTag', + `setWindowLayoutFullScreen failed, code=${err.code}, message=${err.message}`) + }) + } + }) + .catch((err: BusinessError) => { + hilog.error(0x000, 'testTag', `getMainWindow failed, code=${err.code}, message=${err.message}`) + }) + } } + // [End onWindowStageCreate] \ No newline at end of file diff --git a/bptaMultiWindow/entry/src/main/ets/entryability/EntryAbility1.ets b/bptaMultiWindow/entry/src/main/ets/entryability/EntryAbility1.ets index d76b66cc..9101aa7e 100644 --- a/bptaMultiWindow/entry/src/main/ets/entryability/EntryAbility1.ets +++ b/bptaMultiWindow/entry/src/main/ets/entryability/EntryAbility1.ets @@ -31,17 +31,28 @@ export default class EntryAbility extends UIAbility { } setDefaultOrientation(): void { - let windowRect: window.Rect = this.windowObj!.getWindowProperties().windowRect; - let windowWidthVp: number = this.uiContext!.px2vp(windowRect.width); - let windowHeightVp: number = this.uiContext!.px2vp(windowRect.height); + try { + let windowRect: window.Rect = this.windowObj!.getWindowProperties().windowRect; + let windowWidthVp: number = this.uiContext!.px2vp(windowRect.width); + let windowHeightVp: number = this.uiContext!.px2vp(windowRect.height); - // If this condition is met, the window can be rotated. - if (Math.min(windowWidthVp, windowHeightVp) > 348) { - this.windowObj?.setPreferredOrientation(window.Orientation.AUTO_ROTATION_RESTRICTED); - } - // Otherwise, the window is displayed in portrait mode. - else { - this.windowObj?.setPreferredOrientation(window.Orientation.PORTRAIT); + // If this condition is met, the window can be rotated. + if (Math.min(windowWidthVp, windowHeightVp) > 348) { + this.windowObj?.setPreferredOrientation(window.Orientation.AUTO_ROTATION_RESTRICTED) + .catch((err: BusinessError) => { + hilog.error(0x000, 'testTag', `setPreferredOrientation failed, code=${err.code}, message=${err.message}`) + }) + } + // Otherwise, the window is displayed in portrait mode. + else { + this.windowObj?.setPreferredOrientation(window.Orientation.PORTRAIT) + .catch((err: BusinessError) => { + hilog.error(0x000, 'testTag', `setPreferredOrientation failed, code=${err.code}, message=${err.message}`) + }) + } + } catch (error) { + let err = error as BusinessError; + hilog.warn(0x000, 'testTag', `getWindowProperties failed, code=${err.code}, message=${err.message}`); } } @@ -51,18 +62,26 @@ export default class EntryAbility extends UIAbility { windowStage.getMainWindow().then((windowObj) => { this.windowObj = windowObj; }).catch((err: BusinessError) => { - hilog.error(0x0000, 'testTag', `Failed to obtain the main window. Cause code: ${err.code}, message: ${err.message}`); + hilog.error(0x0000, 'testTag', + `Failed to obtain the main window. Cause code: ${err.code}, message: ${err.message}`); }); windowStage.loadContent('pages/Index', (err) => { if (err.code) { hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); return; } - this.uiContext = this.windowObj!.getUIContext(); - this.setDefaultOrientation(); - this.windowObj!.on('windowSizeChange', this.onWindowSizeChange); - hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.'); + try { + this.uiContext = this.windowObj!.getUIContext(); + this.setDefaultOrientation(); + this.windowObj!.on('windowSizeChange', this.onWindowSizeChange); + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.'); + } catch (error) { + let err = error as BusinessError; + hilog.warn(0x000, 'testTag', `getUIContext failed, code=${err.code}, message=${err.message}`); + } + }); } } + // [End setdefaultorientation] \ No newline at end of file diff --git a/bptaMultiWindow/entry/src/main/ets/entryability/EntryAbility2.ets b/bptaMultiWindow/entry/src/main/ets/entryability/EntryAbility2.ets index 46c5c407..18ff83ff 100644 --- a/bptaMultiWindow/entry/src/main/ets/entryability/EntryAbility2.ets +++ b/bptaMultiWindow/entry/src/main/ets/entryability/EntryAbility2.ets @@ -20,18 +20,21 @@ // [Start onavoid_areachange] import { UIAbility } from '@kit.AbilityKit'; import { window as arkWindow } from '@kit.ArkUI'; // Renamed the imported window +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { BusinessError } from '@kit.BasicServicesKit'; export default class EntryAbility extends UIAbility { - private onAvoidAreaChange: (avoidArea: arkWindow.AvoidAreaOptions) => void = (avoidArea: arkWindow.AvoidAreaOptions) => { - const uiContext: UIContext | undefined = AppStorage.get('uiContext'); - if (avoidArea.type === arkWindow.AvoidAreaType.TYPE_SYSTEM) { - // Updates the height of the top status bar. - AppStorage.setOrCreate('topAvoidHeight', uiContext?.px2vp(avoidArea.area.topRect.height)); - } else if (avoidArea.type === arkWindow.AvoidAreaType.TYPE_NAVIGATION_INDICATOR) { - // Updated the bottom navigation bar. - AppStorage.setOrCreate('bottomAvoidHeight', uiContext?.px2vp(avoidArea.area.bottomRect.height)); - } - }; + private onAvoidAreaChange: (avoidArea: arkWindow.AvoidAreaOptions) => void = + (avoidArea: arkWindow.AvoidAreaOptions) => { + const uiContext: UIContext | undefined = AppStorage.get('uiContext'); + if (avoidArea.type === arkWindow.AvoidAreaType.TYPE_SYSTEM) { + // Updates the height of the top status bar. + AppStorage.setOrCreate('topAvoidHeight', uiContext?.px2vp(avoidArea.area.topRect.height)); + } else if (avoidArea.type === arkWindow.AvoidAreaType.TYPE_NAVIGATION_INDICATOR) { + // Updated the bottom navigation bar. + AppStorage.setOrCreate('bottomAvoidHeight', uiContext?.px2vp(avoidArea.area.bottomRect.height)); + } + }; onWindowStageCreate(windowStage: arkWindow.WindowStage): void { windowStage.getMainWindow((err, window: arkWindow.Window) => { @@ -39,16 +42,25 @@ export default class EntryAbility extends UIAbility { console.error('Failed to get main window. Error: ' + JSON.stringify(err)); return; } - window.setWindowLayoutFullScreen(true); - AppStorage.setOrCreate('uiContext', windowStage.getMainWindowSync().getUIContext()); - const uiContext: UIContext | undefined = AppStorage.get('uiContext'); - let topAvoidHeight: arkWindow.AvoidArea = window.getWindowAvoidArea(arkWindow.AvoidAreaType.TYPE_SYSTEM); - AppStorage.setOrCreate('topAvoidHeight', uiContext?.px2vp(topAvoidHeight.topRect.height)); - let bottomAvoidHeight: arkWindow.AvoidArea = - window.getWindowAvoidArea(arkWindow.AvoidAreaType.TYPE_NAVIGATION_INDICATOR); - AppStorage.setOrCreate('bottomAvoidHeight', uiContext?.px2vp(bottomAvoidHeight.bottomRect.height)); - window.on('avoidAreaChange', this.onAvoidAreaChange); + window.setWindowLayoutFullScreen(true) + .catch((err: BusinessError) => { + hilog.error(0x000, 'testTag', `setWindowLayoutFullScreen failed, code=${err.code}, message=${err.message}`) + }) + try { + AppStorage.setOrCreate('uiContext', windowStage.getMainWindowSync().getUIContext()); + const uiContext: UIContext | undefined = AppStorage.get('uiContext'); + let topAvoidHeight: arkWindow.AvoidArea = window.getWindowAvoidArea(arkWindow.AvoidAreaType.TYPE_SYSTEM); + AppStorage.setOrCreate('topAvoidHeight', uiContext?.px2vp(topAvoidHeight.topRect.height)); + let bottomAvoidHeight: arkWindow.AvoidArea = + window.getWindowAvoidArea(arkWindow.AvoidAreaType.TYPE_NAVIGATION_INDICATOR); + AppStorage.setOrCreate('bottomAvoidHeight', uiContext?.px2vp(bottomAvoidHeight.bottomRect.height)); + window.on('avoidAreaChange', this.onAvoidAreaChange); + } catch (error) { + let err = error as BusinessError; + hilog.warn(0x000, 'testTag', `getWindowAvoidArea failed, code=${err.code}, message=${err.message}`); + } }); } } + // [End onavoid_areachange] \ No newline at end of file diff --git a/bptaMultiWindow/entry/src/main/ets/entryability/EntryAbility3.ets b/bptaMultiWindow/entry/src/main/ets/entryability/EntryAbility3.ets index adbe5136..7e442d2f 100644 --- a/bptaMultiWindow/entry/src/main/ets/entryability/EntryAbility3.ets +++ b/bptaMultiWindow/entry/src/main/ets/entryability/EntryAbility3.ets @@ -20,7 +20,7 @@ // [Start onwindowstagecreate1] import { UIAbility } from '@kit.AbilityKit'; import { window } from '@kit.ArkUI'; -import { deviceInfo } from '@kit.BasicServicesKit'; +import { BusinessError, deviceInfo } from '@kit.BasicServicesKit'; import { hilog } from '@kit.PerformanceAnalysisKit'; export default class EntryAbility extends UIAbility { @@ -35,12 +35,21 @@ export default class EntryAbility extends UIAbility { windowStage.getMainWindow().then((data: window.Window) => { let deviceTypeInfo: string = deviceInfo.deviceType; if (deviceTypeInfo === '2in1') { - // Set the title bar of the 2in1 device to be invisible after the loadContent() call takes effect. - data.setWindowDecorVisible(false); - // When the title bar is invisible, set the height of the title bar and control the height of the three buttons (full screen/restore, maximize, and close) in the upper right corner. - data.setWindowDecorHeight(64); + try { + // Set the title bar of the 2in1 device to be invisible after the loadContent() call takes effect. + data.setWindowDecorVisible(false); + // When the title bar is invisible, set the height of the title bar and control the height of the three buttons (full screen/restore, maximize, and close) in the upper right corner. + data.setWindowDecorHeight(64); + } catch (error) { + let err = error as BusinessError; + hilog.warn(0x000, 'testTag', `set windowDecor size failed, code=${err.code}, message=${err.message}`); + } } }) + .catch((err: BusinessError) => { + hilog.error(0x000, 'testTag', `setWindowLayoutFullScreen failed, code=${err.code}, message=${err.message}`) + }) } } + // [End onwindowstagecreate1] \ No newline at end of file -- Gitee