From 81a122da16170f296c5180994a7c939ff99abac0 Mon Sep 17 00:00:00 2001 From: xieyifeng Date: Fri, 26 Sep 2025 16:33:30 +0800 Subject: [PATCH] =?UTF-8?q?api20=E4=BB=A3=E7=A0=81=E8=A7=84=E8=8C=83?= =?UTF-8?q?=E6=95=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ets/controller/AvPlayerController.ets | 29 ++++++-- .../ets/controller/AvSessionController.ets | 27 ++++++-- ...ller1.ets => AvSessionControllerPCode.ets} | 18 +++-- VideoPlayerSample/README.md | 11 ++-- VideoPlayerSample/README_EN.md | 33 +++++----- VideoPlayerSample/build-profile.json5 | 6 +- .../main/ets/entryability/EntryAbility.ets | 29 ++++---- .../entry/src/main/ets/pages/IndexPage.ets | 6 +- .../src/main/ets/utils/BreakpointSystem.ets | 8 +-- .../entry/src/main/ets/utils/WindowUtil.ets | 66 +++++++++---------- .../entry/src/main/ets/view/AVPlayer.ets | 66 +++++++++++-------- .../entry/src/main/ets/view/VideoDetails.ets | 22 +++++-- .../entry/src/main/ets/view/VideoSide.ets | 22 +++++-- 13 files changed, 216 insertions(+), 127 deletions(-) rename VideoPlayerSample/MediaService/src/main/ets/controller/{AvSessionController1.ets => AvSessionControllerPCode.ets} (70%) diff --git a/VideoPlayerSample/MediaService/src/main/ets/controller/AvPlayerController.ets b/VideoPlayerSample/MediaService/src/main/ets/controller/AvPlayerController.ets index c81f149d..2ccb60d1 100644 --- a/VideoPlayerSample/MediaService/src/main/ets/controller/AvPlayerController.ets +++ b/VideoPlayerSample/MediaService/src/main/ets/controller/AvPlayerController.ets @@ -59,6 +59,15 @@ export class AvPlayerController { let avFileDescriptor: media.AVFileDescriptor = { fd: fileDescriptor.fd, offset: fileDescriptor.offset, length: fileDescriptor.length }; this.avPlayer.fdSrc = avFileDescriptor; + try { + let fileDescriptor: resourceManager.RawFileDescriptor | undefined = + this.context?.resourceManager.getRawFdSync(this.curSource.video); + if (fileDescriptor) { + let avFileDescriptor: media.AVFileDescriptor = + this.avPlayer.fdSrc = avFileDescriptor; + } + } catch (err) { + Logger.error(TAG, `createAVPlayer failed, err.code:${err.code}, err.message:${err.message}`); } } else { this.avPlayer.url = this.curSource.url; @@ -72,8 +81,8 @@ export class AvPlayerController { } else { Logger.error(TAG, 'createAVPlayer fail'); } - }).catch((error: BusinessError) => { - Logger.error(TAG, `AVPlayer catchCallback, error message:${error.message}`); + }).catch((err: BusinessError) => { + Logger.error(TAG, `AVPlayer catchCallback, err.code:${err.code}, err.message:${err.message}`); }); } @@ -102,7 +111,9 @@ export class AvPlayerController { avPlayer.on('error', (err: BusinessError) => { Logger.error(TAG, `Invoke avPlayer failed, code is ${err.code}, message is ${err.message}` + `----state:${avPlayer.state} this.curIndex:${this.curIndex}`); - avPlayer.reset(); // resets the resources and triggers the idle state + avPlayer.reset().catch((err: BusinessError) => { + Logger.error(TAG, `avPlayer reset failed, code is ${err.code}, message is ${err.message}`); + }); // resets the resources and triggers the idle state }) this.setInterruptCallback() this.setStateChangeCallback(avPlayer); @@ -199,7 +210,9 @@ export class AvPlayerController { case 'initialized': Logger.info(TAG, 'AVPlayer state initialized called.' + ` this.curIndex:${this.curIndex}`); avPlayer.surfaceId = this.surfaceID; - avPlayer.prepare(); + avPlayer.prepare().catch((err: BusinessError) => { + Logger.error(TAG, `avPlayer prepare failed, code is ${err.code}, message is ${err.message}`); + }); break; case 'prepared': Logger.info(TAG, `AVPlayer state prepared called. this.curIndex:${this.curIndex}`); @@ -397,7 +410,9 @@ export class AvPlayerController { this.updateIsPlay(true); Logger.error(TAG, `stopVideo failed, code is ${err.code}, message is ${err.message}`); } else { - this.avPlayer!.release(); + this.avPlayer!.release().catch((err: BusinessError) => { + Logger.error(TAG, `avPlayer release failed, code is ${err.code}, message is ${err.message}`); + }); Logger.info(TAG, `stopVideo success, this.curIndex:${this.curIndex}`); } }); @@ -454,7 +469,9 @@ export class AvPlayerController { this.avPlayer.off('speedDone'); this.avPlayer.off('error'); this.avPlayer.off('stateChange'); - this.avPlayer.release(); + this.avPlayer.release().catch((err: BusinessError) => { + Logger.error(TAG, `avPlayer release failed, code is ${err.code}, message is ${err.message}`); + }); this.avSessionController?.unregisterSessionListener(); } catch (err) { Logger.error(TAG, `releaseVideo failed, err.code:${err.code}, err.message:${err.message}`); diff --git a/VideoPlayerSample/MediaService/src/main/ets/controller/AvSessionController.ets b/VideoPlayerSample/MediaService/src/main/ets/controller/AvSessionController.ets index eb64d2a3..46ef3594 100644 --- a/VideoPlayerSample/MediaService/src/main/ets/controller/AvSessionController.ets +++ b/VideoPlayerSample/MediaService/src/main/ets/controller/AvSessionController.ets @@ -20,6 +20,7 @@ import { VideoData } from '../model/VideoData'; import Logger from '../utils/Logger'; import { ImageUtil } from '../utils/ImageUtil'; import { BackgroundTaskManager } from '../utils/BackgroundTaskManager'; +import { image } from '@kit.ImageKit'; const TAG: string = 'AvSessionController'; @@ -39,6 +40,7 @@ export class AvSessionController { } return AvSessionController.instance; } + // [Start init_session] public initAvSession(): void { this.context = AppStorage.get('context'); @@ -55,12 +57,17 @@ export class AvSessionController { // Apply for background long-term tasks BackgroundTaskManager.startContinuousTask(this.context); this.setLaunchAbility(); - this.avSession.activate(); + this.avSession.activate().catch((err: BusinessError) => { + Logger.error(TAG, `avSession activate failed: err.code:${err.code}, err.message:${err.message}`); + }); + }).catch((err: BusinessError) => { + Logger.error(TAG, `avSession activate failed: err.code:${err.code}, err.message:${err.message}`); }); } catch (err) { Logger.error(TAG, `createAVSession failed, err.code:${err.code}, err.message:${err.message}`); } } + // [End init_session] public getAvSession(): avSession.AVSession | undefined { return this.avSession; @@ -73,12 +80,16 @@ export class AvSessionController { // [Start meta_data] public async setAVMetadata(curSource: VideoData, duration: number): Promise { // [StartExclude meta_data] - if (curSource === undefined || this.context ===undefined) { - Logger.error(TAG, 'SetAVMetadata Error, curSource or context is null'); + if (curSource === undefined || this.context === undefined) { + Logger.error(TAG, 'SetAVMetadata Error, curSource or context is undefined'); return; } // [EndExclude meta_data] - const imagePixMap = await ImageUtil.getPixmapFromMedia(curSource.head); + const imagePixMap: image.PixelMap | undefined = await ImageUtil.getPixmapFromMedia(curSource.head); + if (imagePixMap === undefined) { + Logger.error(TAG, 'SetAVMetadata Error, imagePixMap is undefined'); + return; + } try { let metadata: avSession.AVMetadata = { assetId: `${curSource.index}`, // Media ID @@ -98,6 +109,7 @@ export class AvSessionController { Logger.error(TAG, `setAVMetadata failed, code: ${err.code}, message: ${err.message}`); } } + // [End meta_data] // [Start launch] @@ -120,12 +132,15 @@ export class AvSessionController { }; wantAgent.getWantAgent(wantAgentInfo).then((agent) => { if (this.avSession) { - this.avSession.setLaunchAbility(agent); + this.avSession.setLaunchAbility(agent).catch((err: BusinessError) => { + Logger.error(TAG, `avSession setLaunchAbility failed: code: ${err.code}, message: ${err.message}`); + }); } }).catch((err: BusinessError) => { Logger.error(TAG, `getWantAgent failed: code: ${err.code}, message: ${err.message}`); }); } + // [End launch] // [Start update_is_play] @@ -140,6 +155,7 @@ export class AvSessionController { }); } } + // [End update_is_play] // [Start init_session] @@ -163,5 +179,6 @@ export class AvSessionController { // Destroy background long-term tasks BackgroundTaskManager.stopContinuousTask(this.context); } + // [End init_session] } \ No newline at end of file diff --git a/VideoPlayerSample/MediaService/src/main/ets/controller/AvSessionController1.ets b/VideoPlayerSample/MediaService/src/main/ets/controller/AvSessionControllerPCode.ets similarity index 70% rename from VideoPlayerSample/MediaService/src/main/ets/controller/AvSessionController1.ets rename to VideoPlayerSample/MediaService/src/main/ets/controller/AvSessionControllerPCode.ets index ff314329..5ac97625 100644 --- a/VideoPlayerSample/MediaService/src/main/ets/controller/AvSessionController1.ets +++ b/VideoPlayerSample/MediaService/src/main/ets/controller/AvSessionControllerPCode.ets @@ -13,30 +13,36 @@ * limitations under the License. */ -import { hilog } from '@kit.PerformanceAnalysisKit'; -import { common } from '@kit.AbilityKit'; // [Start session_controller1] import { avSession } from '@kit.AVSessionKit'; +import { BusinessError } from '@kit.BasicServicesKit'; +import { common } from '@kit.AbilityKit'; +import Logger from '../utils/Logger'; const TAG: string = 'AvSessionController'; export class AvSessionController { private avSession?: avSession.AVSession; private context?: common.UIAbilityContext; - public initAvSession() { + + public initAvSession(): void { this.context = AppStorage.get('context'); if (!this.context) { - hilog.info(0x0001, TAG, "session create failed : context is undefined"); + Logger.info(TAG, `session create failed : context is undefined`); return; } // Create an AVSession with the session type set to' video'. avSession.createAVSession(this.context, "SHORT_AUDIO_SESSION", 'video').then(async (avSession) => { this.avSession = avSession; - hilog.info(0x0001, TAG, `session create successed : sessionId : ${this.avSession.sessionId}`); + Logger.info(TAG, `session create successed : sessionId : ${this.avSession.sessionId}`); //Sets the UIAbility for being pulled up by the broadcast control center. this.setLaunchAbility(); // Activate media session - this.avSession.activate(); + this.avSession.activate().catch((err: BusinessError) => { + Logger.error(TAG, `avSession activate failed: err.code:${err.code}, err.message:${err.message}`); + }); + }).catch((err: BusinessError) => { + Logger.error(TAG, `avSession activate failed: err.code:${err.code}, err.message:${err.message}`); }); } // [StartExclude session_controller1] diff --git a/VideoPlayerSample/README.md b/VideoPlayerSample/README.md index b5767a8b..6fa9c72d 100644 --- a/VideoPlayerSample/README.md +++ b/VideoPlayerSample/README.md @@ -35,7 +35,7 @@ │ ├──pages │ │ └──IndexPage.ets // 首页 │ ├──utils -│ │ └──WindowUtil.ets // 窗口工具类 +│ │ ├──WindowUtil.ets // 窗口工具类 │ │ └──BreakpointSystem.ets // 断点工具类 │ └──view │ ├──AVPlayer.ets // 视频组件 @@ -48,7 +48,8 @@ │ │ └──CommonConstants.ets //常量类 │ ├──controller │ │ ├──AvPlayerController.ets //视频播放控制 -│ │ └──AvSessionController.ets //媒体会话控制 +│ │ ├──AvSessionController.ets //媒体会话控制 +│ │ └──AvSessionControllerPCode.ets //媒体会话控制伪代码 │ ├──model │ │ └──VideoData.ets //视频数据类 │ └──utils @@ -69,8 +70,8 @@ 1. 本示例仅支持标准系统上运行,支持设备:华为手机。 -2. HarmonyOS系统:HarmonyOS 5.0.5 Release及以上。 +2. HarmonyOS系统:HarmonyOS 6.0.0 Release及以上。 -3. DevEco Studio版本:DevEco Studio 5.0.5 Release及以上。 +3. DevEco Studio版本:DevEco Studio 6.0.0 Release及以上。 -4. HarmonyOS SDK版本:HarmonyOS 5.0.5 Release SDK及以上。 +4. HarmonyOS SDK版本:HarmonyOS 6.0.0 Release SDK及以上。 diff --git a/VideoPlayerSample/README_EN.md b/VideoPlayerSample/README_EN.md index 48486b2c..22a4cf0f 100644 --- a/VideoPlayerSample/README_EN.md +++ b/VideoPlayerSample/README_EN.md @@ -34,7 +34,7 @@ This sample demonstrates how to develop a video app using the AVPlayer and AVSes │ ├──pages │ │ └──IndexPage.ets // Home page │ ├──utils -│ │ └──WindowUtil.ets // Window utility class +│ │ ├──WindowUtil.ets // Window utility class │ │ └──BreakpointSystem.ets // Breakpoint utility class │ └──view │ ├──AVPlayer.ets // Video component @@ -43,18 +43,19 @@ This sample demonstrates how to develop a video app using the AVPlayer and AVSes │ └──VideoDetails.ets // Video details components ├──entry/src/main/resources // Static resources └──MediaService/src/main/ets - ├──common - │ └──CommonConstants.ets // Common constants - ├──controller - │ ├──AvPlayerController.ets // Video playback control - │ └──AvSessionController.ets // AVSession control - ├──model - │ └──VideoData.ets // Video data class - └──utils - ├──BackgroundTaskManager.ets // Background playback - ├──CommUtils.ets // Utility class - ├──ImageUtil.ets // Image pixel processing class - └──Logger.ets // Log utility +│ ├──common +│ │ └──CommonConstants.ets // Common constants +│ ├──controller +│ │ ├──AvPlayerController.ets // Video playback control +│ │ ├──AvSessionController.ets // AVSession control +│ │ └──AvSessionControllerPCode.ets // AVSession control pseudocode +│ ├──model +│ │ └──VideoData.ets // Video data class +│ └──utils +│ ├──BackgroundTaskManager.etss // Background playback +│ ├──CommUtils.ets // Utility class +│ └──Logger.ets // Image pixel processing class +└──MediaService/src/main/resources // Log utility ``` ### Required Permissions @@ -67,8 +68,8 @@ This sample demonstrates how to develop a video app using the AVPlayer and AVSes 1. The sample is only supported on Huawei phones with standard systems. -2. The HarmonyOS version must be HarmonyOS 5.0.5 Release or later. +2. The HarmonyOS version must be HarmonyOS 6.0.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 6.0.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 6.0.0 Release SDK or later. diff --git a/VideoPlayerSample/build-profile.json5 b/VideoPlayerSample/build-profile.json5 index 608af2db..6e8e07d7 100644 --- a/VideoPlayerSample/build-profile.json5 +++ b/VideoPlayerSample/build-profile.json5 @@ -5,9 +5,9 @@ { "name": "default", "signingConfig": "default", - "targetSdkVersion": "5.0.5(17)", - "compatibleSdkVersion": "5.0.5(17)", - "runtimeOS": "HarmonyOS", + "targetSdkVersion": "6.0.0(20)", + "compatibleSdkVersion": "6.0.0(20)", + "runtimeOS": "HarmonyOS" } ], "buildModeSet": [ diff --git a/VideoPlayerSample/entry/src/main/ets/entryability/EntryAbility.ets b/VideoPlayerSample/entry/src/main/ets/entryability/EntryAbility.ets index 6bfb7b26..ab5b5a32 100644 --- a/VideoPlayerSample/entry/src/main/ets/entryability/EntryAbility.ets +++ b/VideoPlayerSample/entry/src/main/ets/entryability/EntryAbility.ets @@ -13,44 +13,51 @@ * limitations under the License. */ +import { BusinessError } from '@kit.BasicServicesKit'; import { UIAbility } from '@kit.AbilityKit'; -import { hilog } from '@kit.PerformanceAnalysisKit'; import { window } from '@kit.ArkUI'; import { WindowUtil } from '../utils/WindowUtil'; +import { Logger } from '@ohos/MediaService'; + +const TAG: string = '[EntryAbility]'; export default class EntryAbility extends UIAbility { onCreate(): void { AppStorage.setOrCreate('context', this.context); - hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); + Logger.info(TAG, `Ability onCreate`); } onDestroy(): void { - hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy'); + Logger.info(TAG, `Ability onDestroy`); } // [Start stage_creat] onWindowStageCreate(windowStage: window.WindowStage): void { // [StartExclude stage_creat] // Main window is created, set main page for this ability - hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + Logger.info(TAG, `Ability onWindowStageCreate`); try { let windowClass: window.Window = windowStage.getMainWindowSync(); AppStorage.setOrCreate('windowStage', windowStage); - windowClass.setWindowLayoutFullScreen(true); + windowClass.setWindowLayoutFullScreen(true).catch((err: BusinessError) => { + Logger.error(TAG, `setWindowLayoutFullScreen failed, err.code:${err.code}, err.message:${err.message}`); + }); windowClass.setWindowSystemBarProperties({ statusBarContentColor: '#e6ffffff' + }).catch((err: BusinessError) => { + Logger.error(TAG, `setWindowSystemBarProperties failed, err.code:${err.code}, err.message:${err.message}`); }); windowStage.loadContent('pages/IndexPage', (err) => { AppStorage.setOrCreate('uiContext', windowStage.getMainWindowSync().getUIContext()); WindowUtil.getInstance().setWindowStage(windowStage); if (err.code) { - hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + Logger.error(TAG, `failed to load the content, err.code:${err.code}, err.message:${err.message}`); return; } - hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.'); + Logger.info(TAG, `Succeeded in loading the content`); }); } catch (err) { - hilog.error(0x0000, 'testTag', `onWindowStageCreate failed, err.code:${err.code}, err.message:${err.message}`); + Logger.error(TAG, `onWindowStageCreate failed, err.code:${err.code}, err.message:${err.message}`); } // [EndExclude stage_creat] } @@ -58,16 +65,16 @@ export default class EntryAbility extends UIAbility { onWindowStageDestroy(): void { // Main window is destroyed, release UI related resources - hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + Logger.info(TAG, `Ability onWindowStageDestroy`); } onForeground(): void { // Ability has brought to foreground - hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground'); + Logger.info(TAG, `Ability onForeground`); } onBackground(): void { // Ability has back to background - hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground'); + Logger.info(TAG, `Ability onBackground`); } } diff --git a/VideoPlayerSample/entry/src/main/ets/pages/IndexPage.ets b/VideoPlayerSample/entry/src/main/ets/pages/IndexPage.ets index 9490f4d9..c117cfe0 100644 --- a/VideoPlayerSample/entry/src/main/ets/pages/IndexPage.ets +++ b/VideoPlayerSample/entry/src/main/ets/pages/IndexPage.ets @@ -45,9 +45,9 @@ struct IndexPage { // [Start about_appear] // Turn on window size monitoring in aboutToAppear async aboutToAppear(): Promise { - let context = this.getUIContext().getHostContext() as Context; + let context: Context = this.getUIContext().getHostContext() as Context; try { - let windowClass = await window.getLastWindow(context); + let windowClass: window.Window = await window.getLastWindow(context); await windowClass.setWindowKeepScreenOn(true); } catch (err) { Logger.error(TAG, `aboutToAppear failed, err.code:${err.code}, err.message:${err.message}`); @@ -233,7 +233,7 @@ struct IndexPage { // [EndExclude index_page1] onWindowSizeChange(): void { // [StartExclude index_page1] - let deviceWidth = AppStorage.get('deviceWidth') || 0; + let deviceWidth: number = AppStorage.get('deviceWidth') || 0; // Judge whether it is a horizontal screen or a vertical screen suspension window. if (this.isFullLandscapeScreen && Math.round((this.deviceHeight / deviceWidth) * 1000) / 1000 === 0.563) { this.isFloatWindow = true; diff --git a/VideoPlayerSample/entry/src/main/ets/utils/BreakpointSystem.ets b/VideoPlayerSample/entry/src/main/ets/utils/BreakpointSystem.ets index 4f8c74c3..06f524e4 100644 --- a/VideoPlayerSample/entry/src/main/ets/utils/BreakpointSystem.ets +++ b/VideoPlayerSample/entry/src/main/ets/utils/BreakpointSystem.ets @@ -14,8 +14,7 @@ */ import { window } from '@kit.ArkUI'; -import type { BusinessError } from '@kit.BasicServicesKit'; -import { hilog } from '@kit.PerformanceAnalysisKit'; +import { Logger } from '@ohos/MediaService'; const TAG: string = '[BreakpointSystem]'; @@ -111,9 +110,8 @@ export class BreakpointSystem { widthBp = BreakpointTypeEnum.XL; } this.updateCurrentBreakpoint(widthBp); - } catch (error) { - const err: BusinessError = error as BusinessError; - hilog.error(0x0000, TAG, `UpdateBreakpoint fail, error code: ${err.code}, message: ${err.message}`); + } catch (err) { + Logger.error(TAG, `updateWidthBp failed, err.code:${err.code}, err.message:${err.message}`); } } } \ No newline at end of file diff --git a/VideoPlayerSample/entry/src/main/ets/utils/WindowUtil.ets b/VideoPlayerSample/entry/src/main/ets/utils/WindowUtil.ets index 02db8c6b..9d7583a6 100644 --- a/VideoPlayerSample/entry/src/main/ets/utils/WindowUtil.ets +++ b/VideoPlayerSample/entry/src/main/ets/utils/WindowUtil.ets @@ -45,23 +45,27 @@ export class WindowUtil { } // [EndExclude set_stage1] this.mainWindowClass = windowClass; - const properties: window.WindowProperties = windowClass.getWindowProperties(); // Get window information - // [StartExclude set_stage1] - // Get status bar height. - let area: window.AvoidArea = windowClass.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM); - let naviBarArea: window.AvoidArea = - windowClass.getWindowAvoidArea(window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR); - // [EndExclude set_stage1] - AppStorage.setOrCreate('deviceWidth', properties.windowRect.width); // Set the window width - AppStorage.setOrCreate('deviceHeight', properties.windowRect.height); // Set the window height - // [StartExclude set_stage1] - AppStorage.setOrCreate('statusBarHeight', uiContext?.px2vp(area.topRect.height)); - AppStorage.setOrCreate('navBarHeight', uiContext?.px2vp(naviBarArea.bottomRect.height)); - windowClass.on('windowSizeChange', () => BreakpointSystem.getInstance().onWindowSizeChange(windowClass)); - windowClass.on('avoidAreaChange', (avoidAreaOption) => { - WindowUtil.setAvoidArea(avoidAreaOption.type, avoidAreaOption.area); - }); - // [EndExclude set_stage1] + try { + const properties: window.WindowProperties = windowClass.getWindowProperties(); // Get window information + // [StartExclude set_stage1] + // Get status bar height. + let area: window.AvoidArea = windowClass.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM); + let naviBarArea: window.AvoidArea = + windowClass.getWindowAvoidArea(window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR); + // [EndExclude set_stage1] + AppStorage.setOrCreate('deviceWidth', properties.windowRect.width); // Set the window width + AppStorage.setOrCreate('deviceHeight', properties.windowRect.height); // Set the window height + // [StartExclude set_stage1] + AppStorage.setOrCreate('statusBarHeight', uiContext?.px2vp(area.topRect.height)); + AppStorage.setOrCreate('navBarHeight', uiContext?.px2vp(naviBarArea.bottomRect.height)); + windowClass.on('windowSizeChange', () => BreakpointSystem.getInstance().onWindowSizeChange(windowClass)); + windowClass.on('avoidAreaChange', (avoidAreaOption) => { + WindowUtil.setAvoidArea(avoidAreaOption.type, avoidAreaOption.area); + }); + // [EndExclude set_stage1] + } catch (error) { + Logger.error(TAG, `setWindowStage getWindowProperties failed. Code:${err.code}, message:${err.message}`); + } }); } // [End set_stage1] @@ -100,11 +104,9 @@ export class WindowUtil { return; } // Set the status bar and navigation bar to be invisible in full-screen mode. - try { - this.mainWindowClass.setWindowSystemBarEnable([]); - } catch (err) { + this.mainWindowClass.setWindowSystemBarEnable([]).catch((err: BusinessError) => { Logger.error(TAG, `disableWindowSystemBar failed, err.code:${err.code}, err.message:${err.message}`); - } + }); } enableWindowSystemBar(): void { @@ -112,11 +114,9 @@ export class WindowUtil { Logger.error(`MainWindowClass is undefined`); return; } - try { - this.mainWindowClass.setWindowSystemBarEnable(['status', 'navigation']); - } catch (err) { + this.mainWindowClass.setWindowSystemBarEnable(['status', 'navigation']).catch((err: BusinessError) => { Logger.error(TAG, `enableWindowSystemBar failed, err.code:${err.code}, err.message:${err.message}`); - } + }); } setLandscapeMultiWindow(enable: boolean): void { @@ -124,14 +124,14 @@ export class WindowUtil { Logger.error(`MainWindowClass is undefined`); return; } - try { - if (enable) { - this.mainWindowClass?.enableLandscapeMultiWindow(); - } else { - this.mainWindowClass?.disableLandscapeMultiWindow(); - } - } catch (err) { - Logger.error(TAG, `setLandscapeMultiWindow failed, err.code:${err.code}, err.message:${err.message}`); + if (enable) { + this.mainWindowClass?.enableLandscapeMultiWindow().catch((err: BusinessError) => { + Logger.error(TAG, `enableLandscapeMultiWindow failed, err.code:${err.code}, err.message:${err.message}`); + }); + } else { + this.mainWindowClass?.disableLandscapeMultiWindow().catch((err: BusinessError) => { + Logger.error(TAG, `disableLandscapeMultiWindow failed, err.code:${err.code}, err.message:${err.message}`); + }); } } // [Start size_change] diff --git a/VideoPlayerSample/entry/src/main/ets/view/AVPlayer.ets b/VideoPlayerSample/entry/src/main/ets/view/AVPlayer.ets index e501413b..af9a0637 100644 --- a/VideoPlayerSample/entry/src/main/ets/view/AVPlayer.ets +++ b/VideoPlayerSample/entry/src/main/ets/view/AVPlayer.ets @@ -15,7 +15,6 @@ import { componentUtils, window } from '@kit.ArkUI'; import { BusinessError, settings } from '@kit.BasicServicesKit'; -import { hilog } from '@kit.PerformanceAnalysisKit'; import { audio, AVVolumePanel } from '@kit.AudioKit'; import { Logger, CommonConstants, secondToTime, } from '@ohos/MediaService'; import { AvPlayerController, VideoData } from '@ohos/MediaService'; @@ -65,31 +64,35 @@ export struct VideoPlayer { private screenHeight: number = 0; private windowStage: window.WindowStage = AppStorage.get('windowStage') as window.WindowStage; // Get the main window. - private mainWin: window.Window = this.windowStage.getMainWindowSync(); + private mainWin?: window.Window; aboutToAppear(): void { - let windowClass: window.Window | undefined = undefined; + try { + this.mainWin = this.windowStage.getMainWindowSync(); + } catch (err) { + Logger.error(TAG, `mainWin failed, err.code:${err.code}, err.message:${err.message}`); + } const context: Context | undefined = AppStorage.get('context'); settings.getValue(context, settings.display.SCREEN_BRIGHTNESS_STATUS, settings.domainName.DEVICE_SHARED) .then((value) => { - hilog.info(0x0000, 'AVPlayer', `Promise:value -> ${JSON.stringify(value)}`); + Logger.info(TAG, `Promise:value -> ${JSON.stringify(value)}`); this.screenBrightness = Number(value) / 255; }) try { + let windowClass: window.Window | undefined = undefined; window.getLastWindow(this.getUIContext().getHostContext()).then((window: window.Window) => { windowClass = window; this.screenHeight = windowClass.getWindowProperties().windowRect.height; }).catch((err: BusinessError) => { - hilog.error(0x0000, 'AVPlayer', - `Failed to obtain the top window. Cause code: ${err.code}, message: ${err.message}`); + Logger.error(TAG, `Failed to obtain the top window. Cause code: ${err.code}, message: ${err.message}`); }); - let audioManager = audio.getAudioManager(); + let audioManager: audio.AudioManager = audio.getAudioManager(); let audioVolumeManger: audio.AudioVolumeManager = audioManager.getVolumeManager(); this.volume = audioVolumeManger.getVolumeByStream(audio.StreamUsage.STREAM_USAGE_MOVIE); } catch (exception) { - hilog.error(0x0000, 'AVPlayer', + Logger.error(TAG, `Failed to obtain the top window. Cause code: ${exception.code}, message: ${exception.message}`); } } @@ -163,7 +166,7 @@ export struct VideoPlayer { .width(this.isFloatWindow ? $r('app.float.size_24') : $r('app.float.icon_size_large')) .aspectRatio(1) .visibility(this.isFullScreen || this.isFullLandscapeScreen || this.isFloatWindow ? - Visibility.Visible : Visibility.Hidden) + Visibility.Visible : Visibility.Hidden) Image($r('app.media.ic_video_menu_forward')) .monopolizeEvents(true) .width(this.isFloatWindow ? $r('app.float.size_24') : $r('app.float.icon_size_large')) @@ -214,7 +217,6 @@ export struct VideoPlayer { } .width('50%') // [End panel] - // [Start screen5] Column() { Stack() { @@ -252,6 +254,7 @@ export struct VideoPlayer { }) .height('100%') .width('50%') + // [End screen5] } .height('100%') @@ -259,6 +262,7 @@ export struct VideoPlayer { } // [EndExclude build] } + // [StartExclude build] } .justifyContent(FlexAlign.Center) @@ -281,21 +285,22 @@ export struct VideoPlayer { if (event.fingerList[0].globalX > (CommonConstants.FULL_SCREEN_WIDTH / 2)) { // On the right side of the screen relative to the X-axis coordinate in the upper left corner of the application window, adjust the brightness. this.visible = true; - let curBrightness: number = this.screenBrightness - this.getUIContext().vp2px(event.offsetY) / this.getUIContext().vp2px(this.screenHeight); + let curBrightness: number = this.screenBrightness - + this.getUIContext().vp2px(event.offsetY) / this.getUIContext().vp2px(this.screenHeight); curBrightness = Math.max(0, Math.min(1.0, curBrightness)); this.screenBrightness = curBrightness; - hilog.info(0x0000, 'AVPlayer', `this brightness is: ` + this.screenBrightness); + Logger.info(TAG, `this brightness is: ` + this.screenBrightness); try { - this.mainWin.setWindowBrightness(this.screenBrightness, (err) => { + this.mainWin?.setWindowBrightness(this.screenBrightness, (err) => { if (err) { - hilog.error(0x0000, 'AVPlayer', `Failed to set the brightness. Cause: ${JSON.stringify(err)}`); + Logger.error(TAG, `Failed to set the brightness. Cause: ${JSON.stringify(err)}`); return; } - hilog.info(0x0000, 'AVPlayer', `Succeeded in setting the brightness.`); + Logger.info(TAG, `Succeeded in setting the brightness.`); }); } catch (exception) { - hilog.error(0x0000, 'AVPlayer', `Failed to set the brightness.`); + Logger.error(TAG, `Failed to set the brightness.`); } } else { // On the left side of the screen relative to the X-axis coordinate in the upper left corner of the application window, adjust the volume. @@ -304,7 +309,7 @@ export struct VideoPlayer { curVolume = curVolume >= 15.0 ? 15.0 : curVolume; curVolume = curVolume <= 0.0 ? 0.0 : curVolume; this.volume = curVolume; - hilog.info(0x0000, 'AVPlayer', `this volume is: ` + this.volume); + Logger.info(TAG, `this volume is: ` + this.volume); } }) .onActionEnd(() => { @@ -358,11 +363,12 @@ export struct VideoPlayer { }) ) } + // [End build] // The popup constructor defines the content of the dialog box @Builder - popupBuilder() { + popupBuilder(): void { Row({ space: 2 }) { Text($r('app.string.last_history', this.showTipsTime)) .fontSize($r('app.float.font_size_14')) @@ -436,7 +442,7 @@ export struct VideoPlayer { Column() { Row() { Image(this.avPlayerController.isPlaying ? $r('sys.media.ohos_ic_public_pause') : - $r('app.media.ic_video_menu_play')) + $r('app.media.ic_video_menu_play')) .width($r('app.float.size_24')) .height($r('app.float.size_24')) .fillColor(Color.White) @@ -455,8 +461,8 @@ export struct VideoPlayer { max: this.avPlayerController.durationTime, style: this.sliderStyle }) - // [StartExclude value] - // [StartExclude slider] + // [StartExclude value] + // [StartExclude slider] .id('video_slider') .height(this.isSliderDragging ? $r('app.float.side_width') : $r('app.float.size_24')) .layoutWeight(1) @@ -473,10 +479,15 @@ export struct VideoPlayer { // [EndExclude value] // [StartExclude slider] .onAreaChange(() => { - let videoSlider: componentUtils.ComponentInfo = this.getUIContext().getComponentUtils().getRectangleById('video_slider'); - this.slideWidth = this.getUIContext().px2vp(videoSlider.size.width); - this.offsetY = this.getUIContext().px2vp(videoSlider.localOffset.y); - this.beginX = this.getUIContext().px2vp(videoSlider.localOffset.x); + try { + let videoSlider: componentUtils.ComponentInfo = + this.getUIContext().getComponentUtils().getRectangleById('video_slider'); + this.slideWidth = this.getUIContext().px2vp(videoSlider.size.width); + this.offsetY = this.getUIContext().px2vp(videoSlider.localOffset.y); + this.beginX = this.getUIContext().px2vp(videoSlider.localOffset.x); + } catch (err) { + Logger.error(TAG, `onAreaChange failed, err.code:${err.code}, err.message:${err.message}`); + } }) // [EndExclude slider] .onChange((value: number, mode: SliderChangeMode) => { @@ -490,6 +501,7 @@ export struct VideoPlayer { } } .width(CommonConstants.WIDTH_FULL_PERCENT) + // [Start transparent] // Set a transparent stack block with the same size as the Slider. Stack() { @@ -512,6 +524,7 @@ export struct VideoPlayer { arrowPointPosition: ArrowPointPosition.CENTER, radius: this.blockSize, }) + // [End transparent] } }.margin({ @@ -558,6 +571,7 @@ export struct VideoPlayer { break; } } + // [End slider1] async iconOnclick(): Promise { @@ -566,7 +580,7 @@ export struct VideoPlayer { this.avPlayerController.setIsPlaying(false); this.isTimeDisplay = 0; this.trackThicknessSize = CommonConstants.TRACK_SIZE_MIN; - let context: Context = AppStorage.get('context')!; + let context: Context = AppStorage.get('context')!; try { let windowClass: window.Window = await window.getLastWindow(context); await windowClass.setWindowKeepScreenOn(false); diff --git a/VideoPlayerSample/entry/src/main/ets/view/VideoDetails.ets b/VideoPlayerSample/entry/src/main/ets/view/VideoDetails.ets index e820b6c1..a1ed4f32 100644 --- a/VideoPlayerSample/entry/src/main/ets/view/VideoDetails.ets +++ b/VideoPlayerSample/entry/src/main/ets/view/VideoDetails.ets @@ -12,7 +12,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { CommonConstants as Const, VideoData } from '@ohos/MediaService'; +import { CommonConstants as Const, Logger, VideoData } from '@ohos/MediaService'; + +const TAG: string = '[VideoDetails]'; @Component({ freezeWhenInactive: true }) export struct VideoDetails { @@ -24,7 +26,7 @@ export struct VideoDetails { * The callback function for the click event of the like button. * @param isAdd */ - private changeLikeCount(isAdd: boolean) { + private changeLikeCount(isAdd: boolean): void { let likeCountNum: number = Number(this.item.likeCount); if (isAdd) { likeCountNum++; @@ -127,7 +129,13 @@ export struct VideoDetails { .opacity($r('app.float.opacity_4')) } .onClick(() => { - this.getUIContext().getPromptAction().showToast({ message: $r('app.string.comment'), duration: Const.TOAST_DURATION }); + try { + this.getUIContext() + .getPromptAction() + .showToast({ message: $r('app.string.comment'), duration: Const.TOAST_DURATION }); + } catch (err) { + Logger.error(TAG, `detail comments click failed, err.code:${err.code}, err.message:${err.message}`); + } }) Column() { @@ -141,7 +149,13 @@ export struct VideoDetails { .opacity($r('app.float.opacity_4')) } .onClick(() => { - this.getUIContext().getPromptAction().showToast({ message: $r('app.string.share'), duration: Const.TOAST_DURATION }); + try { + this.getUIContext() + .getPromptAction() + .showToast({ message: $r('app.string.share'), duration: Const.TOAST_DURATION }); + } catch (err) { + Logger.error(TAG, `detail share click failed, err.code:${err.code}, err.message:${err.message}`); + } }) } .width(Const.FULL_SIZE) diff --git a/VideoPlayerSample/entry/src/main/ets/view/VideoSide.ets b/VideoPlayerSample/entry/src/main/ets/view/VideoSide.ets index c6137bbb..ad47d282 100644 --- a/VideoPlayerSample/entry/src/main/ets/view/VideoSide.ets +++ b/VideoPlayerSample/entry/src/main/ets/view/VideoSide.ets @@ -13,7 +13,9 @@ * limitations under the License. */ -import { CommonConstants as Const, VideoData } from '@ohos/MediaService'; +import { CommonConstants as Const, Logger, VideoData } from '@ohos/MediaService'; + +const TAG: string = '[VideoSide]'; @Component export struct RightSide { @@ -25,7 +27,7 @@ export struct RightSide { * The callback function for the click event of the like button. * @param isAdd */ - private changeLikeCount(isAdd: boolean) { + private changeLikeCount(isAdd: boolean): void { let likeCountNum: number = Number(this.item.likeCount); if (isAdd) { likeCountNum++; @@ -89,7 +91,13 @@ export struct RightSide { .fillColor(Color.White) .margin({ bottom: $r('app.float.fabulous_margin_bottom') }) .onClick(() => { - this.getUIContext().getPromptAction().showToast({ message: $r('app.string.comment'), duration: Const.TOAST_DURATION }); + try { + this.getUIContext() + .getPromptAction() + .showToast({ message: $r('app.string.comment'), duration: Const.TOAST_DURATION }); + } catch (err) { + Logger.error(TAG, `video comments click failed, err.code:${err.code}, err.message:${err.message}`); + } }) Text(this.item.commentCount) .fontSize($r('app.float.fabulous_font_size')) @@ -112,7 +120,13 @@ export struct RightSide { .width($r('app.float.avatar_size')) .alignItems(HorizontalAlign.Center) .onClick(() => { - this.getUIContext().getPromptAction().showToast({ message: $r('app.string.share'), duration: Const.TOAST_DURATION }); + try { + this.getUIContext() + .getPromptAction() + .showToast({ message: $r('app.string.share'), duration: Const.TOAST_DURATION }); + } catch (err) { + Logger.error(TAG, `video share click failed, err.code:${err.code}, err.message:${err.message}`); + } }) } .margin({ bottom: $r('app.float.video_side_margin_bottom'), right: $r('app.float.right_space') }) -- Gitee