2017-10-08 41 views
1

我有了這個用例:開始投會話鑄造設備

  1. 檢測投射設備,並保存它們的ID,名稱和信息;
  2. 以自動方式,連接到預定義的設備,並用一些內容開始會話 。

我研究了谷歌演員API第3版,它似乎真的很難。雖然使用v2,發件人應用程序可以控制90%的過程,即與設備和加載內容的連接,但v3會話完全由框架管理,會話僅在用戶支持下開始。在我的使用情況下,唯一值得使用的方法是SessionManager.startSession(Intent intent)doc here,但它完全沒有文檔說明如何使用意圖,額外參數,操作等。有沒有人對這種方法和意圖有一些瞭解?

回答

0

如果你正在尋找代碼示例,您可以檢查googlecast/CastVideos-android作爲參考。

另外如何使用SessionManager在How session management works

的角色框架提到引入了一個會話,其包括 連接到設備,發射(或連接)的接收器的應用程序, 連接到的概念應用程序,並初始化媒體控制通道,如果 合適。從用戶的角度來看,當 用戶從演員對話框選擇一個接收器和停止時,無論是 用戶在會話開始選擇停止投放,或者直到另一個發件人蒙上東西 相同的設備。

會話由SessionManager類管理,您的應用可以通過CastContext.getSessionManager()訪問 。單獨的會話是由類Session的子類表示的 。例如, CastSession用Cast設備表示會話。您的應用可以訪問 當前處於活動狀態的Cast會話 SessionManager.getCurrentCastSession()。

您的應用可以使用SessionManagerListener類監視會話 事件,如創建,暫停,恢復和終止。當會話處於活動狀態時, 框架會自動嘗試從非正常/突然 終止中恢復。

會話被創建,並且響應於用戶從對話框MediaRouter手勢 自動拆除。

如果你需要知道的會話的狀態變化,可以 實現SessionManagerListener。本示例監聽活動中CastSession的可用性 。

public class MyActivity extends Activity { 
    private CastSession mCastSession; 
    private SessionManager mSessionManager; 
    private final SessionManagerListener mSessionManagerListener = 
      new SessionManagerListenerImpl(); 
    private class SessionManagerListenerImpl implements SessionManagerListener { 
     @Override 
     public void onSessionStarted(Session session, String sessionId) { 
      invalidateOptionsMenu(); 
     } 
     @Override 
     public void onSessionResumed(Session session, boolean wasSuspended) { 
      invalidateOptionsMenu(); 
     } 
     @Override 
     public void onSessionEnded(Session session, int error) { 
      finish(); 
     } 
    } 
    @Override 
    protected void onCreate() { 
     mSessionManager = CastContext.getSharedInstance(this).getSessionManager(); 
     super.onCreate(); 
    } 
    @Override 
    protected void onResume() { 
     mCastSession = mSessionManager.getCurrentCastSession(); 
     mSessionManager.addSessionManagerListener(mSessionManagerListener); 
     super.onResume(); 
    } 
    @Override 
    protected void onPause() { 
     super.onPause(); 
     mSessionManager.removeSessionManagerListener(mSessionManagerListener); 
     mCastSession = null; 
    } 
} 
0

最近我有同樣的要求。

可以使用MediaRouter檢測投射設備。

MediaRouter mMediaRouter = MediaRouter.getInstance(this); 
MediaRouteSelector mMediaRouteSelector = new MediaRouteSelector.Builder() 
      .addControlCategory(CastMediaControlIntent.categoryForCast(getString(R.string.cast_app_id))) 
      .build(); 
mMediaRouter.addCallback(mMediaRouterCallback, mMediaRouterCallback, MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY); 

// Then get your media routes using 
List<RouteInfo> routes = mMediaRouter.getRoutes() 

// Get cast devices for your media routes. 
// Save these for future use as per your use case 
List<CastDevice> castDevices = routes.stream() 
    .map(route -> CastDevice.getFromBundle(route.getExtras())) 
    .collect(Collectors.toCollection()) 

要自動連接到投射設備並傳輸一些內容,請使用此代碼段。請注意,您可能無法使用RemoteMediaPlayer,具體取決於您的接收器應用程序。這段代碼工作對我來說,因爲我的接收器應用程序使用MediaManager

// Connect to the cast device you want to stream the content to 
private void connectToCastDevice(CastDevice castDevice) { 
    Cast.CastOptions apiOptions = Cast.CastOptions.builder(castDevice, mCastListener).build(); 
    mApiClient = new GoogleApiClient.Builder(this) 
      .addApi(Cast.API, apiOptions) 
      .addConnectionCallbacks(mConnectionCallback) 
      .addOnConnectionFailedListener(mConnectionFailedListener) 
      .build(); 
    mApiClient.connect(); 
} 

// After you are connected to the cast device. Load your media to it 
// In my case using RemoteMediaPlayer 
private void loadMediaItem(final MediaInfo mediaInfo) { 
    LaunchOptions launchOptions = new LaunchOptions(); 
    launchOptions.setRelaunchIfRunning(false); 

    PendingResult<Cast.ApplicationConnectionResult> result = Cast.CastApi.launchApplication(mApiClient, getString(R.string.cast_app_id), launchOptions); 

    result.then(new ResultTransform<Cast.ApplicationConnectionResult, RemoteMediaPlayer.MediaChannelResult>() { 

     @Nullable @Override 
     public PendingResult<RemoteMediaPlayer.MediaChannelResult> onSuccess(@NonNull Cast.ApplicationConnectionResult applicationConnectionResult) { 
      Log.d(TAG, "Application launch result: " + applicationConnectionResult); 
      return mRemoteMediaPlayer.load(mApiClient, mediaInfo); 
     } 

    }).andFinally(new ResultCallbacks<RemoteMediaPlayer.MediaChannelResult>() { 

     @Override 
     public void onSuccess(@NonNull RemoteMediaPlayer.MediaChannelResult mediaChannelResult) { 
      Log.d(TAG, "Media channel result: " + mediaChannelResult); 
     } 

     @Override 
     public void onFailure(@NonNull Status status) { 
      Log.d(TAG, "Media channel status: " + status); 
     } 

    }); 
} 
+0

您正在使用過時的代碼,v2是沒有更多的支持,這個答案沒有回答我的問題。 – greywolf82

+0

您可以使用它來[啓動會話](https://developer.android.com/reference/android/support/v7/media/MediaControlIntent.html#ACTION_START_SESSION)。 [示例代碼](https://github.com/KevinDyer/Chromecast-PlaySpace/blob/master/DemoCastPlayer/src/com/google/android/gms/cast/samples/democastplayer/MrpCastPlayerActivity.java#L274)。請注意,如果在播放媒體時未指定會話ID,[播放媒體](https://developer.android.com/reference/android/support/v7/media/MediaControlIntent.html#ACTION_PLAY)會創建一個新會話。 – Rishabh

+0

您可以選擇答案中提到的媒體路由,然後使用[RemotePlayBack](https://developer.android.com/guide/topics/media/mediarouter.html)客戶端爲您管理會話。 – Rishabh