2016-05-18 2 views
1

Я работаю над приложением, которое может передавать некоторые данные на Chromecast через remote display. В моем приложении у меня может быть поведение, когда пользователь может покинуть экран и через некоторое время вернуться туда еще раз. Но я должен знать, что устройство подключено к Chromecast, потому что приложение должно показывать другие данные таким образом. Два класса ниже, которые я использую для подключения к Chromecast (только эти два класса, я больше ничего не использую). Я подумал, может быть, у MediaRouter есть некоторые данные о соединении, но я ничего не нашел. Так что мой вопрос, как обнаружить, что текущее устройство подключено к CHROMECAST &Как узнать, что устройство подключено к chromecast

ChromecastController.java

public class ChromecastController implements MediaRouterCallback.IChromecastCallback { 

    private MediaRouterCallback mMediaRouterCallback; 
    private MediaRouteSelector mMediaRouteSelector; 
    private MediaRouter mMediaRouter; 

    public void initMediaRouter(MediaRouteButton mediaRouteButton, FragmentActivity activity, MediaRouterCallback.IChromecastCallback callback) { 
     // Configure Cast device discovery 
     mMediaRouter = MediaRouter.getInstance(M2MAppImpl.getContext()); 
     mMediaRouteSelector = new MediaRouteSelector.Builder() 
       .addControlCategory(
         CastMediaControlIntent.categoryForCast(CAST_ID)) 
       .build(); 
     mediaRouteButton.setRouteSelector(mMediaRouteSelector); 
     mMediaRouterCallback = new MediaRouterCallback(activity, M2MApp.getContext()); 
    } 

    public void onStart() { 
     mMediaRouter.addCallback(mMediaRouteSelector, mMediaRouterCallback, 
       MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN); 
    } 

    public void onStop() { 
     mMediaRouter.removeCallback(mMediaRouterCallback); 
    } 

} 

MediaRouterCallback.java

public class MediaRouterCallback extends MediaRouter.Callback { 

    public static final String TAG = MediaRouterCallback.class.getName(); 

    private CastDevice mSelectedDevice; 
    private FragmentActivity activity; 
    private Context mContext; 

    public MediaRouterCallback(FragmentActivity activity, Context context){ 
     this.activity = activity; 
     mContext = context; 
    } 

    @Override 
    public void onRouteSelected(MediaRouter router, MediaRouter.RouteInfo info) { 
     Log.d(TAG, "onRouteSelected " + info.getName()); 

     mSelectedDevice = CastDevice.getFromBundle(info.getExtras()); 

     Intent intent = new Intent(mContext, 
       activity.getClass()); 
     intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
     PendingIntent notificationPendingIntent = PendingIntent.getActivity(
       mContext, 0, intent, 0); 

     CastRemoteDisplayLocalService.NotificationSettings settings = 
       new CastRemoteDisplayLocalService.NotificationSettings.Builder() 
         .setNotificationPendingIntent(notificationPendingIntent).build(); 

     CastRemoteDisplayLocalService.startService(
       M2MApp.getContext(), 
       PresentationService.class, ChromecastController.CAST_ID, 
       mSelectedDevice, settings, 
       new CastRemoteDisplayLocalService.Callbacks() { 
        @Override 
        public void onServiceCreated(CastRemoteDisplayLocalService castRemoteDisplayLocalService) { 
         Log.d(TAG, "CHROMECAST onServiceCreated"); 
        } 

        @Override 
        public void onRemoteDisplaySessionStarted(
          CastRemoteDisplayLocalService service) { 
         Log.d(TAG, "CHROMECAST onRemoteDisplaySessionStarted"); 
         // initialize sender UI 
        } 

        @Override 
        public void onRemoteDisplaySessionError(
          Status errorReason){ 
         Log.d(TAG, "CHROMECAST onRemoteDisplaySessionError " + errorReason); 
        } 
       }); 
    } 

    @Override 
    public void onRouteUnselected(MediaRouter router, MediaRouter.RouteInfo info) { 
     Log.d(TAG, "onRouteUnselected " + info.getName()); 
    } 


} 

ответ

0

Проверьте MediaRouter.RouteInfo, который вы получите в onRouteSelected обратного вызова , getDeviceType() должен быть способ пойти.

+0

Но что, если пользователь покинет этот экран и вернется туда снова. Как я узнаю о RouteInfo таким образом? – Dima

+0

Вы получите обратный вызов onRouteUnselected, когда он снова отключится от chromecast и onRouteSelected, когда он снова подключится. – leoderprofi

+0

Но если пользователь покидает экран, приложение не будет иметь этот обратный вызов (потому что этот обратный вызов подключен к экрану). И когда он вернется на экран назад, он ничего не получит (потому что хромометр уже подключен или отключен). – Dima

0

Наконец-то я нашел, как управлять им. Также это решение от удаленного образца. Я не знаю, почему я не смотрел на него, прежде чем)

private boolean isRemoteDisplaying() { 
    return CastRemoteDisplayLocalService.getInstance() != null; 
} 

возвращает истину, если CastRemoteDisplayLocalService работает.

Смежные вопросы