当前位置: 首页 > news >正文

琼海网站建设长治建立公司网站的步骤

琼海网站建设,长治建立公司网站的步骤,asp网站建设 iis配置,wordpress耗资源升级程序播放控制服务 IMusicControlService: 播放控制类#xff0c;用于当前平台播放器对象的操作#xff0c;对当前所播放曲目的暂停/播放#xff0c;下一首/上一首#xff0c;快进快退#xff08;寻迹#xff09;#xff0c;随机、单曲模式等功能的控制。 播放控制类包含一…播放控制服务 IMusicControlService: 播放控制类用于当前平台播放器对象的操作对当前所播放曲目的暂停/播放下一首/上一首快进快退寻迹随机、单曲模式等功能的控制。 播放控制类包含一个平台特定的播放器由于要制作通用的播放控制类IMusicControlService不开放播放器对象的公共访问而是通过暴露方法操作播放器对象。 在跨平台中的实现 Android平台使用Android.Media.MediaPlayer类iOS平台使用AVFoundation.AVAudioPlayer类Windows平台使用Windows.Media.Playback.MediaPlayer类 虽然不同平台的播放器类都提供了诸如播放暂停寻迹的功能但不同平台存在着微小差别。 比如停止功能 - Stop 在iOS中的实现 public partial void Stop() {if (!IsInitFinished()) { return; }if (CurrentIosPlayer.Playing){CurrentIosPlayer.Stop();OnPlayStatusChanged?.Invoke(this, false);} }在Android中由于Android.Media.MediaPlayer没有提供Stop方法所以停止的逻辑用寻迹至0位置暂停实现的 public partial void Stop() {if (CurrentAndroidPlayer.IsPlaying){CurrentAndroidPlayer.SeekTo(0);CurrentAndroidPlayer.Pause();} }又如寻迹功能 - SeekTo 在iOS中的实现postion参数为曲目开始后的时间值单位秒。改变播放位置是通过直接赋值AVFoundation.AVAudioPlayer.CurrentTime实现的 public partial void SeekTo(double position){if (!IsInitFinished()) { return; }CurrentIosPlayer.CurrentTime position; }在Android中Android.Media.MediaPlayer提供了SeekTo方法传入值是毫秒因此要做一下转换 public partial void SeekTo(double position) {CurrentAndroidPlayer.SeekTo((int)position * 1000);}在传统播放器随机播放时如果下一曲不是我想听的我仍然想听上一曲由于上一曲按钮是随机触发的时机你可能找不到它了不得不再音乐列表再搜索它。这可能是个遗憾 我在这个随机模型中引入随机播放映射表使得在随机模式中上一曲/下一曲仍然能发挥其作用。 刷新随机列表 increment为跳转步数例如increment 1时相当于下一曲increment -1 时相当于上一曲 private partial int GetShuffleMusicIndex(int originItem, int increment) {var originItemIndex 0;foreach (var item in ShuffleMap){if (originItem item){break;}originItemIndex;}var newItemIndex originItemIndex increment;if (newItemIndex 0){newItemIndex LastIndex;}if (newItemIndex LastIndex){newItemIndex 0;}var shuffleMapCount shuffleMap.Count();var musicInfosCount MusicInfos.Count();if (shuffleMapCount ! musicInfosCount){shuffleMap CommonHelper.GetRandomArry(0, LastIndex);shuffleMapCount shuffleMap.Count();}if (shuffleMapCount 0 newItemIndex shuffleMapCount){var resultContent ShuffleMap[newItemIndex];return resultContent;}else{return -1;} } GetRandomArry 方法将产生一个指定最小值到最大值连续数列的随机数组 public static int[] GetRandomArry(int minval, int maxval) {int[] arr new int[maxval - minval 1];int i;//初始化数组for (i 0; i maxval - minval; i){arr[i] i minval;}//随机数Random r new Random();for (int j maxval - minval; j 1; j--){int address r.Next(0, j);int tmp arr[address];arr[address] arr[j];arr[j] tmp;}//输出foreach (int k in arr){Debug.WriteLine(k );}return arr; } 关键属性 ShuffleMap - 随机播放映射表MusicInfos - 播放器音频列表LastIndex - 当前播放曲目位于器音频列表位置角标 关键方法 Play - 播放PauseOrResume - 暂停/恢复RebuildMusicInfos - 从播放列队中读取音频列表刷新播放器队列SeekTo - 快进快退寻迹GetNextMusic - 获取下一首曲目信息GetPreMusic - 获取上一首曲目信息InitPlayer - 初始化播放器UpdateShuffleMap - 更新随机播放映射表SetRepeatOneStatus - 设置是否单曲循环Duration - 获取当前曲目时长CurrentTime - 获取当前曲目播放进度IsPlaying - 获取是否在播放中IsInitFinished - 获取是否完成播放器初始化 关键事件 OnPlayFinished - 完成当前曲目播放时触发OnRebuildMusicInfosFinished - 完成刷新播放器队列触发OnProgressChanged - 播放进度更改时触发OnPlayStatusChanged - 播放状态变更时触发 接口定义 public interface IMusicControlService {event EventHandlerbool OnPlayFinished;event EventHandler OnRebuildMusicInfosFinished;event EventHandlerdouble OnProgressChanged;event EventHandlerbool OnPlayStatusChanged;public IMusicInfoManager MusicInfoManager { get; set; }int[] ShuffleMap { get; }ListMusicInfo MusicInfos { get; }int LastIndex { get; }Task RebuildMusicInfos(Action callback);void SeekTo(double position);MusicInfo GetNextMusic(MusicInfo current, bool isShuffle);MusicInfo GetPreMusic(MusicInfo current, bool isShuffle);int GetMusicIndex(MusicInfo musicInfo);MusicInfo GetMusicByIndex(int index);Task InitPlayer(MusicInfo musicInfo);void Play(MusicInfo currentMusic);void Stop();void PauseOrResume();void PauseOrResume(bool status);Task UpdateShuffleMap();void SetRepeatOneStatus(bool isRepeatOne);double Duration();double CurrentTime();bool IsPlaying();bool IsInitFinished(); }曲目管理器设计 IMusicInfoManager: 曲目管理类用于歌曲队列歌单的编辑各曲目集合增加删除等功能 歌曲队列歌单等信息存在于本地数据库曲目管理类将对这些数据增、删、查、改的操作Abp框架实现的仓储模式为我们生成了Repository对象。 在MusicInfoManager构造函数中注入各仓储依赖 public MusicInfoManager(IRepositoryQueue, long queueRepository,IRepositoryPlaylistItem, long playlistItemRepository,IRepositoryPlaylist, long playlistRepository,IUnitOfWorkManager unitOfWorkManager) {... }读取播放队列 播放队列具有一定的代表性歌单的逻辑与播放队列类似所以本篇博文着重讲述播放队列的业务 播放队列存在于本地数据库的Queue表中全部将他们读取。 播放队列的Entry项和设备中的媒体条目是一种弱关联需要将他们“螯合”起来连表左联查询后取得MusicInfo集合。 [UnitOfWork] public async TaskListMusicInfo GetQueueEntry() {var queueEntrys await queueRepository.GetAll().ToListAsync();if (_musicInfos null || _musicInfos.Count 0){var isSucc await GetMusicInfos();if (!isSucc.IsSucess){//CommonHelper.ShowNoAuthorized();}_musicInfos isSucc.Result;}var result from queue in queueEntrysjoin musicInfo in _musicInfoson queue.MusicInfoId equals musicInfo.Idorderby queue.Rankselect musicInfo;return result.ToList(); } 返回时依据Rank字段递增排序。 添加播放队列 播放整个专辑时将整个专辑中的所有曲目添加到播放队列 QueueAllAction在点击播放专辑时触发首先清空当前播放队列接着将当前页面绑定的曲目集合Musics对象插入到播放队列 private async void QueueAllAction(object obj) {await MusicInfoManager.ClearQueue();var result await MusicInfoManager.CreateQueueEntrys(Musics);.. }MusicInfoManager.cs 中定义了清空播放队列ClearQueue和歌单中创建曲目集合方法CreateQueueEntrys [UnitOfWork] public async Task ClearQueue() {await queueRepository.DeleteAsync(c true);}[UnitOfWork] public async Taskbool CreateQueueEntrys(ListMusicInfo musicInfos) {var lastItemRank queueRepository.GetAll().OrderBy(c c.Rank).Select(c c.Rank).LastOrDefault();var entrys new ListQueue();foreach (var music in musicInfos){var entry new Queue(music.Title, lastItemRank, music.Id);lastItemRank;entrys.Add(entry);}await queueRepository.GetDbContext().AddRangeAsync(entrys);return true; }需要注意的是Rank字段将在队列最后一条后继续递增 曲目排序 曲目排序原理是通过交换位置实现的iOS和Android平台都有自己的可排序列表控件在对选中的条目进行排序往往是提起条目-拖拽-释放的过程中触发事件往往提供当前条目oldMusicInfo和排斥条目newMusicInfo调用ReorderQueue时将这辆个参数传入将这两个MusicInfo的Rank值交换 [UnitOfWork] public void ReorderQueue(MusicInfo oldMusicInfo, MusicInfo newMusicInfo) {var oldMusic queueRepository.FirstOrDefault(c c.MusicTitleoldMusicInfo.Title);var newMusic queueRepository.FirstOrDefault(c c.MusicTitlenewMusicInfo.Title);if (oldMusic null || newMusicnull){return;}var oldRank oldMusic.Rank;oldMusic.RanknewMusic.Rank;newMusic.RankoldRank;queueRepository.Update(oldMusic);queueRepository.Update(newMusic); }下一首播放 下一首播放将播放队列中指定的曲目排在当前播放曲目之后实现方式是线确保目标曲目存在于播放队列。同样用到了排序逻辑再将他的排序Rank值与当前播放曲目之后的做交换。 public partial async Taskbool InsertToEndQueueEntry(MusicInfo musicInfo) {var result false;var isSuccessCreate false;//如果没有则先创建if (!await GetIsQueueContains(musicInfo.Title)){isSuccessCreate await CreateQueueEntry(musicInfo);await unitOfWorkManager.Current.SaveChangesAsync();}else{isSuccessCreate true;}//确定包含后与下一曲交换位置if (isSuccessCreate){var current currentMusic;Queue newMusic null;var lastItem await queueRepository.FirstOrDefaultAsync(c c.MusicTitlecurrent.Title);if (lastItem!null){newMusic await queueRepository.FirstOrDefaultAsync(c c.RanklastItem.Rank1);}var oldMusic await queueRepository.FirstOrDefaultAsync(c c.MusicTitlemusicInfo.Title);if (oldMusic null || newMusicnull){return true;}var oldRank oldMusic.Rank;oldMusic.RanknewMusic.Rank;newMusic.RankoldRank;queueRepository.Update(oldMusic);queueRepository.Update(newMusic);result true;}else{result false;}return result; } 其它关键方法 ClearQueue - 从播放队列中清除所有曲目CreatePlaylist - 创建歌单CreatePlaylistEntry - 歌单中创建曲目CreatePlaylistEntrys - 歌单中创建曲目集合CreatePlaylistEntrysToMyFavourite - “我最喜爱”中插入曲目集合CreateQueueEntry - 播放队列中创建曲目CreateQueueEntrys - 播放队列中创建曲目集合DeleteMusicInfoFormQueueEntry - 从队列中删除指定曲目DeletePlaylist - 删除歌单DeletePlaylistEntry - 从歌单中删除曲目DeletePlaylistEntryFromMyFavourite - 从“我最喜爱”中删除曲目GetMusicInfos - 获取曲目集合GetAlbumInfos - 获取专辑集合GetArtistInfos - 获取艺术家集合GetAlphaGroupedMusicInfo - 获取分组包装好的曲目集合GetAlphaGroupedAlbumInfo - 获取分组包装好的专辑集合GetAlphaGroupedArtistInfo - 获取分组包装好的艺术家集合GetIsMyFavouriteContains - 曲目是否包含在我最喜爱中GetIsPlaylistContains - 曲目是否包含在歌单中GetIsQueueContains - 曲目是否包含在播放队列中GetPlaylist - 获取歌单列表GetPlaylistEntry - 获取歌单列表GetPlaylistInfo - 获取歌单中的曲目GetQueueEntry - 获取播放队列中的曲目InsertToEndQueueEntry - 插入曲目到播放队列中的末尾InsertToEndQueueEntrys - 插入曲目集合到播放队列中的末尾InsertToNextQueueEntry - 插入曲目到队列中的下一曲下一首播放UpdatePlaylist - 更新歌单信息 接口定义 public interface IMusicInfoManager {Task ClearQueue();Taskbool CreatePlaylist(Playlist playlist);Taskbool CreatePlaylistEntry(MusicInfo musicInfo, long playlistId);Taskbool CreatePlaylistEntrys(ListMusicInfo musics, long playlistId);Taskbool CreatePlaylistEntrys(MusicCollectionInfo musicCollectionInfo, long playlistId);Taskbool CreatePlaylistEntrysToMyFavourite(ListMusicInfo musics);Taskbool CreatePlaylistEntrysToMyFavourite(MusicCollectionInfo musicCollectionInfo);Taskbool CreatePlaylistEntryToMyFavourite(MusicInfo musicInfo);Taskbool CreateQueueEntry(MusicInfo musicInfo);Taskbool CreateQueueEntrys(ListMusicInfo musicInfos);Taskbool CreateQueueEntrys(MusicCollectionInfo musics);Taskbool DeleteMusicInfoFormQueueEntry(MusicInfo musicInfo);Taskbool DeleteMusicInfoFormQueueEntry(string musicTitle);Taskbool DeletePlaylist(long playlistId);Taskbool DeletePlaylist(Playlist playlist);Taskbool DeletePlaylistEntry(MusicInfo musicInfo, long playlistId);Taskbool DeletePlaylistEntry(string musicTitle, long playlistId);Taskbool DeletePlaylistEntryFromMyFavourite(MusicInfo musicInfo);TaskInfoResultListAlbumInfo GetAlbumInfos();TaskAlphaGroupedObservableCollectionAlbumInfo GetAlphaGroupedAlbumInfo();TaskAlphaGroupedObservableCollectionArtistInfo GetAlphaGroupedArtistInfo();TaskAlphaGroupedObservableCollectionMusicInfo GetAlphaGroupedMusicInfo();TaskInfoResultListArtistInfo GetArtistInfos();Taskbool GetIsMyFavouriteContains(MusicInfo musicInfo);Taskbool GetIsMyFavouriteContains(string musicTitle);Taskbool GetIsPlaylistContains(MusicInfo musicInfo, long playlistId);Taskbool GetIsPlaylistContains(string musicTitle, long playlistId);Taskbool GetIsQueueContains(string musicTitle);TaskInfoResultListMusicInfo GetMusicInfos();TaskListPlaylist GetPlaylist();TaskListMusicInfo GetPlaylistEntry(long playlistId);TaskListMusicInfo GetPlaylistEntryFormMyFavourite();TaskListPlaylistInfo GetPlaylistInfo();TaskListMusicInfo GetQueueEntry();Taskbool InsertToEndQueueEntry(MusicInfo musicInfo);Taskbool InsertToEndQueueEntrys(ListMusicInfo musicInfos);Taskbool InsertToNextQueueEntry(MusicInfo musicInfo, MusicInfo currentMusic);Taskbool UpdatePlaylist(Playlist playlist); } 获取本地音乐 Android中的实现 在Android平台中MatoMusic.Core\Platforms\Android\MusicInfoManager.cs MediaStore类是Android平台的多媒体数据库它包含了音频视频图片等所有多媒体文件信息。 Android扫描服务会在后台自动扫描设备文件资源将设备上的音乐媒体信息加入到MediaStore数据库中。应用程序通过Android平台提供的ContentProvider包含的API直接从MediaStore中读取相应的媒体信息。 获取设备多媒体信息的实现方式如下 public IListMusicInfo GetAllSongs() {IListMusicInfo songs new ObservableCollectionMusicInfo();ICursor mediaCursor, genreCursor, albumCursor;mediaCursor Application.Context.ContentResolver.Query(MediaStore.Audio.Media.ExternalContentUri,_mediaProjections, null, null,MediaStore.Audio.Media.InterfaceConsts.TitleKey);int artistColumn mediaCursor.GetColumnIndex(MediaStore.Audio.Media.InterfaceConsts.Artist);int albumColumn mediaCursor.GetColumnIndex(MediaStore.Audio.Media.InterfaceConsts.Album);int titleColumn mediaCursor.GetColumnIndex(MediaStore.Audio.Media.InterfaceConsts.Title);int durationColumn mediaCursor.GetColumnIndex(MediaStore.Audio.Media.InterfaceConsts.Duration);int uriColumn mediaCursor.GetColumnIndex(MediaStore.Audio.Media.InterfaceConsts.Data);int idColumn mediaCursor.GetColumnIndex(MediaStore.Audio.Media.InterfaceConsts.Id);int isMusicColumn mediaCursor.GetColumnIndex(MediaStore.Audio.Media.InterfaceConsts.IsMusic);int albumIdColumn mediaCursor.GetColumnIndex(MediaStore.Audio.Media.InterfaceConsts.AlbumId);int isMusic;ulong duration, id;string artist, album, title, uri, genre, artwork, artworkId;if (mediaCursor.MoveToFirst()){do{isMusic int.Parse(mediaCursor.GetString(isMusicColumn));if (isMusic ! 0){ulong.TryParse(mediaCursor.GetString(durationColumn),out duration);artist mediaCursor.GetString(artistColumn);album mediaCursor.GetString(albumColumn);title mediaCursor.GetString(titleColumn);uri mediaCursor.GetString(uriColumn);ulong.TryParse(mediaCursor.GetString(idColumn), out id);artworkId mediaCursor.GetString(albumIdColumn);genreCursor Application.Context.ContentResolver.Query(MediaStore.Audio.Genres.GetContentUriForAudioId(external, (int)id),_genresProjections, null, null, null);int genreColumn genreCursor.GetColumnIndex(MediaStore.Audio.Genres.InterfaceConsts.Name);if (genreCursor.MoveToFirst()){genre genreCursor.GetString(genreColumn) ?? string.Empty;}else{genre string.Empty;}//https://stackoverflow.com/questions/63181820/why-is-album-art-the-only-field-that-returns-null-from-mediastore-when-others-arImageSource artworkImage null;if (DeviceInfo.Version.Major 10){albumCursor Application.Context.ContentResolver.Query(MediaStore.Audio.Albums.ExternalContentUri,_albumProjections,${MediaStore.Audio.Albums.InterfaceConsts.Id}?,new string[] { artworkId },null);int artworkColumn albumCursor.GetColumnIndex(MediaStore.Audio.Media.InterfaceConsts.AlbumArt);if (albumCursor.MoveToFirst()){artwork albumCursor.GetString(artworkColumn) ?? string.Empty;}else{artwork String.Empty;}albumCursor?.Close();artworkImage artwork;}else{var extUrl MediaStore.Audio.Albums.ExternalContentUri;var albumArtUri ContentUris.WithAppendedId(extUrl, long.Parse(artworkId));try{//var art System.IO.Path.Combine (Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), albumart artworkId .jpg);var art System.IO.Path.Combine(Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDocuments).AbsolutePath, albumart artworkId .jpg);var bitmap Application.Context.ContentResolver.LoadThumbnail(albumArtUri, new Android.Util.Size(1024, 1024), null);var h bitmap.Height;var w bitmap.Width;var bb bitmap.ByteCount;using (Stream ms new FileStream(art, FileMode.Create)){bitmap.Compress(Bitmap.CompressFormat.Png, 100, ms);bitmap.Recycle();}artworkImage art;}catch (Exception e){System.Console.WriteLine(e.Message);}}songs.Add(new MusicInfo(){Id (int)id,Title title,Artist artist,AlbumTitle album,Genre genre,Duration duration / 1000,Url uri,AlbumArt artworkImage});genreCursor?.Close();}} while (mediaCursor.MoveToNext());}mediaCursor?.Close();return songs;} 获取音乐信息集合 public partial async TaskInfoResultListMusicInfo GetMusicInfos() {ListMusicInfo musicInfos;var result false;if (await MediaLibraryAuthorization()){musicInfos await Task.Run(() {var Infos (from item in GetAllSongs()select new MusicInfo(){Id item.Id,Title item.Title,Duration item.Duration,Url item.Url,AlbumTitle item.AlbumTitle,Artist item.Artist,AlbumArt item.AlbumArt,GroupHeader GetGroupHeader(item.Title),IsFavourite GetIsMyFavouriteContains(item.Title).Result,IsInitFinished true}).ToList();return Infos;});result true;}else{musicInfos new ListMusicInfo();result false;}return new InfoResultListMusicInfo(result, musicInfos);} iOS中的实现 在iOS平台中MatoMusic.Core\Platforms\iOS\MusicInfoManager.cs 在iOS平台中获取音乐信息要简单得多MPMediaQuery这个类获取通系统自带的‘音乐’软件下载的或通过iTunes导入的本地歌曲文件 MPMediaQuery 类使用方式可以参考官方文档 获取音乐信息集合 public partial async TaskInfoResultListMusicInfo GetMusicInfos() {ListMusicInfo musicInfos;var result false;if (await MediaLibraryAuthorization()){musicInfos await Task.Run(() {var Infos (from item in MediaQuery.Itemswhere item.MediaType MPMediaType.Musicselect new MusicInfo(){Id (int)item.PersistentID,Title item.Title,Url item.AssetURL.ToString(),Duration Convert.ToUInt64(item.PlaybackDuration),AlbumTitle item.AlbumTitle,Artist item.Artist,AlbumArt GetAlbumArtSource(item),GroupHeader GetGroupHeader(item.Title),IsFavourite GetIsMyFavouriteContains(item.Title).Result,IsInitFinished true}).ToList();return Infos;});result true;}else{musicInfos new ListMusicInfo();result false;}return new InfoResultListMusicInfo(result, musicInfos);} Windows中的实现 在Windows设备中需要指定一个主目录来扫描音乐文件我们指定一个缺省目录如“音乐”文件夹KnownFolders.MusicLibrary好跟之前两个平台的行为保持一致 private async TaskListMusicInfo SetMusicListAsync(StorageFolder musicFolder null) {var localSongs new ListMusicInfo();ListStorageFile songfiles new ListStorageFile();if (musicFolder null){musicFolder KnownFolders.MusicLibrary;}await GetLocalSongsAysnc(songfiles, musicFolder);localSongs await PopulateSongListAsync(songfiles);return localSongs;}递归调用GetLocalSongsAysnc遍历主目录以及其子目录的所有.mp3文件 private async Task GetLocalSongsAysnc(ListStorageFile songFiles, StorageFolder parent) {foreach (var item in await parent.GetFilesAsync()){if (item.FileType .mp3)songFiles.Add(item);}foreach (var folder in await parent.GetFoldersAsync()){await GetLocalSongsAysnc(songFiles, folder);} }从本地文件读取音频信息转成曲目信息 private async TaskListMusicInfo PopulateSongListAsync(ListStorageFile songFiles) {var localSongs new ListMusicInfo();int Id 1;foreach (var file in songFiles){MusicInfo song new MusicInfo();// 1. 获取文件信息MusicProperties musicProperty await file.Properties.GetMusicPropertiesAsync();if (!string.IsNullOrEmpty(musicProperty.Title))song.Title musicProperty.Title;else{song.Title file.DisplayName;}StorageItemThumbnail currentThumb await file.GetThumbnailAsync(ThumbnailMode.MusicView, 60, ThumbnailOptions.UseCurrentScale);// 2.将文件信息转换为数据模型string coverUri ms-appx:///Assets/Default/Default.jpg;song.Id Id;song.Url file.Path;song.GroupHeader GetGroupHeader(song.Title);if (!string.IsNullOrEmpty(musicProperty.Artist))song.Artist musicProperty.Artist;elsesong.Artist 未知歌手;if (!string.IsNullOrEmpty(musicProperty.Album))song.AlbumTitle musicProperty.Album;elsesong.AlbumTitle 未知唱片;song.Duration (ulong)musicProperty.Duration.TotalSeconds;//3. 添加至UI集合中var task01 SaveImagesAsync(file, song);var result await task01;var task02 task01.ContinueWith((e) {if (result.IsSucess){song.AlbumArtPath result.Result;}else{song.AlbumArtPath coverUri;}});Task.WaitAll(task01, task02);song.IsInitFinished true;localSongs.Add(song);Id;}return localSongs; } 获取音乐信息集合 public partial async TaskInfoResultListMusicInfo GetMusicInfos() {ListMusicInfo musicInfos;var result false;if (await MediaLibraryAuthorization()){musicInfos await SetMusicListAsync();result true;}else{musicInfos new ListMusicInfo();result false;}return new InfoResultListMusicInfo(result, musicInfos);} 获取专辑和艺术家 专辑信息包含了音乐集合 获取专辑和艺术家的跨平台的实现方式大同小异以Android平台为例 GetAlbumInfos方法用于获取AlbumInfo集合 public partial async TaskInfoResultListAlbumInfo GetAlbumInfos() {ListAlbumInfo albumInfo;var result false;if (await MediaLibraryAuthorization()){var isSucc await GetMusicInfos();if (!isSucc.IsSucess){//CommonHelper.ShowNoAuthorized();}albumInfo await Task.Run(() {var info (from item in isSucc.Resultgroup item by item.AlbumTitleinto cselect new AlbumInfo(){Title c.Key,GroupHeader GetGroupHeader(c.Key),AlbumArt c.FirstOrDefault().AlbumArt,Musics new ObservableCollectionMusicInfo(c.Select(d new MusicInfo(){Id d.Id,Title d.Title,Duration d.Duration,Url d.Url,AlbumTitle d.AlbumTitle,Artist d.Artist,AlbumArt d.AlbumArt,IsFavourite GetIsMyFavouriteContains(d.Title).Result,IsInitFinished true}))}).ToList();return info;});result true;}else{albumInfo new ListAlbumInfo();result false;}return new InfoResultListAlbumInfo(result, albumInfo);}GetArtistInfos方法用于获取ArtistInfo集合 public partial async TaskInfoResultListArtistInfo GetArtistInfos() {ListArtistInfo artistInfo;var result false;if (await MediaLibraryAuthorization()){var isSucc await GetMusicInfos();if (!isSucc.IsSucess){//CommonHelper.ShowNoAuthorized();}artistInfo await Task.Run(() {var info (from item in isSucc.Resultgroup item by item.Artistinto cselect new ArtistInfo(){Title c.Key,GroupHeader GetGroupHeader(c.Key),Musics new ObservableCollectionMusicInfo(c.Select(d new MusicInfo(){Id d.Id,Title d.Title,Duration d.Duration,Url d.Url,AlbumTitle d.AlbumTitle,Artist d.Artist,AlbumArt d.AlbumArt,IsFavourite GetIsMyFavouriteContains(d.Title).Result,IsInitFinished true}))}).ToList();return info;});result true;}else{artistInfo new ListArtistInfo();result false;}return new InfoResultListArtistInfo(result, artistInfo); }项目地址 GitHub:MatoMusic
http://www.tj-hxxt.cn/news/224898.html

相关文章:

  • 辽宁pc网站建设开发徐州制作手机网站
  • 宁波公司网站开发招聘免费建网站哪家好
  • 免费自助建站哪个网站最好企业管理培训课程安排
  • 郑州做定制网站的公司如何建立网站快捷
  • 做视频网站收费侵权吗django 网站开发视频教程
  • 个人网站搭建wordpress网站分析与优化
  • 久久网站建设专业网站建设公司兴田德润优惠吗
  • 顺德网站优化wordpress嵌入代码
  • 广告在什么网站做设计广告图用什么软件好用
  • 汽车网站建设网上海网站推广行业需求
  • 黄埭做网站团队建设优缺点
  • 用vis做的简单网站个人建站免费服务器
  • 网站建设项目补充协议石墨网站开发
  • 用 htmi5做网站网站查不到备案
  • 口碑好的镇江网站建设图标怎么在wordpress
  • 收钱码合并的网站怎么做在线作图网
  • 网站后台数据处理编辑主要是做什么的啊网上怎么自己做网站
  • 做影视网站被告怎么办阿里巴巴1688采购平台官网
  • 网站系统排名怎样看网站建设
  • 什么网站做推广农产品比较好有哪些网站做外贸的
  • 临沂网站wordpress社交平台主题
  • 成都购物网站建设网站建设和管理制度
  • 沈阳网站seo公司私人网站如何建
  • 温岭网站制作网站建设与管理 试卷
  • 装修的网站泉州共创科技
  • 云南网站推广的目的软文广告案例分析
  • 做网站的流程百科网站开发项目合同书
  • 视频网站的广告能怎么做网页制作基础与实例教程
  • 安阳网站如何做优化平邑做网站的
  • 抚顺您做煮火锅网站开源免费建站程序用的最多的