2014-02-21 24 views
0

我試圖將媒體控件添加到我的應用程序,但無法讓RemoteMediaPlayer發送命令。 視頻開始播放,但後來我無法控制它。 這是我使用的代碼:Chromecast Android SDK:RemoteMediaPlayer在嘗試控制時始終以IllegalStateException結尾

RemoteMediaPlayer mRemoteMediaPlayer = new RemoteMediaPlayer(); 
       try { 
    Cast.CastApi.setMessageReceivedCallbacks(apiClient, mRemoteMediaPlayer.getNamespace(), mRemoteMediaPlayer); 

         MediaMetadata mediaMetadata = new MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE); 
         JSONObject jsonExtra = new JSONObject(); 
         mediaMetadata.putString(MediaMetadata.KEY_TITLE, "My video"); 

         if (mediaType != null) { 
          jsonExtra.put("type", mediaType); 
         } 
         if ("audio".equals(mediaType)) { 
          mimeType = "audio/mp3"; 
         } 
         com.google.android.gms.cast.MediaInfo.Builder builder = new MediaInfo.Builder(getUrl()).setContentType(mimeType).setMetadata(mediaMetadata).setCustomData(jsonExtra); 
         builder.setStreamType(MediaInfo.STREAM_TYPE_BUFFERED); 

         MediaInfo mediaInfo = builder.build(); 
         mRemoteMediaPlayer.load(apiClient, mediaInfo, true, inititalTime).setResultCallback(new ResultCallback<RemoteMediaPlayer.MediaChannelResult>() { 
          @Override 
          public void onResult(MediaChannelResult result) { 
           if (result.getStatus().isSuccess()) { 
            log(context, "Media loaded successfully"); 
           } 
          } 
         }); 
         Thread.sleep(5000); 
         mRemoteMediaPlayer.pause(apiClient); 
} catch (IllegalStateException e) { 
        log(context, "Problem occurred with media during loading " + e); 
       } catch (IOException e) { 
        log(context, "Problem occurred with media during loading " + e); 
       } catch (JSONException e) { 
        log(context, "Problem occurred with media during loading " + e); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

你可能會注意到,在最後我等待5秒鐘,以確保在播放視頻時,然後嘗試暫停。 這總是導致與消息的IllegalStateException:

沒有當前媒體會話

我缺少的東西? 我還注意到,在視頻開始播放後,絕不會調用ResultCallback。也許這也與我遇到的同一問題有關。

在此先感謝。

回答

0

運行這段代碼時並不清楚。不要像你那樣設置睡眠;您必須在mRemoteMediaPlayer上註冊回調,以便在遠程播放器上更改狀態或元數據時收到通知。當狀態改變監聽器被調用時,通過調用mRemoteMediaPlayer.getMediaStatus().getPlayerState()並根據狀態(是否播放,緩衝,空閒,暫停)來獲得更新狀態,做出相應的決定。在異步系統中,永遠不要使用「sleep()」,總是鉤住回調。

+0

謝謝Ali Naddaf,但正如我所提到的,我的回調沒有被調用。上面的代碼是否足以接收回調?代碼與此處非常相似:https://developers.google.com/cast/docs/android_sender我在連接到Chromecast後調用了此應用,並且我的接收器應用已啓動並準備播放。這是在實現ResultCallback 的類中的onResult方法中。希望澄清它。 – joaomgcd

+0

您正在混合兩種不同的回調;您在上面顯示的PendingResult回調僅僅是從框架告訴您命令已發送。我正在談論的另一個回調是使用mRemoteMediaPlayer.setOnStatusUpdatedListener(..)和mRemoteMediaPlayer.setOnMetadataUpdatedListener(..)設置的,並且它們在接收端發送更新後的播放器狀態或元數據。 –

+0

謝謝,這些回調工作。 :)但原來的問題仍然存在。在嘗試執行mRemoteMediaPlayer.pause(apiClient)時,我總是得到「沒有當前媒體會話」;還有什麼我錯過了這個工作?何時可以使用遠程播放器控件?我是否需要等待某個狀態更新? – joaomgcd

-2

您需要Android SDK中的google-play-services_lib庫。

http://developer.android.com/google/play-services/setup.html

複製谷歌播放services_lib庫項目到您的工作空間(文件夾,你的Android地圖項目)。該庫項目可以在以下路徑下找到。

/android-sdk-folder/extras/google/google_play_services/ 

導入庫項目到Eclipse

點擊文件>導入,選擇Android的>將現有Android代碼到工作區,並瀏覽工作​​區導入庫項目。你可以檢查它是否是圖書館項目。右鍵點擊圖書館項目。轉到屬性。點擊左側面板上的Android。你會看到Is Library被選中。

右鍵單擊您的Android項目轉到屬性。選擇Android左側面板。 點擊添加並瀏覽圖書館項目。選擇相同的。點擊確定並應用。

+0

謝謝,但我已經設置了Google Play服務。 – joaomgcd

+0

好吧,**但爲什麼投票下來??? !! ** –

+1

對不起。那是因爲這個問題已經提到了他的SDK中的類和方法,所以要回答我應該使用sdk在這種情況下是不相關的。 – joaomgcd

相關問題