/** * @param sinkId The id of the sink to find among known media routes. * @param router The instance of {@link MediaRouter} to enumerate the routes with. * @return A {@link MediaSink} corresponding to the {@link RouteInfo} with the specified id if * found, null otherwise. */ @Nullable public static MediaSink fromSinkId(String sinkId, MediaRouter router) { for (MediaRouter.RouteInfo route : router.getRoutes()) { MediaSink sink = MediaSink.fromRoute(route); if (sink.getId().equals(sinkId)) return sink; } return null; } }
@Override public void startObservingMediaSinks(String sourceId) { if (mAndroidMediaRouter == null) return; MediaSource source = MediaSource.from(sourceId); if (source == null) return; MediaRouteSelector routeSelector = source.buildRouteSelector(); if (routeSelector == null) { // If the application invalid, report no devices available. onSinksReceived(sourceId, new ArrayList<MediaSink>()); return; } String applicationId = source.getApplicationId(); DiscoveryCallback callback = mDiscoveryCallbacks.get(applicationId); if (callback != null) { callback.addSourceUrn(sourceId); return; } List<MediaSink> knownSinks = new ArrayList<MediaSink>(); for (RouteInfo route : mAndroidMediaRouter.getRoutes()) { if (route.matchesSelector(routeSelector)) { knownSinks.add(MediaSink.fromRoute(route)); } } callback = new DiscoveryCallback(sourceId, knownSinks, this, routeSelector); mAndroidMediaRouter.addCallback( routeSelector, callback, MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY); mDiscoveryCallbacks.put(applicationId, callback); }