【问题标题】:How to know that a device connected to chromecast如何知道连接到 chromecast 的设备
【发布时间】:2016-09-15 13:03:53
【问题描述】:

我正在开发可以通过 remote display 在 Chromecast 上投射一些数据的应用程序。在我的应用程序中,我可以有用户可以离开屏幕并在一段时间后再次返回屏幕的行为。但我必须知道该设备已连接到 Chromecast,因为应用程序必须以这种方式显示另一个数据。下面的两个类我用来连接到 Chromecast(只有这两个类,我不使用其他任何东西)。我想也许 MediaRouter 有一些关于连接的数据,但我什么也没找到。所以我的问题是,如何检测当前设备已连接到 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());
    }


}

【问题讨论】:

    标签: android chromecast


    【解决方案1】:

    检查您在onRouteSelected 回调中获得的MediaRouter.RouteInfogetDeviceType() 应该是要走的路。

    【讨论】:

    • 但是如果用户离开这个屏幕并再次返回那里会怎样。这样我怎么知道RouteInfo?
    • 当他从 chromecast 断开连接时你会得到 onRouteUnselected 回调,当他重新连接时你会再次得到 onRouteSelected。
    • 但是如果用户离开屏幕,应用程序不会有这个回调(因为这个回调连接到屏幕)。当他返回屏幕时,它不会收到任何东西(因为 chromecast 已经连接或断开连接)。
    【解决方案2】:

    最后,我找到了管理它的方法。它也是来自cast remote sample的解决方案。不知道为什么我以前没看过)

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

    如果 CastRemoteDisplayLocalService 正在工作,则返回 true。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-02
      • 2014-04-17
      • 2014-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-13
      • 2017-03-21
      相关资源
      最近更新 更多