1. <nobr id="easjo"><address id="easjo"></address></nobr>

      <track id="easjo"><source id="easjo"></source></track>
      1. 
        

      2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
      3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>
          貴州做網站公司
          貴州做網站公司~專業!靠譜!
          10年網站模板開發經驗,熟悉國內外開源網站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等網站程序,可為您提供網站建設,網站克隆,仿站,網頁設計,網站制作,網站推廣優化等服務。我們專注高端營銷型網站,企業官網,集團官網,自適應網站,手機網站,網絡營銷,網站優化,網站服務器環境搭建以及托管運維等。為客戶提供一站式網站解決方案?。?!

          Android基于MediaBroswerService的App實現概述

          來源:互聯網轉載 時間:2024-01-29 08:09:38

          前言

          如何實現一個音樂播放App,然后讓其可以被第三方的Android app打開,并獲取其中的歌單,曲目列表,同時控制其播放呢?現有應用市場上,已經有相應的實現。比如百度CarLife對QQ音樂,喜馬拉雅等的調用。

          image.png

          image.png

          在百度的Carlife App中,我們可以看到,只要我們本地的裝了QQ音樂App,其就可以喚起,然后獲取其中的歌曲數據,然后進行播放,這個是如何實現的呢?

          需求

          • 可以獲取音樂播放器的歌曲列表
          • 可以控制音樂播放器的播放
          • 可以將音樂播放器的狀態同步到第三方App
          • 能夠和第三方App間進行相互通信

          類似于CarLife 對音樂App的喚起,首先第三方App開啟后,即可拉起音樂App,然后獲取其中的歌單,打開歌單之后,獲取歌單內的歌曲列表,點擊進行播放,可以進行播放,暫停,下一首,上一首的控制。

          技術實現

          谷歌官方提供了MediaBroswerService,通過其可以幫助我們實現上述的需求。

          MediaBroswerService

          • Android多媒體架構

          Android多媒體播放采用client,server架構,一個server可以對應多個client,client在使用的時候需要先連接到server,雙方通過設置的一些callback來進行狀態的同步。

          image.png

          使用MediaBrowserService播放

          image.png

          客戶端需要創建MediaBrowser,服務端需要實現MediaBrowserService,在建立連接后,兩端之間的交互主要通過MediaController和MediaSession。兩個類之間通過預先定義的callback進行交互,MediaSession控制著播放器的播放,MediaController來控制著UI的變化。

          image.png

          • Media session

          一個session持有了播放器的狀態和關于正在播放的一些信息,一個seesion可以接收來自一個或多個媒體播放器的callback。這使得通過其它設備來控制成為可能。

          • Media controller

          我們的UI只是和Media controller交互,而不是Player 本身,Media controller會將一些控制信息傳遞給Media Session,它也會在seesion發生變化的時候,得到來自session的回調,一個media controller一次只可以連接一個session。當使用一個media contoller和Session的時候,我們可以在運行期部署多個播放器,在其執行的時候根據設備去修改app的外觀。

          使用MediaBrowserService可以讓Android Wear, Auto非常容易找我們的App,連接它,瀏覽它的內容,控制其播放,而完全不需要接觸我們的UI Activity。

          服務端實現

          • 服務端基礎配置

          mainfeat 配置

          <service android:name=".MediaPlaybackService">  <intent-filter>    <action android:name="android.media.browse.MediaBrowserService" />  </intent-filter></service>

          MediaPlaybackService的初始化

          public class MediaPlaybackService extends MediaBrowserServiceCompat {  @Override  public void onCreate() {    super.onCreate();    // 1. 初始化 MediaSession        mSession = new MediaSessionCompat(this, "MusicService");    // 2. 設置 MedisSessionCallback        mSession.setCallback(mSessionCallback);    // 3. 開啟 MediaButton 和 TransportControls 的支持        mSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |                 MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);    // 4. 初始化 PlaybackState         mStateBuilder = new PlaybackStateCompat.Builder()                 .setActions(                         PlaybackStateCompat.ACTION_PLAY | PlaybackStateCompat.ACTION_PLAY_PAUSE);         mSession.setPlaybackState(mStateBuilder.build());    // 5. 關聯 SessionToken         setSessionToken(mSession.getSessionToken());  }}

          根據包名做權限判斷之后,返回根路徑

            @Override  public BrowserRoot onGetRoot(String clientPackageName, int clientUid, Bundle rootHints) {    // 根據包名對每個訪問端做一些訪問權限判斷等  }

          用來根據mediaID來返回第三放App所需要獲得媒體數據

            @Override  public void onLoadChildren(final String parentMediaId,    final Result<List<MediaItem>> result) {    // 根據parentMediaId返回播放列表相關信息  }

          客戶端連接

          private void initMediaBrowser() {    //1.待連接的服務    componentname componentName = new ComponentName("com.example.android.uamp","com.example.android.uamp.MusicService");    //2.創建MediaBrowser    mMediaBrowser = new MediaBrowserCompat(this, componentName, mConnectionCallbacks, null);    //3.建立連接    mMediaBrowser.connect();}

          設置相應的callback,連接Callback,數據變化Callback

          連接狀態同步

          數據變化Callback設置

          private final MediaBrowserCompat.ConnectionCallback mConnectionCallbacks =        new MediaBrowserCompat.ConnectionCallback() {      @Override      public void onConnected() {        //連接成功回調       }       @Override       public void onConnectionSuspended() {       //連接中斷回調       }      @Override      public void onConnectionFailed() {        //連接失敗回調     }};
          MediaControllerCompat.Callback controllerCallback =    new MediaControllerCompat.Callback() {          public void onSessionDestroyed() {         //Session銷毀        }        @Override        public void onRepeatModeChanged(int repeatMode) {          //循環模式發生變化        }        @Override        public void onShuffleModeChanged(int shuffleMode) {          //隨機模式發生變化        }        @Override        public void onMetadataChanged(MediaMetadataCompat metadata) {        //數據變化        }        @Override        public void onPlaybackStateChanged(PlaybackStateCompat state) {        //播放狀態變化        }};

          客戶端與服務端數據交互

          MediaBrowser通過調用subscribe,會回調到MediaService的onLoadChildren,在這里做一個判斷然后構造相應的列表將列表數據返回。返回數據之后。

          • 根據MediaID獲取數據

          客戶端通過調用subscribe方法,傳遞MediaID,在SubscriptionCallback的方法中進行處理。

          mMediaBrowser.subscribe("ID", new MediaBrowserCompat.SubscriptionCallback() {    @Override    public void onChildrenLoaded(@NonNull String parentId, @NonNull List<MediaBrowserCompat.MediaItem> children) {       //children 為來自Service的列表數據    }});

          服務端和客戶端之間傳遞的數據為MediaItem列表。MediaItem中具備的字段:MediaId,Title,SubTitle,Description,Icon,IconUri,MediaUri等字段。通過其可以幫助我們攜帶一些數據來進行歌曲的展示和播放。

           @Override public void onLoadChildren(@NonNull final String parentMediaId,                            @NonNull final Result<List<MediaItem>> result) {     List<MediaItem> items = new ArrayList<>();      //根據MediaID做數據填充     switch (parentMediaId) {         case:         default: break;     }     result.sendResult(items); }
          • 發送自定義數據獲取內容

          客戶端通過調用sendCustomAction,根據與服務端的協商,制定相應的action類型,進行數據的傳遞交互。

          mMediaBrowser.sendCustomAction(action, extras, new MediaBrowserCompat.CustomActionCallback() {    @Override    public void onProgressUpdate(String action, Bundle extras, Bundle data) {        super.onProgressUpdate(action, extras, data);    }    @Override    public void onResult(String action, Bundle extras, Bundle resultData) {        super.onResult(action, extras, resultData);    }    @Override    public void onerror(String action, Bundle extras, Bundle data) {        super.onerror(action, extras, data);    }});

          服務端實現onCustomAction,根據action類型返回相應的數據

           @Override public void onCustomAction(@NonNull String action, Bundle extras, @NonNull Result<Bundle> result) {      //分支判斷     if (GET_LIST.equals(action)) {         Bundle bundle = new Bundle();         ArrayList<String> list = new ArrayList<>();          //填充數據         bundle.putStringArrayList(LIST_NAMES, list);         result.sendResult(bundle);     } }

          播放控制

          • 客戶端

          客戶端通過getMediaController getTransportControls()來進行播放,暫停,上一首,下一首的控制。

          //獲取播放狀態int pbState = MediaControllerCompat.getMediaController(MainActivity.this).getPlaybackState().getState();//根據播放狀態進行播放控制if (pbState == PlaybackStateCompat.STATE_PLAYING) {    MediaControllerCompat.getMediaController(MainActivity.this).getTransportControls().pause();} else {    MediaControllerCompat.getMediaController(MainActivity.this).getTransportControls().play();}
          • 服務端

          在服務端為MediaSession設置SessionCallback,來實現相應的播放功能。

          mSession.setCallback(mSessionCallback);

          image.png

          客戶端通過MediaController可以進行播放,暫停,根據MediaID播放下一個音樂,音樂播放快進等。所有的操作會回調到服務端的MediaSessionCallback的play,seekTo等方法,需要我們自己實現,在其中控制播放隊列,然后根據列表播放的情況來動態的變更隊列。

          播放狀態同步

          對于播放狀態的同步,比如當前播放到哪一個歌曲,當前是暫停還是播放中??蛻舳送ㄟ^Controller回調就可以得到相應的變化,但是,變化狀態,服務端如何發送呢?

          setMetadata(android.media.MediaMetadata));setPlaybackState(android.media.session.PlaybackState));

          設置當前的歌曲信息,設置當前的播放狀態。設置之后,客戶端將會得到更新。

          獲取手機內的媒體服務

          private void discoverBrowseableMediaApps(Context context) {    PackageManager packageManager = context.getPackageManager();    Intent intent = new Intent(MediaBrowserService.SERVICE_INTERFACE);    List<ResolveInfo> services = packageManager.queryIntentServices(intent, 0);    for (ResolveInfo resolveInfo : services) {        if (resolveInfo.serviceInfo != null && resolveInfo.serviceInfo.applicationInfo != null) {            ApplicationInfo applicationInfo = resolveInfo.serviceInfo.applicationInfo;            String label = (String) packageManager.getApplicationLabel(applicationInfo);            Drawable icon = packageManager.getApplicationIcon(applicationInfo);            String className = resolveInfo.serviceInfo.name;            String packageName = resolveInfo.serviceInfo.packageName;            MusicService service = new MusicService();            service.icon = icon;            service.lable = label;            service.className = className;            service.packageName = packageName;            musicServiceList.add(service);        }    }}

          結語

          通過本篇文章,對MediaBroswerService做了一個簡單的介紹,但對于播放器的具體實現,特別是在服務端還是比較復雜的,需要維護歌曲隊列,進行播放,同時負責狀態的更新。

          標簽:broswer-

          網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...

          在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...

          在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...

          天津高中有游泳隊的學校有哪些?的天津高中有很多學校有游泳隊,包括天津一中、天津華鑰中學、天津南開中學、天津新華中學、天津實驗中學等。天津一中怎么樣?那個 這是個好問題。查了很多資料,買了很多書,咨詢了很多人。我終于可以回答這個問題了。希望我的回答能幫到你。以下是我的回答。如果有不同意見,可以進一步討論:天津市第一中學是天津市五大名校之一,也是天津市教委直屬的重點高中之一,有著70年的悠久歷史。我去...

          太原最好的十大公立幼兒園?排名前十的公立幼兒園是。省立幼兒園。于穎幼兒園軍區幼兒園。等一下。但是,家長不應該在幼兒園承擔教育的全部責任,而應該花時間陪伴和教育孩子,讓孩子有安全感,健康成長。太原最好的十大公立幼兒園?太原的頂尖幼兒園,希望對有需要的家長有用。1、于穎太原市少年?種植植物的土地/公共娛樂場所2、太原揚帆少年?種植植物的土地/公共娛樂場所3.太原藍盾少年?種植植物的土地/公共娛樂場所4...

          筆記本無線網卡一個月多少錢?筆記本聯通無線上網卡的收費是上網0.01元/KB,短信0.10元/條。無線網卡的數量有限。當用戶當月無線上網的數據流量達到15GB時,系統會自動關閉用戶數據功能,下月自動開啟,系統會提供短信流量提醒功能。上網費不區分本地和漫游,在國內任何3G網絡覆蓋區域(不含臺港澳)都是一個價。套餐按流量計費,計費單位為MB,不足1MB的部分為1MB。套餐不自動升級,超出套餐的流量按實...

          TOP
          国产初高中生视频在线观看|亚洲一区中文|久久亚洲欧美国产精品|黄色网站入口免费进人
          1. <nobr id="easjo"><address id="easjo"></address></nobr>

              <track id="easjo"><source id="easjo"></source></track>
              1. 
                

              2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
              3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>