【问题标题】:How do I discover a Chromecast device using Android?如何发现使用 Android 的 Chromecast 设备?
【发布时间】:2013-07-24 10:48:37
【问题描述】:

我想找到一台 Chromecast 设备并调整音量。

【问题讨论】:

    标签: android google-cast


    【解决方案1】:
    1. 获取设备
    2. 获取您的device whitelisted(您需要设备序列号和 HTML5 接收器的 URL)
    3. 您将收到两个 APPID(开发/生产)
    4. 确保在您的开发环境中更新到 Android 支持库 v18
    5. 您将使用MediaRouter
    6. 初始化

    import com.google.cast.CastContext;     
    Context applicationContext = …; CastContext castContext = new
    CastContext(applicationContext);
    
    • 您需要一个 MediaRouteButton

    < android.support.v7.app.MediaRouteButton
      android:id="@+id/media_route_button"
      android:mediaRouteTypes="user"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:visibility="visible" />
    

    import com.google.cast.CastContext; 
    import com.google.cast.CastDevice;
    import com.google.cast.MediaRouteAdapter; 
    import com.google.cast.MediaRouteHelper; 
    import com.google.cast.MediaRouteStateChangeListener;
    
    import android.support.v4.app.FragmentActivity;
    import android.support.v7.app.MediaRouteButton;
    import android.support.v7.media.MediaRouteSelector;
    import android.support.v7.media.MediaRouter;
    import android.support.v7.media.MediaRouter.RouteInfo; 
    
    public class MyCastActivity extends FragmentActivity implements MediaRouteAdapter {
         private MediaRouteButton mMediaRouteButton;
         private MediaRouter mMediaRouter;
         private MediaRouteSelector mMediaRouteSelector;
         private MediaRouter.Callback mMediaRouterCallback;
         private CastDevice mSelectedDevice;
         private MediaRouteStateChangeListener mRouteStateListener;
    
         @Override
         protected void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             setContentView(R.layout.my_cast_activity);
             mMediaRouteButton = (MediaRouteButton) findViewById(R.id.media_route_button);
    
    • 构造一个CastContext

    mCastContext = new CastContext(getApplicationContext());
    

    - 通过调用注册MinimalCastMediaRouteProvider MediaRouteHelper.registerMinimalMediaRouteProvider(),传递一个 实现 MediaRouteAdapter 接口的对象。

    MediaRouteHelper.registerMinimalMediaRouteProvider(mCastContext, this);
    mMediaRouter = MediaRouter.getInstance(getApplicationContext());
    

    • 通过调用构造一个MediaRouteSelector MediaRouteHelper.buildMediaRouteSelector()。有两种形式 这个方法:第一个不带参数,第二个带一个 接收者应用程序名称和/或消息协议列表。这 后一种形式用于执行设备过滤等效于 由 SDK 的 ApplicationSupportFilterListener 完成。

    mMediaRouteSelector = MediaRouteHelper.buildMediaRouteSelector( MediaRouteHelper.CATEGORY_CAST);
    
    • 将 MediaRouteSelector 分配给 MediaRouteButton。

    mMediaRouteButton.setRouteSelector(mMediaRouteSelector);
    

    • 实现MediaRouter.Callback并将其添加到MediaRouter, 将 CALLBACK_FLAG_REQUEST_DISCOVERY 传递给 MediaRouter 到 启动发现。当用户在 GUI 选择器,这个回调接口上对应的方法会 被调用。
        mMediaRouterCallback = new MyMediaRouterCallback();
    }
    
    @Override
    protected void onStart() {
       super.onStart();
        mMediaRouter.addCallback(mMediaRouteSelector, mMediaRouterCallback,
            MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY);
    }
    
    @Override
    protected void onStop() {
        mMediaRouter.removeCallback(mMediaRouterCallback);
        super.onStop();
    }
    
    @Override
    protected void onDestroy() {
        MediaRouteHelper.unregisterMediaRouteProvider(mCastContext);
        mCastContext.dispose();
        super.onDestroy();
    }
    
    • MediaRouter.CallbackonRouteSelected()回调中,拨打电话 到 MediaRouteHelper.requestCastDeviceForRoute() 获取 所选媒体路由的 CastDevice 对象,以及 MediaRouteStateChangeListener 需要随时通知 路由量或连接状态变化。
    private class MyMediaRouterCallback extends MediaRouter.Callback {
        @Override
        public void onRouteSelected(MediaRouter router, RouteInfo route) {
            MediaRouteHelper.requestCastDeviceForRoute(route);
        }
    
        @Override
        public void onRouteUnselected(MediaRouter router, RouteInfo route) {
            mSelectedDevice = null;
            mRouteStateListener = null;
        }
    }
    
    // MediaRouteAdapter implementation
    
    @Override
    public void onDeviceAvailable(CastDevice device,
            MediaRouteStateChangeListener listener) {
        mSelectedDevice = device;
        mRouteStateListener = listener;
    }
    
    @Override
    public void onSetVolume(double volume) {
        // Handle volume change.
    }
    
    @Override
    public void onUpdateVolume(double delta) {
        // Handle volume change.
    }
    

    }

    【讨论】:

    • 我能否在不使用 v18 库的情况下发现设备,并修改 mediarouter 源以使其依赖于 ActionBarSherlock 而不是 AppCompat?到目前为止它还没有奏效,但我想知道是否还有其他遗漏。
    • 不 - 它不能与 ActionBarSherlock 一起工作 - 至少在我上次检查时是这样。
    • 我已按照所有这些步骤...但仍然无法在电视上投射...找不到设备...我很困惑...我正在开发发件人应用程序,所以我应该需要将接收器设备列入白名单,如果我将设备列入白名单,我必须将 App ID 放在哪里......请帮助我。坚持了2天多。 @LesVogel-GoogleDevRel
    • 在设置中,您 [x] 是否将您的序列号发送给 google。您可以通过 :9222 进行测试
    • @LesVogel-GoogleDevRel... 你能指导我 url 文件应该包含什么吗??
    猜你喜欢
    • 2014-04-12
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    相关资源
    最近更新 更多