如何在Android设备上发现Chromecast设备?

15

我想发现一个Chromecast设备并调节音量。

1个回答

23
  1. 获取一个设备
  2. 让你的设备被列入白名单(你需要设备序列号和 HTML5 接收器的 URL)
  3. 你将收到两个 APPID(开发/生产)
  4. 在开发环境中确保更新到 Android Support Library 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());

通过调用MediaRouteHelper.registerMinimalMediaRouteProvider()方法,传递实现MediaRouteAdapter接口的对象来注册MinimalCastMediaRouteProvider

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

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

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

mMediaRouteButton.setRouteSelector(mMediaRouteSelector);

  • 实现一个MediaRouter.Callback并将其添加到MediaRouter中, 通过向MediaRouter传递CALLBACK_FLAG_REQUEST_DISCOVERY来启动发现。 当用户在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?到目前为止,这种方法还没有奏效,但我想知道是否还有其他缺失的东西。 - Prem
不行 - 它不能与ActionBarSherlock一起使用 - 至少上次我检查时是这样的。 - Les Vogel - Google DevRel
我已经按照所有步骤进行了操作,但仍无法在电视上投放。设备未被发现。我感到困惑。我正在开发发送者应用程序,所以我是否需要将接收者设备列入白名单,并且如果我将我的设备列入白名单,我需要在哪里放置应用程序ID?请请请帮帮我。我已经卡在这个问题上超过两天了。@LesVogel-GoogleDevRel - pareshy
1
在设置中,你是否[x]向Google发送了你的序列号。你可以通过<Chromecast的IP地址>: 9222进行测试。 - Les Vogel - Google DevRel
您的接收器URL通常类似于mysite.com/cast/receiver.html,这是一个HTML5应用程序,可播放您的内容。加载URL应该是您想在Chromecast上播放的内容。 - Les Vogel - Google DevRel
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接