From 674b38b7398f0a54108bc7ffbe96bd79336b2781 Mon Sep 17 00:00:00 2001 From: guangda Date: Thu, 21 Aug 2025 16:16:40 +0800 Subject: [PATCH] fix bug --- README.en.md | 36 --------- README.md | 60 +++++++------- .../main/ets/common/utils/BackgroundUtil.ets | 2 +- .../ets/common/utils/BreakpointSystem.ets | 2 +- entry/src/main/ets/common/utils/LrcUtils.ets | 2 +- .../src/main/ets/common/utils/MediaTools.ets | 13 +-- .../ets/common/utils/SecondBufferWalk.ets | 9 ++- .../main/ets/common/utils/SongItemBuilder.ets | 17 ++-- .../ets/component/ControlAreaComponent.ets | 62 ++++++++------- .../{LrcView.ets => LrcInfoComponent.ets} | 55 ++++--------- .../main/ets/component/LyricsComponent.ets | 17 ++-- .../main/ets/component/MusicInfoComponent.ets | 3 +- .../ets/component/PlayerInfoComponent.ets | 9 +-- .../main/ets/component/ToneQualityList.ets | 2 +- .../main/ets/component/TopAreaComponent.ets | 4 +- .../ets/controller/AVSessionController.ets | 5 +- .../ets/controller/AudioCastController.ets | 4 +- .../ets/controller/AudioPlayerController.ets | 24 +++--- .../controller/AudioRendererController.ets | 75 +++++++++--------- .../main/ets/entryability/EntryAbility.ets | 10 +-- .../ets/{dataSource => model}/LrcEntry.ets | 0 .../ets/{dataSource => model}/SongData.ets | 2 - .../{dataSource => model}/SongDataSource.ets | 0 .../{dataSource => model}/SongListData.ets | 8 +- entry/src/main/ets/pages/Index.ets | 8 +- entry/src/main/ets/pages/MusicPlayPage.ets | 8 +- entry/src/main/module.json5 | 13 +-- .../main/resources/base/element/string.json | 8 +- .../main/resources/en_US/element/string.json | 4 + .../main/resources/zh_CN/element/string.json | 4 + oh-package-lock.json5 | 22 +---- oh-package.json5 | 5 +- screenshots/{ => device}/page1.png | Bin screenshots/{ => device}/page2.png | Bin screenshots/{ => device}/page3.png | Bin 35 files changed, 209 insertions(+), 284 deletions(-) delete mode 100644 README.en.md rename entry/src/main/ets/component/{LrcView.ets => LrcInfoComponent.ets} (97%) rename entry/src/main/ets/{dataSource => model}/LrcEntry.ets (100%) rename entry/src/main/ets/{dataSource => model}/SongData.ets (97%) rename entry/src/main/ets/{dataSource => model}/SongDataSource.ets (100%) rename entry/src/main/ets/{dataSource => model}/SongListData.ets (89%) rename screenshots/{ => device}/page1.png (100%) rename screenshots/{ => device}/page2.png (100%) rename screenshots/{ => device}/page3.png (100%) diff --git a/README.en.md b/README.en.md deleted file mode 100644 index 6d1ad79..0000000 --- a/README.en.md +++ /dev/null @@ -1,36 +0,0 @@ -# MusicCast - -#### Description -{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**} - -#### Software Architecture -Software architecture description - -#### Installation - -1. xxxx -2. xxxx -3. xxxx - -#### Instructions - -1. xxxx -2. xxxx -3. xxxx - -#### Contribution - -1. Fork the repository -2. Create Feat_xxx branch -3. Commit your code -4. Create Pull Request - - -#### Gitee Feature - -1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md -2. Gitee blog [blog.gitee.com](https://blog.gitee.com) -3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) -4. The most valuable open source project [GVP](https://gitee.com/gvp) -5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) -6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/README.md b/README.md index c96e882..8dd220e 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,21 @@ # 实现音频投播功能 -### 介绍 +## 项目简介 -本实例基于播控中心和系统投播实现完整的音频投播功能,包含投播和播控基础控制:设备切换、歌曲切换、音量增减、进度切换、播放模式切换。 +本实例基于播控中心和系统投播实现完整的音频投播功能,包含投播和播控中心基础控制:设备切换、歌曲切换、音量增减、进度切换、播放模式切换。 -### 效果图预览 -| 歌曲选择 | 本端播放 | 歌词页 | -|-----------------------------------------------|-----------------------------------------------|-----------------------------------------------| -| | | | -**使用说明** +## 效果预览 +| 歌曲选择 | 本端播放 | 歌词页 | +|------------------------------------------------------|------------------------------------------------------|------------------------------------------------------| +| | | | + +## 使用说明 1. 本端设备播放音频,进度/音量/歌曲控制/音质切换/播放模式切换。 2. 播控中心控制本端设备,进度/音量/歌曲控制。 3. 建立投播,本端控制远端设备进度/音量/歌曲控制。 -### 工程结构&模块类型 +## 工程目录 ``` ├───entry/src/main/ets @@ -42,37 +43,40 @@ │ │ ├───ToneQualityList.ets // 音乐音质弹框组件 │ │ └───TopAreaComponent.ets // 音乐播放头部组件 │ ├───controller -│ │ ├───AudioCastController.ets // 远端投播播放控制器 -│ │ ├───AudioPlayerController.ets // 本地AvPlayer播放控制器 -│ │ ├───AudioRendererController.ets // 本地Audiorenderer播放控制器 -│ │ └───AVSessionController.ets // 播控中心控制器 -│ ├───dataSource -│ │ ├───LrcEntry.ets // 歌词接口 -│ │ ├───SongData.ets // 歌曲信息类 -│ │ ├───SongDataSource.ets // 歌曲工具类 -│ │ └───SongListData.ets // 歌曲数据 +│ │ ├───AudioCastController.ets // 远端投播播放控制器 +│ │ ├───AudioPlayerController.ets // 本地AvPlayer播放控制器 +│ │ ├───AudioRendererController.ets // 本地Audiorenderer播放控制器 +│ │ └───AVSessionController.ets // 播控中心控制器 │ ├───entryability -│ │ └───EntryAbility.ets // Ability的生命周期回调内容 +│ │ └───EntryAbility.ets // Ability的生命周期回调内容 │ ├───entrybackupability -│ │ └───EntryBackupAbility.ets // Ability的生命周期回调内容 +│ │ └───EntryBackupAbility.ets // Ability的生命周期回调内容 +│ ├───model +│ │ ├───LrcEntry.ets // 歌词接口 +│ │ ├───SongData.ets // 歌曲信息类 +│ │ ├───SongDataSource.ets // 歌曲工具类 +│ │ └───SongListData.ets // 歌曲数据 │ └───pages -│ ├───Index.ets // 首页歌曲列表页 -│ └───MusicPlayPage.ets // 本地播放页 +│ ├───Index.ets // 首页歌曲列表页 +│ └───MusicPlayPage.ets // 本地播放页 └───entry/src/main/resources ``` -### 模块依赖 +## 相关权限 + +1.后台长时任务权限:ohos.permission.KEEP_BACKGROUND_RUNNING + +2.允许使用Internet网络权限:ohos.permission.INTERNET -**不涉及** -### 约束与限制 +## 约束与限制 1.设备限制 -本端设备:手机设备。 +本端设备:手机、平板设备。 远端设备:PC/2in1设备。 -4.HarmonyOS系统:HarmonyOS 6.0.0 Beta1 及以上。 +4.HarmonyOS系统:HarmonyOS 6.0.0 Beta2 及以上。 -5.DevEco Studio版本:DevEco Studio 6.0.0 Beta1 及以上。 +5.DevEco Studio版本:DevEco Studio 6.0.0 Beta2 及以上。 -6.HarmonyOS SDK版本:HarmonyOS 6.0.0 Beta1 SDK及以上。 \ No newline at end of file +6.HarmonyOS SDK版本:HarmonyOS 6.0.0 Beta2 SDK及以上。 \ No newline at end of file diff --git a/entry/src/main/ets/common/utils/BackgroundUtil.ets b/entry/src/main/ets/common/utils/BackgroundUtil.ets index 26ae6a8..c54edc1 100644 --- a/entry/src/main/ets/common/utils/BackgroundUtil.ets +++ b/entry/src/main/ets/common/utils/BackgroundUtil.ets @@ -38,7 +38,7 @@ export class BackgroundUtil { abilityName: context.abilityInfo.name } ], - operationType: wantAgent.OperationType.START_ABILITY, + actionType: wantAgent.OperationType.START_ABILITY, requestCode: 0, wantAgentFlags: [wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG] }; diff --git a/entry/src/main/ets/common/utils/BreakpointSystem.ets b/entry/src/main/ets/common/utils/BreakpointSystem.ets index 92a8ec5..92e63ff 100644 --- a/entry/src/main/ets/common/utils/BreakpointSystem.ets +++ b/entry/src/main/ets/common/utils/BreakpointSystem.ets @@ -43,7 +43,7 @@ export class BreakpointType { export class BreakpointSystem { private currentBreakpoint: string = BreakpointConstants.BREAKPOINT_SM; - context: UIContext = AppStorage.get("uiContext") as UIContext; + context: UIContext = AppStorage.get('uiContext') as UIContext; private smListener: mediaquery.MediaQueryListener = this.context.getMediaQuery().matchMediaSync(BreakpointConstants.RANGE_SM); private mdListener: mediaquery.MediaQueryListener = diff --git a/entry/src/main/ets/common/utils/LrcUtils.ets b/entry/src/main/ets/common/utils/LrcUtils.ets index 5fff749..d62e99d 100644 --- a/entry/src/main/ets/common/utils/LrcUtils.ets +++ b/entry/src/main/ets/common/utils/LrcUtils.ets @@ -15,7 +15,7 @@ import { util } from '@kit.ArkTS'; import { hilog } from '@kit.PerformanceAnalysisKit'; -import { LrcEntry, Word } from '../../dataSource/LrcEntry'; +import { LrcEntry, Word } from '../../model/LrcEntry'; /** * LRC format lyrics. diff --git a/entry/src/main/ets/common/utils/MediaTools.ets b/entry/src/main/ets/common/utils/MediaTools.ets index dbd3d5a..fe3dde5 100644 --- a/entry/src/main/ets/common/utils/MediaTools.ets +++ b/entry/src/main/ets/common/utils/MediaTools.ets @@ -19,7 +19,7 @@ import { resourceManager } from '@kit.LocalizationKit'; import { hilog } from '@kit.PerformanceAnalysisKit'; import { avSession } from '@kit.AVSessionKit'; import { SecondBufferWalk } from './SecondBufferWalk'; -import { ToneQuality, MusicPlayMode, SongItem } from '../../dataSource/SongData'; +import { ToneQuality, MusicPlayMode, SongItem } from '../../model/SongData'; import { ResourceConversion } from './ResourceConversion'; const TAG = 'MediaTools'; @@ -29,11 +29,7 @@ export class MediaTools { static async getPixelMapFromResource(context: common.UIAbilityContext | undefined, name: resourceManager.Resource): Promise { - let unit8Array = await context?.resourceManager?.getMediaContent({ - bundleName: name.bundleName, - moduleName: name.moduleName, - id: name.id - }); + let unit8Array = await context?.resourceManager?.getMediaContent(name.id); let imageSource = image.createImageSource(unit8Array?.buffer.slice(0, unit8Array?.buffer.byteLength)); let pixelMap: image.PixelMap = await imageSource.createPixelMap({ desiredPixelFormat: image.PixelMapFormat.RGBA_8888 @@ -160,7 +156,7 @@ export class MediaTools { MediaTools.resourceConversion.getStringValueFromResource($r('app.string.sequential_playback')) : playMode === MusicPlayMode.RANDOM ? MediaTools.resourceConversion.getStringValueFromResource($r('app.string.random_playback')) : - MediaTools.resourceConversion.getStringValueFromResource($r('app.string.single_playback'))}` + MediaTools.resourceConversion.getStringValueFromResource($r('app.string.single_playback'))}`; } static fetchToneQualityTitle(quality: number): string { @@ -178,7 +174,6 @@ export class MediaTools { default: break; } - return toneQualityTitle + return toneQualityTitle; } - } \ No newline at end of file diff --git a/entry/src/main/ets/common/utils/SecondBufferWalk.ets b/entry/src/main/ets/common/utils/SecondBufferWalk.ets index bff5fe6..15ac026 100644 --- a/entry/src/main/ets/common/utils/SecondBufferWalk.ets +++ b/entry/src/main/ets/common/utils/SecondBufferWalk.ets @@ -12,16 +12,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + export class Options { offset?: number; length?: number; } export class SecondBufferWalk { - private _value: number + private value: number constructor() { - this._value = 48000 * 2 * 2; + this.value = 48000 * 2 * 2; } public static getInstance(): SecondBufferWalk { @@ -34,11 +35,11 @@ export class SecondBufferWalk { } get() { - return this._value; + return this.value; } set(value: number) { - this._value = value; + this.value = value; } } diff --git a/entry/src/main/ets/common/utils/SongItemBuilder.ets b/entry/src/main/ets/common/utils/SongItemBuilder.ets index 6430f9a..eb3ac46 100644 --- a/entry/src/main/ets/common/utils/SongItemBuilder.ets +++ b/entry/src/main/ets/common/utils/SongItemBuilder.ets @@ -15,9 +15,9 @@ import { common } from '@kit.AbilityKit'; import { resourceManager } from '@kit.LocalizationKit'; -import { BusinessError } from '@kit.BasicServicesKit'; import { hilog } from '@kit.PerformanceAnalysisKit'; -import { SongItem } from '../../dataSource/SongData'; +import { SongItem } from '../../model/SongData'; +import { JSON } from '@kit.ArkTS'; const TAG = 'SongItemBuilder'; @@ -31,12 +31,13 @@ export default class SongItemBuilder { if (!this.context) { return this.songItem; } - let rawFileDescriptor = await this.context.resourceManager.getRawFd(songItem.pcmSrc) - .catch((error: BusinessError) => { - hilog.error(0x0000, TAG, `resourceManager error code ${error.code} message ${error.message}`); - }) - if (rawFileDescriptor) { - this.rawFileDescriptor = rawFileDescriptor; + try { + let rawFileDescriptor = await this.context.resourceManager.getRawFd(songItem.pcmSrc); + if (rawFileDescriptor) { + this.rawFileDescriptor = rawFileDescriptor; + } + } catch (error) { + hilog.info(0x0000, TAG, 'ResourceManager getRawFd fail:' + JSON.stringify(error)); } hilog.info(0x0000, TAG, 'MediaAssetBuilder build rawFileDescriptor:' + this.rawFileDescriptor); return this.songItem; diff --git a/entry/src/main/ets/component/ControlAreaComponent.ets b/entry/src/main/ets/component/ControlAreaComponent.ets index 0b41735..a0b016d 100644 --- a/entry/src/main/ets/component/ControlAreaComponent.ets +++ b/entry/src/main/ets/component/ControlAreaComponent.ets @@ -20,7 +20,7 @@ import { hilog } from '@kit.PerformanceAnalysisKit'; import { BreakpointConstants } from '../common/constants/BreakpointConstants'; import { BreakpointType } from '../common/utils/BreakpointSystem'; import { ResourceConversion } from '../common/utils/ResourceConversion'; -import { SongItem, MusicPlayMode, ToneQuality } from '../dataSource/SongData'; +import { SongItem, MusicPlayMode, ToneQuality } from '../model/SongData'; import { AVSessionController } from '../controller/AVSessionController'; import { AudioPlayerController } from '../controller/AudioPlayerController'; import { AudioRendererController } from '../controller/AudioRendererController'; @@ -42,9 +42,12 @@ export struct ControlAreaComponent { @StorageLink('selectIndex') selectIndex: number = 0; @StorageLink('selectToneQuality') @Watch('switchQuality') selectToneQuality: number = ToneQuality.SQ; @StorageLink('avSessionController') avSessionController ?: AVSessionController = undefined; - @StorageLink('avPlayerController') @Watch('avPlayerStateChange') avPlayerController?: AudioPlayerController = undefined; - @StorageLink('audioRendererController') @Watch('audioRendererStateChange') audioRendererController?: AudioRendererController = undefined; - @StorageLink('audioCastController') @Watch('audioCastControllerStateChange') audioCastController?: AudioCastController = undefined; + @StorageLink('avPlayerController') @Watch('avPlayerStateChange') avPlayerController?: AudioPlayerController = + undefined; + @StorageLink('audioRendererController') @Watch('audioRendererStateChange') audioRendererController?: AudioRendererController = + undefined; + @StorageLink('audioCastController') @Watch('audioCastControllerStateChange') audioCastController?: AudioCastController = + undefined; @StorageLink('isAvPlayerPlay') isAvPlayerPlay: boolean = true; @StorageLink('volumeValue') volumeValue: number = 0; @State isShowToneQualityList: boolean = false; @@ -115,7 +118,8 @@ export struct ControlAreaComponent { async avPlayerStateChange() { if (this.avPlayerController) { - this.currentTime = this.currentTime > this.avPlayerController.currentTime ? this.currentTime : this.avPlayerController.currentTime; + this.currentTime = + this.currentTime > this.avPlayerController.currentTime ? this.currentTime : this.avPlayerController.currentTime; this.durationTime = this.avPlayerController.durationTime; this.volumeValue = this.avPlayerController.volume; this.isPlay = this.avPlayerController.state === 'playing'; @@ -132,9 +136,7 @@ export struct ControlAreaComponent { this.avPlayerController?.onPositionChange(async (newPosition: number) => { this.avSessionController?.setAvSessionPosition(newPosition); }); - this.avPlayerController?.seek(this.currentTime).catch(() => { - hilog.error(0x0000, TAG, 'avPlayer seek failed.'); - }); + this.avPlayerController?.seek(this.currentTime); this.avPlayerController.setPlaying(); } if (this.avPlayerController.state === 'completed') { @@ -207,7 +209,8 @@ export struct ControlAreaComponent { * Handles playNext/playPrevious commands and state synchronization. */ async configSession() { - let controller = this.isCasting ? this.audioCastController : this.isAvPlayerPlay ? this.avPlayerController : this.audioRendererController; + let controller = this.isCasting ? this.audioCastController : + this.isAvPlayerPlay ? this.avPlayerController : this.audioRendererController; if (!this.avSessionController || !controller) { return; } @@ -302,9 +305,7 @@ export struct ControlAreaComponent { this.avPlayerController?.setPause(); } else { this.avPlayerController?.setPlaying(); - this.avPlayerController?.seek(this.currentTime).catch(() => { - hilog.error(0x0000, TAG, 'avPlayer seek failed.'); - }); + this.avPlayerController?.seek(this.currentTime); } } else { if (this.isPlay) { @@ -323,9 +324,7 @@ export struct ControlAreaComponent { this.audioCastController?.seek(value); } else { if (this.isAvPlayerPlay) { - this.avPlayerController?.seek(value).catch(() => { - hilog.error(0x0000, TAG, 'avPlayer seek failed.'); - }); + this.avPlayerController?.seek(value); } else { this.audioRendererController?.seek(value); } @@ -334,23 +333,19 @@ export struct ControlAreaComponent { async releaseAVPlayer() { if (this.avPlayerController) { - { - try { - await this.avPlayerController.releasePlayer(); - } catch (error) { - hilog.error(0x0000, TAG, 'releaseAVPlayer failed'); - } - this.avPlayerController = undefined; + try { + await this.avPlayerController.releasePlayer(); + } catch (error) { + hilog.error(0x0000, TAG, 'releaseAVPlayer failed'); } + this.avPlayerController = undefined; } } async releaseAudioRenderer() { if (this.audioRendererController) { - { - await this.audioRendererController.release(); - this.audioRendererController = undefined; - } + await this.audioRendererController.release(); + this.audioRendererController = undefined; } } @@ -385,8 +380,16 @@ export struct ControlAreaComponent { }) .height($r('app.float.slider_height')) .margin({ - left: new BreakpointType({ sm: $r('app.float.slider_margin_sm'), md: $r('app.float.slider_margin_md'), lg: $r('app.float.slider_margin_lg') }).getValue(this.currentBreakpoint), - right: new BreakpointType({ sm: $r('app.float.slider_margin_sm'), md: $r('app.float.slider_margin_md'), lg: $r('app.float.slider_margin_lg') }).getValue(this.currentBreakpoint) + left: new BreakpointType({ + sm: $r('app.float.slider_margin_sm'), + md: $r('app.float.slider_margin_md'), + lg: $r('app.float.slider_margin_lg') + }).getValue(this.currentBreakpoint), + right: new BreakpointType({ + sm: $r('app.float.slider_margin_sm'), + md: $r('app.float.slider_margin_md'), + lg: $r('app.float.slider_margin_lg') + }).getValue(this.currentBreakpoint) }) .hitTestBehavior(HitTestMode.Block) Row() { @@ -397,7 +400,7 @@ export struct ControlAreaComponent { .lineHeight('14vp') Text(MediaTools.fetchToneQualityTitle(this.selectToneQuality)) .fontSize($r('app.float.singer_title_sm')) - .fontColor("#ffd4c8c8") + .fontColor('#ffd4c8c8') .onClick(() => { this.isShowToneQualityList = true; }) @@ -422,6 +425,7 @@ export struct ControlAreaComponent { bottom: this.currentBreakpoint === BreakpointConstants.BREAKPOINT_LG ? $r('app.float.slider_margin_bottom_lg') : $r('app.float.slider_margin_bottom') }) + Row() { Image(this.playMode === MusicPlayMode.ORDER ? $r('app.media.order_play') : this.playMode === MusicPlayMode.RANDOM ? $r('app.media.shuffle') : $r('app.media.repeat_1')) diff --git a/entry/src/main/ets/component/LrcView.ets b/entry/src/main/ets/component/LrcInfoComponent.ets similarity index 97% rename from entry/src/main/ets/component/LrcView.ets rename to entry/src/main/ets/component/LrcInfoComponent.ets index 44016e0..528c58f 100644 --- a/entry/src/main/ets/component/LrcView.ets +++ b/entry/src/main/ets/component/LrcInfoComponent.ets @@ -15,9 +15,10 @@ import { AnimatorResult } from '@kit.ArkUI'; import { hilog } from '@kit.PerformanceAnalysisKit'; -import { LrcEntry } from '../dataSource/LrcEntry'; +import { LrcEntry } from '../model/LrcEntry'; import { angleToRadian } from '../common/utils/LrcUtils'; import { LyricTopPosition, LyricScrollEffect } from '../common/constants/LyricConst'; +import { MediaTools } from '../common/utils/MediaTools'; /** * Default number of rows. @@ -32,7 +33,12 @@ const STAR_ANGLE_NUMBER: number = 5; /** * No lyrics. */ -const EMPTY_LYRIC: LrcEntry = { lineStartTime: 0, lineDuration: 0, lineWords: '此歌曲为纯音乐,请您欣赏', words: [] }; +const EMPTY_LYRIC: LrcEntry = { + lineStartTime: 0, + lineDuration: 0, + lineWords: MediaTools.resourceConversion.getStringValueFromResource($r('app.string.lrc_line_words')) || '', + words: [] +}; /** * Lyrics gradient color spacing. @@ -45,24 +51,20 @@ const GRADIENT_PROGRESS_SPACE = 0.0000001; const GRADIENT_PROGRESS_MAX = 1 - GRADIENT_PROGRESS_SPACE; @Component -export default struct shiLrcView { +export default struct LrcInfoComponent { /** * Current lyric time [ms]. */ @Prop @Watch('onTimeUpdated') lyricMilliSecondsTime: number; - /** * Lyrics content. */ @Prop @Watch('onLyricUpdated') mLrcEntryList: Array = []; - /** * Lyrics scrolling effect. */ @Prop @Watch('onTimeUpdated') lyricScrollEffect: LyricScrollEffect = LyricScrollEffect.Line; - @Prop @Watch('playLyrics') isPlay: boolean = false; - private readonly mNormalTextColor = '#99ffffff'; private viewWidth: number = 360; private viewHeight: number = 500; @@ -70,12 +72,10 @@ export default struct shiLrcView { private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings); private mCurrentLine: number = NONE_LINE; private readonly TEXT_ADD_SIZE = 2; - /** * Location of the lyrics. */ public readonly lyricTopPosition: LyricTopPosition = LyricTopPosition.Top; - /** * Initial position of the first line of the lyrics. */ @@ -90,102 +90,82 @@ export default struct shiLrcView { begin: 0, end: 1 }); - /** * Text size of the lyrics, in vp. */ private mNormalTextSize: number = 20; - /** * Spacing of each line of lyrics, in vp. This spacing plays the star animation or white dot disappearing effect. */ private mDividerHeight = 24; - /** * Size of the current lyrics, in vp. */ private mCurrentTextSize: number = 24; - /** * Lyrics font. */ private fontFamily = 'HarmonyHeiTi'; - /** * The text color of the currently displayed lyrics */ private mCurrentTextColor = '#FFFFFF'; - /** * Lyrics font weight. */ private fontWeight = 'bold'; - /** * Distance between the lyrics and the left border. */ private paddingLeft = 0; - /** * Distance between the lyrics and the right border. */ private paddingRight = 0; - /** * Distance between the lyrics and the top border. */ private paddingTop = 0; - /** * Distance between lyrics and bottom border. */ private paddingBottom = 0; - /** * The width of the lyrics. */ private lrcWidth: number = 0; - /** * Height lyrics. */ private lrcHeight: number = 0; - /** * X-axis position of each line of text. */ private lrcX: number = 0; - /** * Y-axis position of each line of text. */ private lrcY: number = 0; - /** * Records the current canvas offset. */ private curCanvasOffsetY: number = 0; - /** * How many degrees is each angle of a star. */ private starAverageAngle: number = 0; - /** * The outer angle of the stars. */ private starOutCircleAngle: number = 0; - /** * The interior angles of the stars. */ private starInCircleAngle: number = 0; - /** * The path of the stars. */ private starsPath2D: Path2D = new Path2D(); - /** * Star Color */ @@ -207,7 +187,8 @@ export default struct shiLrcView { end: -desOffsetY }); let that = this; - hilog.info(0x0000, 'musicCast', '[startAnimator] curOffset:' + this.curCanvasOffsetY + ',desOffset:' + (-desOffsetY)); + hilog.info(0x0000, 'musicCast', + '[startAnimator] curOffset:' + this.curCanvasOffsetY + ',desOffset:' + (-desOffsetY)); this.animator.onFrame = (value) => { that.drawContent(value); }; @@ -300,8 +281,7 @@ export default struct shiLrcView { let lineHeight = 0; if (isCurrent) { this.context.font = this.fontWeight + ' ' + this.mCurrentTextSize + 'vp ' + this.fontFamily; - } - else { + } else { this.context.font = this.fontWeight + ' ' + this.mNormalTextSize + 'vp ' + this.fontFamily; } let textMetrics: TextMetrics = this.context.measureText(text); @@ -427,8 +407,7 @@ export default struct shiLrcView { } wordX += this.context.measureText(lyric.words[i].text).width; } - } - else { + } else { this.context.textAlign = 'center'; this.context.fillText(text, this.lrcX, this.lrcY, this.lrcWidth); } @@ -468,8 +447,7 @@ export default struct shiLrcView { this.context.fillStyle = this.progressGrad(startX_g, gradY_g, endX_g, gradY_g, progress); this.context.fillText(text, this.lrcX, this.lrcY, this.lrcWidth); - } - else { + } else { this.context.textAlign = 'center' this.context.fillText(text, this.lrcX, this.lrcY, this.lrcWidth); } @@ -510,8 +488,7 @@ export default struct shiLrcView { if (!findPlayingWordStar) { if (this.lyricMilliSecondsTime < lyric.lineStartTime) { starX = textStartX; - } - else if (this.lyricMilliSecondsTime > lyric.lineStartTime + lyric.lineDuration) { + } else if (this.lyricMilliSecondsTime > lyric.lineStartTime + lyric.lineDuration) { starX = this.lrcX + textMetrics.width / 2 - this.context.measureText(lyric.words[lyric.words.length-1].text).width / 2; } else { @@ -544,7 +521,7 @@ export default struct shiLrcView { * Draws each line of lyrics and returns the height of each line. * @param lyric * @param isCurrent - * @returns + * @returns lineHeight */ private drawLyricLine(lyric: LrcEntry, isCurrent: boolean): number { let lineHeight = 0; diff --git a/entry/src/main/ets/component/LyricsComponent.ets b/entry/src/main/ets/component/LyricsComponent.ets index da4aa50..fab7969 100644 --- a/entry/src/main/ets/component/LyricsComponent.ets +++ b/entry/src/main/ets/component/LyricsComponent.ets @@ -15,16 +15,19 @@ import { common } from '@kit.AbilityKit'; import { util } from '@kit.ArkTS'; +import { hilog } from '@kit.PerformanceAnalysisKit'; import { BreakpointType } from '../common/utils/BreakpointSystem'; import { BreakpointConstants } from '../common/constants/BreakpointConstants'; -import { LrcEntry } from '../dataSource/LrcEntry'; +import { LrcEntry } from '../model/LrcEntry'; import { parseKrcLyric, parseLrcLyric } from '../common/utils/LrcUtils'; -import LrcView from './LrcView'; +import LrcInfoComponent from './LrcInfoComponent'; import { LyricScrollEffect, LyricTopPosition } from '../common/constants/LyricConst'; import { ControlAreaComponent } from './ControlAreaComponent'; import { LyricFile } from '../common/constants/LyricConst'; import { PlayerConstants } from '../common/constants/PlayerConstants'; -import { SongItem } from '../dataSource/SongData'; +import { SongItem } from '../model/SongData'; + +const TAG = 'LyricsComponent'; @Component export struct LyricsComponent { @@ -64,7 +67,9 @@ export struct LyricsComponent { } else if (this.songList[this.selectIndex].lyric.endsWith(LyricFile.LRC)) { this.mLrcEntryList = parseLrcLyric(stringData); } - }) + }).catch(() => { + hilog.error(0x0000, TAG, 'getRawFileContent failed.'); + }) } build() { @@ -164,7 +169,7 @@ export struct LyricsComponent { bottom: $r('app.float.info_margin_bottom') }) - LrcView({ + LrcInfoComponent({ lyricMilliSecondsTime: this.currentTime, mLrcEntryList: this.mLrcEntryList, lyricScrollEffect: this.lyricScrollEffect, @@ -177,7 +182,7 @@ export struct LyricsComponent { } .layoutWeight(1) } else { - LrcView({ + LrcInfoComponent({ lyricMilliSecondsTime: this.currentTime, mLrcEntryList: this.mLrcEntryList, lyricScrollEffect: this.lyricScrollEffect, diff --git a/entry/src/main/ets/component/MusicInfoComponent.ets b/entry/src/main/ets/component/MusicInfoComponent.ets index 541d63c..6fee502 100644 --- a/entry/src/main/ets/component/MusicInfoComponent.ets +++ b/entry/src/main/ets/component/MusicInfoComponent.ets @@ -14,9 +14,8 @@ */ import { BreakpointConstants } from '../common/constants/BreakpointConstants'; -import { PlayerConstants } from '../common/constants/PlayerConstants'; import { ControlAreaComponent } from './ControlAreaComponent'; -import { SongItem } from '../dataSource/SongData'; +import { SongItem } from '../model/SongData'; @Preview @Component diff --git a/entry/src/main/ets/component/PlayerInfoComponent.ets b/entry/src/main/ets/component/PlayerInfoComponent.ets index 8b745b3..f60ba12 100644 --- a/entry/src/main/ets/component/PlayerInfoComponent.ets +++ b/entry/src/main/ets/component/PlayerInfoComponent.ets @@ -19,7 +19,7 @@ import { image } from '@kit.ImageKit'; import { common } from '@kit.AbilityKit'; import { display } from '@kit.ArkUI'; import { hilog } from '@kit.PerformanceAnalysisKit'; -import { SongItem } from '../dataSource/SongData'; +import { SongItem } from '../model/SongData'; import { ColorConversion } from '../common/utils/ColorConversion'; import { BreakpointConstants } from '../common/constants/BreakpointConstants'; import { LyricsComponent } from './LyricsComponent'; @@ -30,7 +30,7 @@ import { AVSessionController } from '../controller/AVSessionController'; import { AudioPlayerController } from '../controller/AudioPlayerController'; import { AudioCastController } from '../controller/AudioCastController'; import { AudioRendererController } from '../controller/AudioRendererController'; -import { ToneQuality, MusicPlayMode } from '../dataSource/SongData'; +import { ToneQuality, MusicPlayMode } from '../model/SongData'; const TAG = 'PlayerInfoComponent'; @@ -48,14 +48,12 @@ export struct PlayerInfoComponent { @StorageLink('avPlayerController') avPlayerController?: AudioPlayerController = undefined; @StorageLink('audioRendererController') audioRendererController?: AudioRendererController = undefined; @StorageLink('audioCastController') audioCastController?: AudioCastController = undefined; - @State imageLabel: PixelMap | Resource = this.songList[this.selectIndex].label; @State isShowControl: boolean = true; @State isShowControlLg: boolean = false; @State isTablet: boolean = true; @State isTabletFalse: boolean = false; @State intervalID: number = 0; - private context: common.UIAbilityContext | undefined = AppStorage.get('context'); private callback: Callback = (data: display.FoldDisplayMode) => { if (canIUse('SystemCapability.Window.SessionManager')) { @@ -134,7 +132,7 @@ export struct PlayerInfoComponent { if (!this.context) { return; } - this.context.resourceManager.getMediaContent(this.songList[this.selectIndex].label) + this.context.resourceManager.getMediaContent(this.songList[this.selectIndex].label.id) .then((value: Uint8Array) => { let buffer = value.buffer as ArrayBuffer; image.createImageSource(buffer).createPixelMap().then((pixelMap) => { @@ -164,7 +162,6 @@ export struct PlayerInfoComponent { }) } - build() { Stack() { Image(this.imageLabel) diff --git a/entry/src/main/ets/component/ToneQualityList.ets b/entry/src/main/ets/component/ToneQualityList.ets index ba4db63..ad9b7ee 100644 --- a/entry/src/main/ets/component/ToneQualityList.ets +++ b/entry/src/main/ets/component/ToneQualityList.ets @@ -14,7 +14,7 @@ */ import { MediaTools } from '../common/utils/MediaTools'; -import { SongItem, ToneQuality } from '../dataSource/SongData'; +import { SongItem, ToneQuality } from '../model/SongData'; @Component export default struct ToneQualityList { diff --git a/entry/src/main/ets/component/TopAreaComponent.ets b/entry/src/main/ets/component/TopAreaComponent.ets index 490f837..19981e6 100644 --- a/entry/src/main/ets/component/TopAreaComponent.ets +++ b/entry/src/main/ets/component/TopAreaComponent.ets @@ -13,11 +13,11 @@ * limitations under the License. */ -import { AVCastPicker, AVCastPickerState } from '@kit.AVSessionKit'; +import { AVCastPicker } from '@kit.AVSessionKit'; import { inputConsumer, KeyCode } from '@kit.InputKit'; import { avSession } from '@kit.AVSessionKit'; import { hilog } from '@kit.PerformanceAnalysisKit'; -import { SongItem } from '../dataSource/SongData'; +import { SongItem } from '../model/SongData'; import { BreakpointType } from '../common/utils/BreakpointSystem'; import { AudioCastController } from '../controller/AudioCastController'; diff --git a/entry/src/main/ets/controller/AVSessionController.ets b/entry/src/main/ets/controller/AVSessionController.ets index 9ceb7f6..b62225f 100644 --- a/entry/src/main/ets/controller/AVSessionController.ets +++ b/entry/src/main/ets/controller/AVSessionController.ets @@ -18,10 +18,10 @@ import { avSession } from '@kit.AVSessionKit'; import { BusinessError } from '@kit.BasicServicesKit'; import { resourceManager } from '@kit.LocalizationKit'; import { hilog } from '@kit.PerformanceAnalysisKit'; -import { SongItem } from '../dataSource/SongData'; +import { SongItem } from '../model/SongData'; import { MediaTools } from '../common/utils/MediaTools'; import { AudioPlayerController } from './AudioPlayerController'; -import { Controller } from '../dataSource/SongData'; +import { Controller } from '../model/SongData'; const TAG = 'AVSessionController'; @@ -50,7 +50,6 @@ export class AVSessionController { return avSessionController; } - public async initAVSession() { this.context = AppStorage.get('context'); if (!this.context) { diff --git a/entry/src/main/ets/controller/AudioCastController.ets b/entry/src/main/ets/controller/AudioCastController.ets index 27999d5..c7d630d 100644 --- a/entry/src/main/ets/controller/AudioCastController.ets +++ b/entry/src/main/ets/controller/AudioCastController.ets @@ -16,13 +16,13 @@ import { common } from '@kit.AbilityKit'; import { avSession } from '@kit.AVSessionKit'; import { BusinessError } from '@kit.BasicServicesKit'; -import { SongItem } from '../dataSource/SongData'; +import { SongItem } from '../model/SongData'; import { MediaTools } from '../common/utils/MediaTools'; import { hilog } from '@kit.PerformanceAnalysisKit'; import { fileIo } from '@kit.CoreFileKit'; import { media } from '@kit.MediaKit'; import { getRawStringData } from '../common/utils/LrcUtils'; -import { Controller } from '../dataSource/SongData'; +import { Controller } from '../model/SongData'; const TAG = 'AudioCastController'; diff --git a/entry/src/main/ets/controller/AudioPlayerController.ets b/entry/src/main/ets/controller/AudioPlayerController.ets index 7ab2691..aad0dff 100644 --- a/entry/src/main/ets/controller/AudioPlayerController.ets +++ b/entry/src/main/ets/controller/AudioPlayerController.ets @@ -18,7 +18,7 @@ import { BusinessError } from '@kit.BasicServicesKit'; import { common } from '@kit.AbilityKit'; import { hilog } from '@kit.PerformanceAnalysisKit'; import { fileIo as fs } from '@kit.CoreFileKit'; -import { Controller } from '../dataSource/SongData'; +import { Controller } from '../model/SongData'; const TAG = 'AudioPlayerController'; @@ -50,7 +50,7 @@ export class AudioPlayerController implements Controller { await avPlayerController.avPlayerLocal(resource); avPlayerController.setAVPlayerCallback(); }).catch(() => { - hilog.error(0x0000, TAG, 'createAVPlayer failed.'); + hilog.error(0x0000, TAG, 'createAudioPlayer failed.'); }); } @@ -74,7 +74,7 @@ export class AudioPlayerController implements Controller { hilog.info(0x0000, TAG, `AVPlayer volumeChange succeeded, seek time is ${vol}`); }) // State machine change callback function - this.avPlayer.on('stateChange', async (state: string, reason: media.StateChangeReason) => { + this.avPlayer.on('stateChange', async (state: string) => { this.stateChangeListeners.forEach(listener => listener(state, this.state)); this.state = state; switch (state) { @@ -133,14 +133,13 @@ export class AudioPlayerController implements Controller { this.avPlayer.url = fdPath; this.avPlayer.prepare(); } catch (err) { - hilog.error(0x0000, TAG, `fileIO failed Cause: code ${err.code}`); + hilog.error(0x0000, TAG, `fileIO failed Cause: error is ${JSON.stringify(err)}`); } } /** * Sets the volume level for AVPlayer. * @param volume The volume level to set. - * @throws Error if player is not in a valid state (prepared/paused/completed/playing). */ setAVPlayerVolume(volume: number) { const validStopStates = ['prepared', 'paused', 'completed', 'playing']; @@ -148,19 +147,18 @@ export class AudioPlayerController implements Controller { this.avPlayer.setVolume(volume); return; } else { - hilog.error(0x0000, TAG, `setAVPlayerVolume error,this state is ${this.state}`); + hilog.error(0x0000, TAG, `setAudioPlayer Volume error,this state is ${this.state}`); } } /** * Seeks to specified position in current media. * @param timeMs Target position in milliseconds. - * @throws Error if player is not in seekable state. */ async seek(timeMs: number) { const validSeekStates = ['prepared', 'playing', 'paused', 'completed']; if (!validSeekStates.includes(this.state)) { - hilog.error(0x0000, TAG, `avPlayerSeek error,this state is ${this.state} time is ${timeMs}`); + hilog.error(0x0000, TAG, `setAudioPlayer Seek error,this state is ${this.state} time is ${timeMs}`); return; } this.avPlayer.seek(timeMs); @@ -173,7 +171,7 @@ export class AudioPlayerController implements Controller { await this.avPlayer.play(); return; } else { - hilog.error(0x0000, TAG, `setAVPlayerPlaying error,this state is ${this.state}`); + hilog.error(0x0000, TAG, `setAudioPlayer Playing error,this state is ${this.state}`); } } @@ -190,7 +188,7 @@ export class AudioPlayerController implements Controller { await this.avPlayer.stop(); return; } else { - hilog.error(0x0000, TAG, `setAVPlayerStop error,this state is ${this.state}`); + hilog.error(0x0000, TAG, `setAudioPlayer Stop error,this state is ${this.state}`); } } @@ -224,7 +222,11 @@ export class AudioPlayerController implements Controller { */ async releasePlayer() { if (this.fd) { - fs.closeSync(this.fd); + try { + fs.closeSync(this.fd); + } catch (error) { + hilog.error(0x0000, TAG, `closeSync fail, the error is:${JSON.stringify(error)}`); + } this.fd = undefined; } this.avPlayer.off('timeUpdate'); diff --git a/entry/src/main/ets/controller/AudioRendererController.ets b/entry/src/main/ets/controller/AudioRendererController.ets index dd92d56..81698c2 100644 --- a/entry/src/main/ets/controller/AudioRendererController.ets +++ b/entry/src/main/ets/controller/AudioRendererController.ets @@ -14,18 +14,17 @@ */ import { common } from '@kit.AbilityKit'; -import { BusinessError } from '@kit.BasicServicesKit'; import { resourceManager } from '@kit.LocalizationKit'; import { audio } from '@kit.AudioKit'; import { fileIo } from '@kit.CoreFileKit'; import { hilog } from '@kit.PerformanceAnalysisKit'; import { AVSessionController } from './AVSessionController'; import { BackgroundUtil } from '../common/utils/BackgroundUtil'; -import { SongItem, MusicPlayMode } from '../dataSource/SongData'; +import { SongItem, MusicPlayMode } from '../model/SongData'; import SongItemBuilder from '../common/utils/SongItemBuilder'; import { MediaTools } from '../common/utils/MediaTools'; import { Options, SecondBufferWalk } from '../common/utils/SecondBufferWalk'; -import { Controller } from '../dataSource/SongData'; +import { Controller } from '../model/SongData'; const TAG = 'AudioRendererController'; @@ -77,13 +76,14 @@ export class AudioRendererController implements Controller { }, rendererInfo: audioRendererInfo }; - await audio.createAudioRenderer(audioRendererOptions).then((data) => { + try { + let data = await audio.createAudioRenderer(audioRendererOptions); hilog.info(0x0000, TAG, 'Invoke createAudioRenderer succeeded.'); this.audioRenderer = data; this.state = audio.AudioState.STATE_PREPARED; - }).catch((err: BusinessError) => { - hilog.error(0x0000, TAG, `Invoke createAudioRenderer failed, code is ${err.code}, message is ${err.message}`); - }); + } catch (error) { + hilog.error(0x0000, TAG, `Invoke createAudioRenderer failed, error is ${JSON.stringify(error)}`); + } } public setAudioRendererCallbacks() { @@ -135,27 +135,32 @@ export class AudioRendererController implements Controller { offset: this.currentOffset, length: buffer.byteLength }; - fileIo.readSync(this.songRawFileDescriptor.fd, buffer, options); - this.currentOffset += buffer.byteLength; - this.bufferRead = this.currentOffset - this.initOffset; - bufferWalk += buffer.byteLength; - hilog.info(0x0000, TAG, 'buffer.byteLength+bufferWalk+bufferRead: ' + buffer.byteLength +'%'+ bufferWalk + '%' + this.bufferRead); - hilog.info(0x0000, TAG, - `songRawFileDescriptor get successed` + 'bufferRead is ' + this.bufferRead + '///' + 'bufferNeedRead is ' + - this.bufferNeedRead); - if (this.bufferRead <= this.bufferNeedRead) { - if (bufferWalk >= secondBufferWalk) { - let curMs = MediaTools.getMsFromByteLength(this.bufferRead); - this.seek(curMs); + try { + fileIo.readSync(this.songRawFileDescriptor.fd, buffer, options); + this.currentOffset += buffer.byteLength; + this.bufferRead = this.currentOffset - this.initOffset; + bufferWalk += buffer.byteLength; + hilog.info(0x0000, TAG, 'buffer.byteLength+bufferWalk+bufferRead: ' + buffer.byteLength +'%'+ bufferWalk + '%' + this.bufferRead); + hilog.info(0x0000, TAG, + `songRawFileDescriptor get successed` + 'bufferRead is ' + this.bufferRead + '///' + 'bufferNeedRead is ' + + this.bufferNeedRead); + if (this.bufferRead <= this.bufferNeedRead) { + if (bufferWalk >= secondBufferWalk) { + let curMs = MediaTools.getMsFromByteLength(this.bufferRead); + this.seek(curMs); + bufferWalk = 0; + } + } else { bufferWalk = 0; + let curMs = MediaTools.getMsFromByteLength(this.songRawFileDescriptor.length); + hilog.info(0x0000, TAG, 'setWriteDataCallback CurMs is ' + curMs); + this.seek(curMs); + this.setPlayNext(); } - } else { - bufferWalk = 0; - let curMs = MediaTools.getMsFromByteLength(this.songRawFileDescriptor.length); - hilog.info(0x0000, TAG, 'setWriteDataCallback CurMs is ' + curMs); - this.seek(curMs); - this.setPlayNext(); + } catch (error) { + hilog.error(0x0000, TAG, `fileIO readSync fail the error is:${JSON.stringify(error)}`); } + hilog.info(0x0000, TAG, 'writeData is calling. '); }) } @@ -252,8 +257,8 @@ export class AudioRendererController implements Controller { this.updateIsPlay(true); BackgroundUtil.startContinuousTask(this.context); hilog.info(0x0000, TAG, 'start success'); - } catch (e) { - hilog.error(0x0000, TAG, `start failed,audioRenderer is undefined`); + } catch (error) { + hilog.error(0x0000, TAG, `start failed,audioRenderer is undefined,the error is:${JSON.stringify(error)}`); } } } @@ -261,13 +266,11 @@ export class AudioRendererController implements Controller { public async setPause() { if (this.audioRenderer) { try { - await this.audioRenderer.pause().catch((err: BusinessError) => { - hilog.error(0x0000, TAG, `pause failed,code is ${err.code},message is ${err.message}}`); - }); + await this.audioRenderer.pause(); this.updateIsPlay(false); hilog.info(0x0000, TAG, 'pause success'); - } catch (e) { - hilog.error(0x0000, TAG, `pause failed,audioRenderer is undefined`); + } catch (error) { + hilog.error(0x0000, TAG, `pause failed,audioRenderer is undefined,the error is:${JSON.stringify(error)}`); } } } @@ -323,9 +326,7 @@ export class AudioRendererController implements Controller { public async setStop() { if (this.audioRenderer) { try { - await this.audioRenderer.stop().catch((err: BusinessError) => { - hilog.error(0x0000, TAG, `stop failed,code is ${err.code},message is ${err.message}}`); - }) + await this.audioRenderer.stop(); this.curMs = 0; this.updateIsPlay(false); this.audioRenderer.flush(); @@ -339,9 +340,7 @@ export class AudioRendererController implements Controller { public async release() { if (this.audioRenderer && this.context) { try { - await this.audioRenderer.release().catch((err: BusinessError) => { - hilog.error(0x0000, TAG, `release failed,code is ${err.code},message is ${err.message}}`); - }) + await this.audioRenderer.release(); this.unregisterAudioRendererListener(); BackgroundUtil.stopContinuousTask(this.context); AppStorage.setOrCreate('audioRendererController', undefined); diff --git a/entry/src/main/ets/entryability/EntryAbility.ets b/entry/src/main/ets/entryability/EntryAbility.ets index eed2beb..3a9758e 100644 --- a/entry/src/main/ets/entryability/EntryAbility.ets +++ b/entry/src/main/ets/entryability/EntryAbility.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit'; +import { ConfigurationConstant, UIAbility } from '@kit.AbilityKit'; import { hilog } from '@kit.PerformanceAnalysisKit'; import { display, window } from '@kit.ArkUI'; import { fileIo } from '@kit.CoreFileKit'; @@ -25,8 +25,8 @@ const TAG = 'EntryAbility'; export default class EntryAbility extends UIAbility { private windowObj?: window.Window; - async onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): Promise { - AppStorage.setOrCreate("context", this.context) + async onCreate(): Promise { + AppStorage.setOrCreate('context', this.context); try { this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET); } catch (err) { @@ -69,7 +69,7 @@ export default class EntryAbility extends UIAbility { data.setWindowLayoutFullScreen(true); let topArea = this.windowObj.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM) const uiContext = data.getUIContext(); - AppStorage.setOrCreate("uiContext", uiContext); + AppStorage.setOrCreate('uiContext', uiContext); let topHeight = uiContext.px2vp(topArea.topRect.height) AppStorage.setOrCreate('topHeight', topHeight) let bottomArea = this.windowObj.getWindowAvoidArea(window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR) @@ -97,7 +97,7 @@ export default class EntryAbility extends UIAbility { } AppStorage.setOrCreate('currentBreakpoint', curBp); } catch (err) { - hilog.info(DOMAIN, TAG, 'getDefaultDisplaySync failed.'); + hilog.error(DOMAIN, TAG, `getDefaultDisplaySync failed.error is ${JSON.stringify(err)}`); } } diff --git a/entry/src/main/ets/dataSource/LrcEntry.ets b/entry/src/main/ets/model/LrcEntry.ets similarity index 100% rename from entry/src/main/ets/dataSource/LrcEntry.ets rename to entry/src/main/ets/model/LrcEntry.ets diff --git a/entry/src/main/ets/dataSource/SongData.ets b/entry/src/main/ets/model/SongData.ets similarity index 97% rename from entry/src/main/ets/dataSource/SongData.ets rename to entry/src/main/ets/model/SongData.ets index bb9592e..e1d1b2a 100644 --- a/entry/src/main/ets/dataSource/SongData.ets +++ b/entry/src/main/ets/model/SongData.ets @@ -13,8 +13,6 @@ * limitations under the License. */ -import { audio } from "@kit.AudioKit"; - /** * Music information entity class. */ diff --git a/entry/src/main/ets/dataSource/SongDataSource.ets b/entry/src/main/ets/model/SongDataSource.ets similarity index 100% rename from entry/src/main/ets/dataSource/SongDataSource.ets rename to entry/src/main/ets/model/SongDataSource.ets diff --git a/entry/src/main/ets/dataSource/SongListData.ets b/entry/src/main/ets/model/SongListData.ets similarity index 89% rename from entry/src/main/ets/dataSource/SongListData.ets rename to entry/src/main/ets/model/SongListData.ets index c163949..2a8dbee 100644 --- a/entry/src/main/ets/dataSource/SongListData.ets +++ b/entry/src/main/ets/model/SongListData.ets @@ -19,9 +19,9 @@ const songList: SongItem[] = [ { title: 'Dream It Possible', singer: 'Delacey', - label: $r("app.media.image_cover1"), + label: $r('app.media.image_cover1'), src: 'Delacey - Dream It Possible.flac', - pcmSrc: "Delacey - Dream It Possible.pcm", + pcmSrc: 'Delacey - Dream It Possible.pcm', lyric: 'lrcfiles/DreamItPossible.lrc', albumCoverUri: 'https://www-file.huawei.com/admin/asset/v1/pro/view/23eb4b8c0571484fb9bce7889aed4413.jpg', toneQualityList: [ToneQuality.SQ, ToneQuality.SPATIAL_AUDIO, ToneQuality.MASTER] @@ -29,9 +29,9 @@ const songList: SongItem[] = [ { title: 'Boisterous', singer: 'Jack', - label: $r("app.media.image_cover2"), + label: $r('app.media.image_cover2'), src: 'boisterous.wav', - pcmSrc: "boisterous.pcm", + pcmSrc: 'boisterous.pcm', lyric: '', albumCoverUri: 'https://www-file.huawei.com/admin/asset/v1/pro/view/9240a42357da4644834897262b183b8d.jpg', toneQualityList: [ToneQuality.SQ, ToneQuality.SPATIAL_AUDIO, ToneQuality.MASTER] diff --git a/entry/src/main/ets/pages/Index.ets b/entry/src/main/ets/pages/Index.ets index 6f25c25..f1f0348 100644 --- a/entry/src/main/ets/pages/Index.ets +++ b/entry/src/main/ets/pages/Index.ets @@ -13,10 +13,10 @@ * limitations under the License. */ -import { SongItem } from '../dataSource/SongData'; -import { SongDataSource } from '../dataSource/SongDataSource'; +import { SongItem } from '../model/SongData'; +import { SongDataSource } from '../model/SongDataSource'; import { MusicPlayPage } from './MusicPlayPage'; -import { songList } from "../dataSource/SongListData"; +import { songList } from '../model/SongListData'; import { RouterConstants } from '../common/constants/RouterConstants'; @Entry @@ -103,7 +103,7 @@ struct MusicItem { .lineHeight(22) Text(this.item.singer) .fontSize(14) - .fontColor('#99000000') + .fontColor($r('sys.color.mask_secondary')) .lineHeight(22) } .alignItems(HorizontalAlign.Start) diff --git a/entry/src/main/ets/pages/MusicPlayPage.ets b/entry/src/main/ets/pages/MusicPlayPage.ets index ce432c3..f474783 100644 --- a/entry/src/main/ets/pages/MusicPlayPage.ets +++ b/entry/src/main/ets/pages/MusicPlayPage.ets @@ -13,10 +13,10 @@ * limitations under the License. */ -import { RouterConstants } from "../common/constants/RouterConstants"; -import { PlayerInfoComponent } from "../component/PlayerInfoComponent"; -import { BreakpointSystem } from "../common/utils/BreakpointSystem"; -import { BreakpointConstants } from "../common/constants/BreakpointConstants"; +import { RouterConstants } from '../common/constants/RouterConstants'; +import { PlayerInfoComponent } from '../component/PlayerInfoComponent'; +import { BreakpointSystem } from '../common/utils/BreakpointSystem'; +import { BreakpointConstants } from '../common/constants/BreakpointConstants'; @Component export struct MusicPlayPage { diff --git a/entry/src/main/module.json5 b/entry/src/main/module.json5 index 5d41219..1426e63 100644 --- a/entry/src/main/module.json5 +++ b/entry/src/main/module.json5 @@ -6,8 +6,7 @@ "mainElement": "EntryAbility", "deviceTypes": [ "phone", - "tablet", - "2in1" + "tablet" ], "deliveryWithInstall": true, "installationFree": false, @@ -49,16 +48,6 @@ } ], "requestPermissions": [ - { - "name": "ohos.permission.MICROPHONE", - "reason": "$string:module_desc", - "usedScene": { - "abilities": [ - "EntryAbility" - ], - "when": "always" - } - }, { "name": "ohos.permission.KEEP_BACKGROUND_RUNNING", "reason": "$string:reason_background", diff --git a/entry/src/main/resources/base/element/string.json b/entry/src/main/resources/base/element/string.json index f139712..c21bf91 100644 --- a/entry/src/main/resources/base/element/string.json +++ b/entry/src/main/resources/base/element/string.json @@ -6,7 +6,7 @@ }, { "name": "internet_reason", - "value": "View Web video" + "value": "View Web Picture" }, { "name": "shared_desc", @@ -66,7 +66,7 @@ }, { "name": "EntryAbility_label", - "value": "Music Cast Sample" + "value": "Audio Cast" }, { "name": "EntryFormAbility_desc", @@ -111,6 +111,10 @@ { "name": "ultra_hd_master_tape", "value": "Ultra HD Master Tape" + }, + { + "name": "lrc_line_words", + "value": "This piece is instrumental music. Please enjoy." } ] } \ No newline at end of file diff --git a/entry/src/main/resources/en_US/element/string.json b/entry/src/main/resources/en_US/element/string.json index a860e54..d003e26 100644 --- a/entry/src/main/resources/en_US/element/string.json +++ b/entry/src/main/resources/en_US/element/string.json @@ -103,6 +103,10 @@ { "name": "ultra_hd_master_tape", "value": "Ultra HD Master Tape" + }, + { + "name": "lrc_line_words", + "value": "This piece is instrumental music. Please enjoy." } ] } \ No newline at end of file diff --git a/entry/src/main/resources/zh_CN/element/string.json b/entry/src/main/resources/zh_CN/element/string.json index 881563c..7432e52 100644 --- a/entry/src/main/resources/zh_CN/element/string.json +++ b/entry/src/main/resources/zh_CN/element/string.json @@ -103,6 +103,10 @@ { "name": "ultra_hd_master_tape", "value": "超清母带" + }, + { + "name": "lrc_line_words", + "value": "此歌曲为纯音乐,请您欣赏" } ] } diff --git a/oh-package-lock.json5 b/oh-package-lock.json5 index c2f6d1b..2857b55 100644 --- a/oh-package-lock.json5 +++ b/oh-package-lock.json5 @@ -5,24 +5,6 @@ }, "lockfileVersion": 3, "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.", - "specifiers": { - "@ohos/hamock@1.0.0": "@ohos/hamock@1.0.0", - "@ohos/hypium@1.0.21": "@ohos/hypium@1.0.21" - }, - "packages": { - "@ohos/hamock@1.0.0": { - "name": "@ohos/hamock", - "version": "1.0.0", - "integrity": "sha512-K6lDPYc6VkKe6ZBNQa9aoG+ZZMiwqfcR/7yAVFSUGIuOAhPvCJAo9+t1fZnpe0dBRBPxj2bxPPbKh69VuyAtDg==", - "resolved": "https://ohpm.openharmony.cn/ohpm/@ohos/hamock/-/hamock-1.0.0.har", - "registryType": "ohpm" - }, - "@ohos/hypium@1.0.21": { - "name": "@ohos/hypium", - "version": "1.0.21", - "integrity": "sha512-iyKGMXxE+9PpCkqEwu0VykN/7hNpb+QOeIuHwkmZnxOpI+dFZt6yhPB7k89EgV1MiSK/ieV/hMjr5Z2mWwRfMQ==", - "resolved": "https://ohpm.openharmony.cn/ohpm/@ohos/hypium/-/hypium-1.0.21.har", - "registryType": "ohpm" - } - } + "specifiers": {}, + "packages": {} } \ No newline at end of file diff --git a/oh-package.json5 b/oh-package.json5 index d5b3f0c..96463c3 100644 --- a/oh-package.json5 +++ b/oh-package.json5 @@ -3,8 +3,5 @@ "description": "Please describe the basic information.", "dependencies": { }, - "devDependencies": { - "@ohos/hypium": "1.0.21", - "@ohos/hamock": "1.0.0" - } + "devDependencies": {} } diff --git a/screenshots/page1.png b/screenshots/device/page1.png similarity index 100% rename from screenshots/page1.png rename to screenshots/device/page1.png diff --git a/screenshots/page2.png b/screenshots/device/page2.png similarity index 100% rename from screenshots/page2.png rename to screenshots/device/page2.png diff --git a/screenshots/page3.png b/screenshots/device/page3.png similarity index 100% rename from screenshots/page3.png rename to screenshots/device/page3.png -- Gitee