미디어 브라우저 서비스 정보(MediaBrowserService)

12884 단어 Android
오늘 말한 이 주제는 미디어 재생과 관련이 있는데 특히 음악 재생은 음악 재생을 하면 모두 음악 앱을 사용한 적이 있을 것이다.일반적으로 하나의 음악 앱의 실현은 주로 다음과 같은 몇 가지와 관련된다.서버에서 음악 데이터 가져오기 2.음악을 재생할 때 플레이어의 다양한 재생 상태와 서로 다른 상태의 UI 전시 3.재생하는 동안 UI 인터페이스를 통해 플레이어의 다양한 상태를 제어합니다. 4.UI는 재생 서비스와 어떻게 연결되고 상태가 동기화되는지 제어합니다 4.어떻게 백그라운드 재생 과정 중 재생 서비스가 죽지 않도록 보장합니까
위의 몇 가지 점에 대해 사실Android은 우리에게 완전한 해결 방안을 제공했다. 이것은 이러한 조작을 잘 봉인했다. 우리는 데이터의 획득과 노래의 재생에 주목하면 된다.Android에서 사용할 수 있는 API는 support-v4에서 호환 가능한 버전이므로 이 버전을 사용하는 것이 저버전 시스템과 호환됩니다.
관건류는 주로 다음과 같은 몇 가지가 있다.MediaBrowserServiceCompat 미디어 브라우저 서비스 2.MediaBrowserCompat 미디어 브라우저 2.MediaControllerCompat 미디어 컨트롤러 3.MediaSessionCompat 미디어 회화는 우리 하나씩 하자.
MediaBrowserServiceCompat
이 종류는 두 가지 작용이 있다.음악 재생 백그라운드 서비스 2.클라이언트에서 음악 데이터를 얻는 서비스, 모든 음악 데이터는 이 서비스를 통해 서버와 상호작용을 한다(또는 핸드폰의 로컬 음악 데이터를 직접 얻는다)
이 클래스가 Service의 하위 클래스인 것을 알았기 때문에 음악 재생의 백엔드 서비스라는 것도 이해할 수 있지만 이 클래스는 백엔드 재생 서비스로서 그 자체를 통해 직접적으로 이루어진 것이 아니라 MediaSessionCompat 미디어 회화라는 클래스를 통해 이루어진 것이다.사용 과정에서 미디어 세션은 이 서비스와 연결되고 모든 재생 작업은 MediaSessionCompat에 의해 이루어진다.
데이터를 가져오는 방법은 MediaBrowserServiceCompat의 다음과 같은 두 가지 방법으로 제어할 수 있습니다.
@Override
public BrowserRoot onGetRoot(@NonNull String clientPackageName, int clientUid,
                             Bundle rootHints) {
    /**
     *        ,          ,                 
     * */
    if(!PackageUtil.isCallerAllowed(this, clientPackageName, clientUid)) {
        return new BrowserRoot(null, null);
    }
    //              
    //    rootId    BrowserRoot            ,          
    //    null              
    return new BrowserRoot(BrowserRootId.MEDIA_ID_ROOT, null);
}

@Override
public void onLoadChildren(@NonNull String parentId, @NonNull Result> result) {

    /***
     *      parentId      onGetRoot    RootId    
     *       ,         MediaBrowserCompat.subscribe()            。
     *      subscribe()         onLoadChildren()    service ,      MediaBrowser.MediaItem(    )     
     *
     *   MediaItem      ID   ,         token。
     *               item ,   ID  。
     */
    if(BrowserRootId.MEDIA_ID_MUSIC_LIST_REFRESH.equals(parentId)) {
        //                  result.detach(),        
        result.detach();
        MusicProvider.getInstance().requestMusic(result);
        //      http       ,               result.detach();  ,       。http           result.sendResult(mMetadataCompatList);     ,           MediaBrowserCompat.SubscriptionCallback               
        //              MediaBrowser.MediaItem
    } else {
        result.detach();
    }
}

MediaBrowserCompat
앞에서 말했듯이MediaBrowserServiceCompat(매체 조회 서비스)는 데이터 요청 서비스로서 데이터를 얻는 것이기 때문에 해당하는 미디어 조회 클라이언트가 미디어 데이터의 취득 요청을 하는데 이 유형이 바로 이 클라이언트이다.앞에서 설명한 바와 같이 호출MediaBrowserCompat.subscribe() 방법을 통해 데이터 요청을 할 수 있습니다. 이 방법을 호출하기 전에 MediaBrowserCompat 미디어 조회 서비스에 연결해야 합니다. 연결 방식은 다음과 같습니다.
//        MediaBrowserServiceCompat,           token
//      token  MediaControllerCompat 
//    MediaControllerCompat     MediaSessionCompat     
MediaBrowserCompat mediaBrowser = new MediaBrowserCompat(this,
                new ComponentName(this, MusicService.class), mConnectionCallback, null);

//                
final MediaBrowserCompat.ConnectionCallback mConnectionCallback =
    new MediaBrowserCompat.ConnectionCallback() {
        @Override
        public void onConnected() {

            try {
                //   MediaBrowserServiceCompat       token
                MediaSessionCompat.Token token = mMediaBrowser.getSessionToken();
                //      token            
                //                         
                MediaControllerCompat mediaController = new MediaControllerCompat(this, token);
                //            Context    
                //      ,          UI             Context      MediaControllerCompat
                //MediaControllerCompat controller = MediaControllerCompat.getMediaController((Activity) context);
                MediaControllerCompat.setMediaController(this, mediaController);
                //                      mediaController.registerCallback(mMediaControllerCallback);
            } catch (RemoteException e) {
                onMediaControllerConnectedFailed();
            }
        }
    };

//                 
final MediaControllerCompat.Callback mMediaControllerCallback =
   new MediaControllerCompat.Callback() {
        @Override
        public void onPlaybackStateChanged(@NonNull PlaybackStateCompat state) {
            //            
            onMediaPlayStateChanged(state);
        }

        @Override
        public void onMetadataChanged(MediaMetadataCompat metadata) {

            if(metadata == null) {
                return;
            }
            //               
            onPlayMetadataChanged(metadata);
        }
    };



//      
 //     
 mediaBrowser.unsubscribe(BrowserRootId.MEDIA_ID_MUSIC_LIST_REFRESH);
 //   BrowserRootId    
 //      ,     MusicService  onGetRoot   onLoadChildren  
 //onGetRoot  (      )                      
 //                   ,      onLoadChildren        
 //                        
 mediaBrowser.subscribe(BrowserRootId.MEDIA_ID_MUSIC_LIST_REFRESH, mSubscriptionCallback);

//                    
final MediaBrowserCompat.SubscriptionCallback mSubscriptionCallback =
    new MediaBrowserCompat.SubscriptionCallback() {
        @Override
        public void onChildrenLoaded(@NonNull String parentId,
                                     @NonNull List children) {
            //          
        }

        @Override
        public void onError(@NonNull String id) {
            //         
        }
    };

MediaSessionCompat
앞에서 말했듯이 MediaBrowserServiceCompat의 미디어 재생은 사실 관련MediaSessionCompat을 통해 이루어진 것이고 그 관련 방식도 간단하다.
MediaSessionCompat mSession = new MediaSessionCompat(this, "MusicService");
setSessionToken(mSession.getSessionToken());
mSession.setCallback(new MediaSessionCompat.Callback());
mSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);

//MediaSessionCompat              MediaSessionCompat.Callback    
@Override
 public void onPlay() {
//         
//  MediaControllerCompat .getTransportControls().play();  
 }

 @Override
 public void onSkipToQueueItem(long queueId) {
     //           
     //  MediaControllerCompat .getTransportControls().onSkipToQueueItem(queueId);  
 }

 @Override
 public void onSeekTo(long position) {
     //          
     //MediaControllerCompat.getTransportControls().seekTo(position);
 }

 @Override
 public void onPlayFromMediaId(String mediaId, Bundle extras) {
//           
//MediaControllerCompat.getTransportControls().playFromMediaId(mediaItem.getMediaId(), null);        
 }

 @Override
 public void onPause() {
//     
//MediaControllerCompat.getTransportControls().pause();
 }

 @Override
 public void onStop() {
//       
//MediaControllerCompat.getTransportControls().stop();
 }

 @Override
 public void onSkipToNext() {
//        
//MediaControllerCompat.getTransportControls().skipToNext();
 }

 @Override
 public void onSkipToPrevious() {
//        
//MediaControllerCompat.getTransportControls().skipToPrevious();
 }
//          ,        
}

MediaControllerCompat
미디어 컨트롤러는 위에서 그 창설과 관련 방식을 소개했고 플레이어의 상태를 제어하는 방식은 위의 코드 주석에서 설명했고 기본적으로 MediaControllerCompat.getTransportControls()를 통해 제어했다.
여기에서 미디어 서비스의 사용과 주의점을 소개했습니다. 이api를 사용하여 음악 앱을 실현하는 것은 매우 편리하고 빠릅니다. 그리고 우리는 플레이어를 편리하게 전환할 수 있습니다. 예를 들어 MediaPlayer,ExoPlayer 등입니다. 건의와 질문이 있으면 블로그에서 스캔하고 QQ그룹 교류를 하는 것을 환영합니다.

좋은 웹페이지 즐겨찾기