精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

HarmonyOS Sample 之 DistributedMusicPlayer分布式音樂播放器

開發 前端 分布式 OpenHarmony
本示例主要演示了如何通過遷移數據進行音樂的分布式播放。實現了音樂播放的跨設備遷移,包括:播放哪首歌曲、播放進度、以及播放狀態的保持。

[[419218]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

DistributedMusicPlayer分布式音樂播放器

介紹

本示例主要演示了如何通過遷移數據進行音樂的分布式播放。實現了音樂播放的跨設備遷移,包括:播放哪首歌曲、播放進度、以及播放狀態的保持。

效果展示

搭建環境

安裝DevEco Studio,詳情請參考DevEco Studio下載

設置DevEco Studio開發環境,DevEco Studio開發環境需要依賴于網絡環境,需要連接上網絡才能確保工具的正常使用,可以根據如下兩種情況來配置開發環境:

如果可以直接訪問Internet,只需進行下載HarmonyOS SDK操作

如果網絡不能直接訪問Internet,需要通過代理服務器才可以訪問,請參考配置開發環境

下載源碼,導入項目。

代碼結構

  1.   config.json #全局配置文件 
  2. │ 
  3. ├─java 
  4. │  └─ohos 
  5. │      └─samples 
  6. │          └─distributedmusicplayer 
  7. │              │  MainAbility.java 
  8. │              │ 
  9. │              ├─slice 
  10. │              │      MainAbilitySlice.java     #播放器主能力Slice 
  11. │              │ 
  12. │              └─utils 
  13. │                      LogUtil.java     #日志工具類 
  14. │                      PlayerManager.java   #播放器管理者 
  15. │                      PlayerStateListener.java #播放器狀態監聽器 
  16. │ 
  17. └─resources 
  18.     ├─base 
  19.     │  ├─element 
  20.     │  │      string.json 
  21.     │  │ 
  22.     │  ├─graphic 
  23.     │  │      button_bg.xml 
  24.     │  │ 
  25.     │  ├─layout 
  26.     │  │      main_ability_slice.xml        #播放器頁面布局 
  27.     │  │ 
  28.     │  └─media                  #海報、按鈕圖片資源 
  29.     │          album.png 
  30.     │          album2.png 
  31.     │          bg_blurry.png 
  32.     │          icon.png 
  33.     │          ic_himusic_next.png 
  34.     │          ic_himusic_pause.png 
  35.     │          ic_himusic_play.png 
  36.     │          ic_himusic_previous.png 
  37.     │          remote_play_selected.png 
  38.     │ 
  39.     └─rawfile                   #歌曲媒體資源 
  40.             Homey.mp3 
  41.             Homey.wav 
  42.             Technology.mp3 
  43.             Technology.wav 

實現步驟

1.實現跨設備遷移標準步驟,參見HarmonyOS Sample 之 AbilityInteraction設備遷移

2.實現一個播放器管理者PlayerManager

2.1.定義播放器的狀態,包括: 播放、暫停、完成、播放中

  1. private static final int PLAY_STATE_PLAY = 0x0000001; 
  2. private static final int PLAY_STATE_PAUSE = 0x0000002; 
  3. private static final int PLAY_STATE_FINISH = 0x0000003; 
  4. private static final int PLAY_STATE_PROGRESS = 0x0000004; 

2.2.實現基本的方法,包括:播放、暫停、切換歌曲、更新播放進度方法

還有一些輔助方法,包括:設置媒體資源、定時更新播放進度、獲取播放總時長、

要用到Player/Timer/自定義的PlayerStateListener/EventHandler事件處理/PlayCallBack播放器回調類

  1. /** 
  2.  * play 
  3.  */ 
  4. public void play() { 
  5.     try { 
  6.         if (!isPrepared) { 
  7.             LogUtil.error(TAG, "prepare fail"); 
  8.             return
  9.         } 
  10.         //如果開始播放則返回真; 否則返回 false。 
  11.         if (!musicPlayer.play()) { 
  12.             LogUtil.error(TAG, "play fail"); 
  13.             return
  14.         } 
  15.         startTask(); 
  16.         handler.sendEvent(PLAY_STATE_PLAY); 
  17.     } catch (IllegalArgumentException e) { 
  18.         LogUtil.error(TAG, e.getMessage()); 
  19.         e.printStackTrace(); 
  20.     } 
  21.  
  22. /** 
  23.  * pause 
  24.  */ 
  25. public void pause() { 
  26.     if (!musicPlayer.pause()) { 
  27.         LogUtil.info(TAG, "pause fail"); 
  28.         return
  29.     } 
  30.     //停止計時 
  31.     finishTask(); 
  32.     // 
  33.     handler.sendEvent(PLAY_STATE_PAUSE); 
  34. /** 
  35.  * switch music 
  36.  * 
  37.  * @param uri music uri 
  38.  */ 
  39. public void switchMusic(String uri) { 
  40.     currentUri = uri; 
  41.     //設置資源 
  42.     setResource(currentUri); 
  43.     //播放 
  44.     play(); 
  45.  
  46. /** 
  47.  * changes the playback position 
  48.  * 更新當前播放進度 
  49.  * 
  50.  * @param currentTime current time 
  51.  */ 
  52. public void rewindTo(int currentTime) { 
  53.     musicPlayer.rewindTo(currentTime * 1000); 
  54.  
  55. /** 
  56.  * set source 
  57.  * 
  58.  * @param uri music uri 
  59.  */ 
  60. public void setResource(String uri) { 
  61.     LogUtil.info(TAG, "setResource,uri:  " + uri); 
  62.     try { 
  63.         RawFileEntry rawFileEntry = context.getResourceManager().getRawFileEntry(uri); 
  64.         BaseFileDescriptor baseFileDescriptor = rawFileEntry.openRawFileDescriptor(); 
  65.         //LogUtil.info(TAG, "setResource,baseFileDescriptor :  " + baseFileDescriptor); 
  66.         if (!musicPlayer.setSource(baseFileDescriptor)) { 
  67.             LogUtil.info(TAG, "uri is invalid"); 
  68.             return
  69.         } 
  70.         //準備播放環境并緩沖媒體數據。 
  71.         isPrepared = musicPlayer.prepare(); 
  72.         LogUtil.info(TAG, "setResource,isPrepared:  " + isPrepared); 
  73.         //歌曲名稱 
  74.         String listenerUri = currentUri.substring(currentUri.lastIndexOf("/") + 1, currentUri.lastIndexOf(".")); 
  75.         playerStateListener.onUriSet(listenerUri); 
  76.         LogUtil.info(TAG, "setResource,listenerUri:  " + listenerUri); 
  77.     } catch (IOException e) { 
  78.         LogUtil.error(TAG, "io exception"); 
  79.     } 
  80. /** 
  81.  * 定時事件通知更新進度條 
  82.  */ 
  83. private void startTask() { 
  84.     LogUtil.debug(TAG, "startTask"); 
  85.     finishTask(); 
  86.     timerTask = new TimerTask() { 
  87.         @Override 
  88.         public void run() { 
  89.             handler.sendEvent(PLAY_STATE_PROGRESS); 
  90.         } 
  91.     }; 
  92.     timer = new Timer(); 
  93.     timer.schedule(timerTask, DELAY_TIME, PERIOD); 
  94.  
  95. private void finishTask() { 
  96.     LogUtil.debug(TAG, "finishTask"); 
  97.     if (timer != null && timerTask != null) { 
  98.         timer.cancel(); 
  99.         timer = null
  100.         timerTask = null
  101.     } 
  102. }  

2.3.PlayerStateListener播放器狀態監聽器有如下方法:

onPlaySuccess播放成功時被調用

onPauseSuccess暫停時被調用

onPositionChange進度發生變化時被調用

onMusicFinished音樂播放完成時被調用

onUriSet資源被設置時被調用

  1. /** 
  2.  * PlayerStateListener 
  3.  */ 
  4. public interface PlayerStateListener { 
  5.     void onPlaySuccess(int totalTime); 
  6.  
  7.     void onPauseSuccess(); 
  8.  
  9.     void onPositionChange(int currentTime); 
  10.  
  11.     void onMusicFinished(); 
  12.  
  13.     void onUriSet(String name); 

2.4.PlayCallBack播放器回調類實現了Player.IPlayerCallback接口,實現了如下方法:

onPrepared 當媒體文件準備好播放時調用。

onMessage當收到播放器消息或警報時調用。

onError收到播放器錯誤消息時調用。

onResolutionChanged當視頻大小改變時調用。

onPlayBackComplete播放完成時調用。

onRewindToComplete 當播放位置被 Player.rewindTo(long) 改變時調用。

onBufferingChange當緩沖百分比更新時調用。

onNewTimedMetaData當有新的定時元數據可用時調用。

onMediaTimeIncontinuity當媒體時間連續性中斷時調用,例如播放過程中出現錯誤,播放位置被Player.rewindTo(long)改變,或者播放速度突然改變。

  1. /** 
  2.  * 在播放完成、播放位置更改和視頻大小更改時提供媒體播放器回調。 
  3.  */ 
  4. private class PlayCallBack implements Player.IPlayerCallback { 
  5.  
  6.     /** 
  7.      * 當媒體文件準備好播放時調用。 
  8.      */ 
  9.     @Override 
  10.     public void onPrepared() { 
  11.         LogUtil.info(TAG, "onPrepared"); 
  12.     } 
  13.  
  14.     /** 
  15.      * 當收到播放器消息或警報時調用。 
  16.      * 
  17.      * @param type 
  18.      * @param extra 
  19.      */ 
  20.     @Override 
  21.     public void onMessage(int type, int extra) { 
  22.         LogUtil.info(TAG, "onMessage  " + type + "-" + extra); 
  23.     } 
  24.  
  25.  
  26.     /** 
  27.      * 收到播放器錯誤消息時調用。 
  28.      * 
  29.      * @param errorType 
  30.      * @param errorCode 
  31.      */ 
  32.     @Override 
  33.     public void onError(int errorType, int errorCode) { 
  34.         LogUtil.info(TAG, "onError  " + errorType + "-" + errorCode); 
  35.     } 
  36.  
  37.     /** 
  38.      * 當視頻大小改變時調用。 
  39.      * 
  40.      * @param width 
  41.      * @param height 
  42.      */ 
  43.     @Override 
  44.     public void onResolutionChanged(int width, int height) { 
  45.         LogUtil.info(TAG, "onResolutionChanged  " + width + "-" + height); 
  46.     } 
  47.  
  48.     /** 
  49.      * 播放完成時調用。 
  50.      */ 
  51.     @Override 
  52.     public void onPlayBackComplete() { 
  53.         //不會自動被調用???? 
  54.         LogUtil.info(TAG, "onPlayBackComplete----------------"); 
  55.         handler.sendEvent(PLAY_STATE_FINISH); 
  56.  
  57.     } 
  58.  
  59.     /** 
  60.      * 當播放位置被 Player.rewindTo(long) 改變時調用。 
  61.      */ 
  62.     @Override 
  63.     public void onRewindToComplete() { 
  64.         LogUtil.info(TAG, "onRewindToComplete"); 
  65.     } 
  66.  
  67.     /** 
  68.      * 當緩沖百分比更新時調用。 
  69.      * 
  70.      * @param percent 
  71.      */ 
  72.     @Override 
  73.     public void onBufferingChange(int percent) { 
  74.         LogUtil.info(TAG, "onBufferingChange:" + percent); 
  75.     } 
  76.  
  77.     /** 
  78.      * 當有新的定時元數據可用時調用。 
  79.      * 
  80.      * @param mediaTimedMetaData 
  81.      */ 
  82.     @Override 
  83.     public void onNewTimedMetaData(Player.MediaTimedMetaData mediaTimedMetaData) { 
  84.         LogUtil.info(TAG, "onNewTimedMetaData"); 
  85.     } 
  86.  
  87.  
  88.     /** 
  89.      * 當媒體時間連續性中斷時調用,例如播放過程中出現錯誤,播放位置被Player.rewindTo(long)改變,或者播放速度突然改變。 
  90.      * 
  91.      * @param mediaTimeInfo 
  92.      */ 
  93.     @Override 
  94.     public void onMediaTimeIncontinuity(Player.MediaTimeInfo mediaTimeInfo) { 
  95.         LogUtil.info(TAG, "onNewTimedMetaData"); 
  96.     } 

3.MainAbilitySlice 中 implements PlayerStateListener , IAbilityContinuation接口

  1. public class MainAbilitySlice extends AbilitySlice implements PlayerStateListener, IAbilityContinuation { 
  2. ... 

3.1.實現PlayerStateListener接口方法

  1. @Override 
  2. public void onPlaySuccess(int totalTime) { 
  3.     LogUtil.debug(TAG, "onPlaySuccess"); 
  4.     //設置圖標 
  5.     musicPlayButton.setPixelMap(ResourceTable.Media_ic_himusic_pause); 
  6.     //設置總時長文本 
  7.     this.totalTimeText.setText(getTime(totalTime)); 
  8.     //設置進度條 
  9.     slider.setMaxValue(totalTime); 
  10.     //設置當前歌曲海報 
  11.     musicPosters.setPixelMap(posters[currentPos]); 
  12.  
  13. @Override 
  14. public void onPauseSuccess() { 
  15.     LogUtil.debug(TAG, "onPauseSuccess"); 
  16.     //設置圖標 
  17.     musicPlayButton.setPixelMap(ResourceTable.Media_ic_himusic_play); 
  18.  
  19. @Override 
  20. public void onUriSet(String name) { 
  21.     LogUtil.debug(TAG, "onUriSet"); 
  22.     //設置歌曲名稱 
  23.     musicNameText.setText(name); 
  24.  
  25. @Override 
  26. public void onPositionChange(int currentTime) { 
  27.    if(currentTime < totalTime){ 
  28.        LogUtil.info(TAG, "onPositionChange currentTime = " + currentTime+",totalTime="+totalTime); 
  29.        this.currentTime = currentTime; 
  30.         //設置播放時間文本 
  31.         this.currentTimeText.setText(getTime(currentTime)); 
  32.         //設置進度條的當前播放時間 
  33.         slider.setProgressValue(currentTime); 
  34.     }else
  35.        LogUtil.info(TAG, "onPositionChange, current song end"); 
  36.  
  37.        //設置播放器圖標 
  38.         musicPlayButton.setPixelMap(ResourceTable.Media_ic_himusic_play); 
  39.     } 
  40.  
  41. /** 
  42.  *音樂播放完成時應該被調用,但是沒被調用 
  43.  */ 
  44. @Override 
  45. public void onMusicFinished() { 
  46.     //TODO??????????? 
  47.     LogUtil.debug(TAG, "onMusicFinished"); 
  48.     currentPos = currentPos == 0 ? 1 : 0; 
  49.     currentUri = musics[currentPos]; 
  50.     //切換歌曲 
  51.     playerManager.switchMusic(currentUri); 
  52.     //總時長 
  53.     totalTime=playerManager.getTotalTime(); 

3.2.實現IAbilityContinuation接口方法

  1. @Override 
  2. public boolean onStartContinuation() { 
  3.     LogUtil.debug(TAG, "onStartContinuation"); 
  4.     return true
  5.  
  6. @Override 
  7. public boolean onSaveData(IntentParams intentParams) { 
  8.     LogUtil.debug(TAG, "onSaveData"); 
  9.     // 
  10.     intentParams.setParam(KEY_CURRENT_TIME, currentTime); 
  11.     intentParams.setParam(KEY_POSITION, currentPos); 
  12.     intentParams.setParam(KEY_PLAY_STATE, String.valueOf(playerManager.isPlaying())); 
  13.     LogUtil.info(TAG, "onSaveData:" + currentTime); 
  14.     return true
  15.  
  16. @Override 
  17. public boolean onRestoreData(IntentParams intentParams) { 
  18.     LogUtil.debug(TAG, "onRestoreData"); 
  19.     if (!(intentParams.getParam(KEY_POSITION) instanceof Integer)) { 
  20.         return false
  21.     } 
  22.     if (!(intentParams.getParam(KEY_CURRENT_TIME) instanceof Integer)) { 
  23.         return false
  24.     } 
  25.     if (!(intentParams.getParam(KEY_PLAY_STATE) instanceof String)) { 
  26.         return false
  27.     } 
  28.  
  29.     //恢復數據,獲取遷移過來的參數:播放位置、時間和播放狀態 
  30.     currentPos = (int) intentParams.getParam(KEY_POSITION); 
  31.     currentTime = (int) intentParams.getParam(KEY_CURRENT_TIME); 
  32.     Object object = intentParams.getParam(KEY_PLAY_STATE); 
  33.  
  34.  
  35.     if (object instanceof String) { 
  36.         isPlaying = Boolean.parseBoolean((String) object); 
  37.     } 
  38.     isInteractionPlay = true
  39.     LogUtil.info(TAG, "onRestoreData:" + currentTime); 
  40.     return true
  41.  
  42. @Override 
  43. public void onCompleteContinuation(int i) { 
  44.     terminate(); 

3.3.定義ValueChangedListenerImpl進度值變化的監聽事件

實現 Slider.ValueChangedListener 接口方法

  1. /** 
  2.  *進度條值變化的監聽事件 
  3.  */ 
  4. private class ValueChangedListenerImpl implements Slider.ValueChangedListener { 
  5.     @Override 
  6.     public void onProgressUpdated(Slider slider, int progress, boolean fromUser) { 
  7.         currentTime = progress; 
  8.     } 
  9.  
  10.     @Override 
  11.     public void onTouchStart(Slider slider) { 
  12.         LogUtil.debug(TAG, "onTouchStart"); 
  13.     } 
  14.  
  15.     @Override 
  16.     public void onTouchEnd(Slider slider) { 
  17.         LogUtil.debug(TAG, "onTouchEnd"); 
  18.         //快速更改播放進度 
  19.         playerManager.rewindTo(currentTime); 
  20.         //當前播放時間 
  21.         currentTimeText.setText(getTime(currentTime)); 
  22.     } 

3.4.定義遷移數據的KEY,音樂當前的播放時間、播放的歌曲索引(位置)、播放狀態

  1. private static final String KEY_CURRENT_TIME = "main_ability_slice_current_time"
  2. private static final String KEY_POSITION = "main_ability_slice_position"
  3. private static final String KEY_PLAY_STATE = "main_ability_slice_play_state"
  4. private int currentPos = 0; 
  5. private String currentUri; 
  6. //是否是互動播放,true表示遠端遷移恢復的 
  7. private boolean isInteractionPlay; 
  8. private int currentTime; 
  9. //當前播放歌曲總時長 
  10. private int totalTime; 
  11. private boolean isPlaying; 

 3.5.定義播放的音樂URI,這里準備了2首,還有對應的海報

  1. private static final String URI1 = "resources/rawfile/Technology.wav"
  2. private static final String URI2 = "resources/rawfile/Homey.wav"
  3. private final String[] musics = {URI1, URI2}; 
  4. private final int[] posters = {ResourceTable.Media_album, ResourceTable.Media_album2}; 

 3.6.onStart完成數據的初始化

  1. @Override 
  2. public void onStart(Intent intent) { 
  3.     super.onStart(intent); 
  4.     super.setUIContent(ResourceTable.Layout_main_ability_slice); 
  5.  
  6.     initComponents(); 
  7.  
  8.     initMedia(); 
  9.  
  10.     updateUI(); 

初始化界面組件,實現對應按鈕的監聽事件

播放或暫停、上一首、下一首、遷移以及進度條的進度變化事件的監聽

  1. /** 
  2.  * 初始化界面組件,實現對應按鈕的監聽事件 
  3.  * 播放或暫停、上一首、下一首、遷移以及進度條的進度變化事件的監聽 
  4.  */ 
  5. private void initComponents() { 
  6.     LogUtil.debug(TAG, "initComponents"); 
  7.     musicNameText = (Text) findComponentById(ResourceTable.Id_music_name); 
  8.     currentTimeText = (Text) findComponentById(ResourceTable.Id_play_progress_time); 
  9.     totalTimeText = (Text) findComponentById(ResourceTable.Id_play_total_time); 
  10.  
  11.     musicPosters = (Image) findComponentById(ResourceTable.Id_music_posters); 
  12.  
  13.     musicPlayButton = (Image) findComponentById(ResourceTable.Id_music_play_btn); 
  14.     findComponentById(ResourceTable.Id_remote_play).setClickedListener(this::continueAbility); 
  15.     findComponentById(ResourceTable.Id_music_play_prev_btn).setClickedListener(this::prevMusic); 
  16.     findComponentById(ResourceTable.Id_music_play_next_btn).setClickedListener(this::nextMusic); 
  17.  
  18.     musicPlayButton.setClickedListener(this::playOrPauseMusic); 
  19.  
  20.     // 
  21.     slider = (Slider) findComponentById(ResourceTable.Id_play_progress_bar); 
  22.     slider.setValueChangedListener(new ValueChangedListenerImpl()); 
  23.  
  24. private void continueAbility(Component component) { 
  25.     try { 
  26.         continueAbility(); 
  27.     } catch (IllegalStateException e) { 
  28.         LogUtil.info(TAG, e.getMessage()); 
  29.     } 
  30.  
  31. /** 
  32.  * 上一首 
  33.  * @param component 
  34.  */ 
  35. private void prevMusic(Component component) { 
  36.     currentPos = currentPos == 0 ? 1 : 0; 
  37.     currentUri = musics[currentPos]; 
  38.     // 
  39.     playerManager.switchMusic(currentUri); 
  40.     //總時長 
  41.     totalTime=playerManager.getTotalTime(); 
  42.  
  43. /** 
  44.  * 下一首 
  45.  * @param component 
  46.  */ 
  47. private void nextMusic(Component component) { 
  48.     currentPos = currentPos == 0 ? 1 : 0; 
  49.     currentUri = musics[currentPos]; 
  50.     //切換音樂 
  51.     playerManager.switchMusic(currentUri); 
  52.     //總時長 
  53.     totalTime=playerManager.getTotalTime(); 
  54.  
  55. /** 
  56.  * 播放或暫停音樂 
  57.  * @param component 
  58.  */ 
  59. private void playOrPauseMusic(Component component) { 
  60.     // 
  61.     playOrPause(); 
  62.  
  63. /** 
  64.  * 播放或暫停 
  65.  */ 
  66. private void playOrPause() { 
  67.  
  68.     LogUtil.debug(TAG, "playOrPause,playerManager:"+playerManager); 
  69.     try { 
  70.         // 
  71.         if (playerManager.isPlaying()) { 
  72.             LogUtil.debug(TAG, "playOrPause pause"); 
  73.             playerManager.pause(); 
  74.         }else
  75.             //設置資源 
  76.             playerManager.setResource(currentUri); 
  77.             //設置進度 
  78.             playerManager.rewindTo(currentTime); 
  79.             playerManager.play(); 
  80.             LogUtil.debug(TAG, "playOrPause play"); 
  81.         } 
  82.     } catch (Exception e) { 
  83.         LogUtil.error(TAG, "playOrPause"); 
  84.         e.printStackTrace(); 
  85.     } 

3.7.初始化媒體對象

當前播放歌曲資源,播放器管理者

  1. /** 
  2.  * 初始化媒體對象 
  3.  * 當前播放歌曲資源 
  4.  * 播放器管理者 
  5.  */ 
  6. private void initMedia() { 
  7.     LogUtil.debug(TAG, "initMedia"); 
  8.     //當前媒體URI 
  9.     currentUri = musics[currentPos]; 
  10.     LogUtil.debug(TAG, "initMedia,currentUri:"+currentUri); 
  11.     //初始化playerManager 
  12.     playerManager = new PlayerManager(getApplicationContext(), currentUri); 
  13.  
  14.     //弱引用對象,不會阻止它們的引用對象被終結、終結和回收。 弱引用最常用于實現規范化映射。 
  15.     WeakReference<PlayerStateListener> playerStateListener = new WeakReference<>(this); 
  16.     //設置狀態監聽器 
  17.     playerManager.setPlayerStateListener(playerStateListener.get()); 
  18.     //初始化播放器信息 
  19.     playerManager.init(); 
  20.     LogUtil.debug(TAG, "initMedia FINISH"); 

3.8.遠端遷移后恢復播放界面

恢復播放器的播放進度、播放狀態、海報、當前時間和總時長、slider播放進度

  1. /** 
  2.  * 遠端遷移后恢復的播放,恢復播放器的播放進度 
  3.  * 更新UI界面 
  4.  */ 
  5. private void updateUI() { 
  6.     LogUtil.debug(TAG, "updateUI"); 
  7.     //海報 
  8.     musicPosters.setPixelMap(posters[currentPos]); 
  9.     //當前時間和總時長 
  10.     currentTimeText.setText(getTime(currentTime)); 
  11.     totalTimeText.setText(getTime(playerManager.getTotalTime())); 
  12.     //播放進度 
  13.     slider.setMaxValue(playerManager.getTotalTime()); 
  14.     slider.setProgressValue(currentTime); 
  15.  
  16.     //總時長 
  17.     totalTime=playerManager.getTotalTime(); 
  18.  
  19.     //遠端遷移恢復 
  20.     if (isInteractionPlay) { 
  21.         LogUtil.debug(TAG, "remotePlay,rewindTo:"+currentTime); 
  22.         playerManager.rewindTo(currentTime); 
  23.         if (!isPlaying) { 
  24.             return
  25.         } 
  26.         //播放 
  27.         playerManager.play(); 
  28.     } 

問題總結

1.onMusicFinished 音樂播放完成時應該被調用,但是多數沒被調用,只是偶爾會調用,難道是我電腦性能跟不上了?

2.優化了源碼中應用啟動后,點擊播放無法播放的問題

3.優化了播放器播放完當前歌曲更新播放圖標

4.增加了相關的注釋說明

附件直接下載DistributedMusicPlayer.zip

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2022-11-08 15:48:35

應用開發音樂播放器

2021-10-21 16:00:07

鴻蒙HarmonyOS應用

2021-10-19 14:27:07

鴻蒙HarmonyOS應用

2021-12-10 15:06:56

鴻蒙HarmonyOS應用

2021-12-02 10:11:44

鴻蒙HarmonyOS應用

2011-06-27 11:23:21

Qt 音樂播放器

2014-12-31 16:52:53

音樂播放器源碼

2009-12-17 15:10:31

Linux音樂播放器

2018-07-17 08:14:22

分布式分布式鎖方位

2019-02-11 09:20:35

Linux音樂播放器

2017-03-01 14:01:31

android多媒體音樂代碼

2011-04-06 10:03:45

谷歌云計算Android音

2017-02-20 09:15:34

Linux播放器Qmmp

2021-10-21 10:03:09

鴻蒙HarmonyOS應用

2021-11-16 09:38:10

鴻蒙HarmonyOS應用

2021-05-28 09:52:00

鴻蒙HarmonyOS應用

2022-06-28 14:23:51

分布式音樂播放器

2020-11-06 12:12:35

HarmonyOS

2011-08-30 09:48:07

Ubuntu

2013-07-23 17:55:14

酷狗音樂mac
點贊
收藏

51CTO技術棧公眾號

午夜国产福利视频| 日av中文字幕| 欧美天堂在线视频| 日韩精品91亚洲二区在线观看| 亚洲欧美在线看| 亚洲欧美日韩一级| 男人添女人下部高潮视频在线观看| 成人免费不卡视频| 国产精品成人aaaaa网站| 欧美精品久久久久久久久46p| 国产精品xxx在线观看| 91福利在线导航| 久久男人资源站| 国产黄色在线| 成人午夜av在线| 国产精品亚洲网站| 国产污污视频在线观看| 日韩欧美二区| 日韩精品免费在线| 欧洲成人午夜精品无码区久久| 韩漫成人漫画| 亚洲成人手机在线| 热这里只有精品| 国产福利在线| 99re这里只有精品首页| 2014国产精品| 中文在线免费看视频| 999在线观看精品免费不卡网站| 色婷婷久久一区二区| 麻豆国产精品一区| 都市激情亚洲欧美| 欧美一区二区成人6969| 天天综合网日韩| 成人黄色免费短视频| 亚洲国产精品久久不卡毛片| 中文字幕日韩一区二区三区| 国产在线视频福利| 99精品久久久久久| 成人av电影免费| 国产农村妇女毛片精品| 男人的天堂亚洲一区| 欧美亚洲国产视频小说| 日产精品久久久久| 1024精品一区二区三区| 欧美大胆在线视频| 日本黄色片免费观看| 欧美激情777| 上原亚衣av一区二区三区| 亚洲成人黄色av| 五月天亚洲一区| 日韩的一区二区| 欧美在线一级片| 欧美精品国产白浆久久久久| 亚洲成av人乱码色午夜| 国产a级片视频| 97久久综合区小说区图片区| 日韩欧美第一区| 国产精品19p| 亚洲精品福利| 亚洲精品一区二区三区99| 亚洲国产精品狼友在线观看| 一区中文字幕| 亚洲福利精品在线| aaaaa一级片| 伊人久久大香线蕉av不卡| 亚洲女在线观看| 91激情视频在线观看| 精品视频网站| 日韩中文字幕网站| 九九视频免费在线观看| 亚洲人成毛片在线播放女女| 91产国在线观看动作片喷水| 综合激情网五月| 日韩精品成人一区二区三区| 成人h视频在线观看播放| 99国产精品99| av一区二区三区在线| 欧美精品与人动性物交免费看| 国产粉嫩一区二区三区在线观看| 中文字幕一区二区三区蜜月| 91视频成人免费| 成av人片在线观看www| 欧美性黄网官网| 在线黄色免费观看| 在这里有精品| 亚洲色图五月天| 很污很黄的网站| 一区免费在线| 国产精品高潮粉嫩av| 国产日韩免费视频| 99精品一区二区三区| 亚洲va韩国va欧美va精四季| 91麻豆免费在线视频| 黑人巨大精品欧美一区二区免费| 免费看污污网站| japanese色系久久精品| 亚洲视频欧洲视频| 免费在线视频一区二区| 久久久久综合| av一本久道久久波多野结衣| 欧美色18zzzzxxxxx| 亚洲男人的天堂网| 99re在线视频免费观看| 精品国产一区二| 亚洲欧美制服第一页| 日本中文字幕免费在线观看| 久久精品男女| 国产伦精品一区二区| 18免费在线视频| 欧美日韩另类视频| 杨幂一区二区国产精品| 欧洲福利电影| 91精品国产91久久久久久吃药| 中文字幕自拍偷拍| 久久综合国产精品| 无码人妻精品一区二区蜜桃网站| a屁视频一区二区三区四区| 亚洲第一av网站| 91九色丨porny丨极品女神| 日韩精品午夜视频| 久久亚洲高清| 激情影院在线| 欧美美女一区二区在线观看| 国产三级视频网站| 在线日韩视频| 福利视频一区二区三区| 韩国中文字幕在线| 欧美人体做爰大胆视频| 中文字幕第20页| 欧美亚洲一级| 精品久久sese| 好看的中文字幕在线播放| 欧美电影一区二区| 999久久久国产| 日本午夜一本久久久综合| 久久久久久久免费| 久草在线资源站手机版| 亚洲第一区第二区| 九九视频免费在线观看| 国产传媒日韩欧美成人| 中文字幕超清在线免费观看| 国外成人福利视频| 中文字幕亚洲色图| 日韩国产亚洲欧美| 国产欧美日韩视频在线观看| www.亚洲天堂网| 偷拍自拍一区| 日产日韩在线亚洲欧美| 精品欧美不卡一区二区在线观看| 偷拍一区二区三区四区| 日批在线观看视频| 亚洲精品男同| 久久人人九九| 女生影院久久| 色噜噜国产精品视频一区二区| 中文字幕一二区| 亚洲欧美在线另类| 99视频在线观看视频| 韩国久久久久| 久久国产精品高清| 日韩美女在线看免费观看| 亚洲一区二区久久久| 日本成人一级片| 中文字幕一区三区| 特种兵之深入敌后| 日韩一区二区久久| 欧美在线日韩精品| 九九热这里有精品| 欧美成在线观看| 天堂在线视频观看| 日韩欧美中文字幕在线观看| 日本成人免费视频| 久久99国产精品尤物| 8x8x华人在线| 亚洲调教一区| 国产日韩欧美成人| 免费不卡av| 亚洲欧美另类人妖| 91免费视频播放| 亚洲综合色噜噜狠狠| 国产又爽又黄无码无遮挡在线观看| 日韩激情视频网站| 国产对白在线播放| 婷婷成人在线| 成人a在线视频| 免费男女羞羞的视频网站在线观看| 亚洲黄在线观看| 中文字幕网址在线| 亚洲国产va精品久久久不卡综合| 九色porny自拍视频| 国产乱子伦一区二区三区国色天香| 久久国产精品网| 日韩精品免费一区二区三区| 翡翠波斯猫1977年美国| 日韩中文视频| 久久久久久久久中文字幕| 九色视频在线观看免费播放 | 99在线观看视频免费| 婷婷成人综合| 成人免费激情视频| 亚洲精品永久免费视频| 久久综合伊人77777| 欧洲一级在线观看| 日韩美女视频一区二区在线观看| 国产欧美一区二区在线观看| 小说区视频区图片区| 日韩最新在线| 亚洲最大成人在线| 欧美123区| 91高清视频在线免费观看| 欧美一区二区三区| 国产丝袜一区视频在线观看| jizz中国少妇| 欧美亚洲综合在线| 精品美女久久久久| 亚洲国产另类精品专区| 日韩av手机在线免费观看| 久久精品夜色噜噜亚洲a∨| 蜜臀aⅴ国产精品久久久国产老师| 秋霞av亚洲一区二区三| 国产肥臀一区二区福利视频| 国产在线成人| 吴梦梦av在线| 国产精品久久久久久影院8一贰佰| 免费精品视频一区| 欧美黑白配在线| 国产精品theporn88| 日韩有码欧美| 国产精品视频xxxx| 久久sese| 国产91在线播放九色快色| 91九色国产在线播放| 欧美成人三级视频网站| 黄色网址免费在线观看| 中国日韩欧美久久久久久久久| 你懂的视频在线观看| 亚洲精品久久久久久下一站| 亚洲第一视频在线| 欧美videos大乳护士334| 国产精品毛片一区二区在线看舒淇| 欧美亚洲一区三区| 免费看污视频的网站| 色综合久久中文综合久久97| 三级黄色在线视频| 婷婷久久综合九色综合伊人色| 久久综合加勒比| 亚洲精品视频在线观看网站| 9999热视频| 一区二区三区视频在线看| 久久中文免费视频| 一区二区三区四区在线免费观看| 欧洲第一无人区观看| 国产男男chinese网站| 久久久久国产精品免费免费搜索| 99久久人妻无码中文字幕系列| 99久久亚洲一区二区三区青草| 亚洲一区二区三区黄色| 成人a免费在线看| 双性尿奴穿贞c带憋尿| 久久综合九色综合欧美亚洲| 老牛影视av老牛影视av| 国产视频亚洲色图| 亚洲一区电影在线观看| 亚洲免费视频成人| 国产无套在线观看| 狠狠色狠狠色综合日日五| 青青国产在线视频| 欧美日韩综合在线| 精品人妻一区二区三区换脸明星| 欧美大片日本大片免费观看| 色呦呦免费观看| 亚洲视频综合网| 免费的黄网站在线观看| 欧美高清激情视频| 中文字幕在线官网| 国产女人18毛片水18精品| 无码国模国产在线观看| 久久久久久国产精品mv| 久久精品国产大片免费观看| 国产成人生活片| 在线亚洲欧美| 视频在线观看免费高清| 成人动漫一区二区| 国产又粗又猛又爽又黄av| 亚洲乱码国产乱码精品精可以看 | 欧美色图一区| 国产精品一区在线免费观看| 亚洲精品偷拍| www.这里只有精品| 成人午夜私人影院| 欧美激情亚洲色图| 亚洲一区二区精品3399| 日韩黄色一级视频| 精品精品国产高清一毛片一天堂| 欧洲亚洲精品视频| 欧美丰满片xxx777| 在线一区视频观看| 国产区一区二区| 欧美超碰在线| 欧美亚洲一二三区| 国产美女精品人人做人人爽 | 性欧美18一19性猛交| 亚洲欧美自拍一区| 欧美一卡二卡| 91精品免费看| 免费国产自久久久久三四区久久| 国产系列第一页| 日韩va亚洲va欧美va久久| 动漫美女无遮挡免费| 中文字幕一区二区三中文字幕| √资源天堂中文在线| 日韩欧美一级二级三级久久久| 黄色片在线免费观看| 久久久久久91香蕉国产| 电影91久久久| 水蜜桃亚洲精品| 日韩午夜电影| 大桥未久恸哭の女教师| 亚洲男人的天堂网| 亚洲午夜精品久久久| 亚洲一区二区久久久| 在线观看网站免费入口在线观看国内 | 日韩资源av在线| 制服诱惑一区二区| 欧美午夜精品一区二区| 亚洲色图一区二区| 中文字幕自拍偷拍| 中国日韩欧美久久久久久久久| 欧美freesex| 久久婷婷人人澡人人喊人人爽| 国产一区二区三区四区老人| 久久久福利影院| 国产精品国产三级国产aⅴ无密码| 一级黄色av片| 一本色道久久综合狠狠躁篇怎么玩| 国产传媒在线| 国内精品二区| 国产精品久久国产愉拍| 亚洲欧美高清在线| 天天综合天天做天天综合| 成人午夜免费福利| 高清欧美电影在线| 国产福利一区二区精品秒拍| 亚洲精品蜜桃久久久久久| 成人综合在线网站| 免费一级片在线观看| 精品第一国产综合精品aⅴ| 欧美v亚洲v| 精品国产乱码久久久久| 一本色道久久综合亚洲精品高清| 国产a级黄色片| 天天射综合影视| 欧美色综合一区二区三区| 国产成人在线一区二区| 国产成人调教视频在线观看| 草草草在线视频| 国产精品视频在线看| 91theporn国产在线观看| 久久人人爽亚洲精品天堂| 欧美一区一区| 成人免费毛片在线观看| 91蝌蚪porny| 精品国产www| 久久国产精品久久久久| 亚洲精品v亚洲精品v日韩精品| 成人免费播放器| 久久久激情视频| 一区二区国产欧美| 欧美激情一区二区三区成人| 希岛爱理av免费一区二区| 男女视频一区二区三区| 亚洲欧美综合色| 少妇又色又爽又黄的视频| 日本高清久久天堂| 小小影院久久| 西西大胆午夜视频| 欧美午夜精品一区| 综合图区亚洲| 久久久久久久久一区二区| 久久精品国产免费| 国产在线拍揄自揄拍| 一道本无吗dⅴd在线播放一区| 亚洲资源在线| 99热在线这里只有精品| 国产精品无遮挡| 囯产精品久久久久久| 国产精品av电影| 欧美成人嫩草网站| 一色道久久88加勒比一| 日韩精品在线网站| 日韩三级影视| 91午夜在线观看| 国产精品婷婷午夜在线观看| 免费观看黄色av| 国产精品人成电影| 99xxxx成人网| 欧美三级黄色大片| 亚洲欧美日本精品| 99re8这里有精品热视频免费| 天美星空大象mv在线观看视频|