2017-10-08 61 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