This sample adds a chromecast icon to an Activity's action bar. When the user clicks the icon to connect to a chromecast device it will play a demo video.
The code assumes the android v7 support libraries are being used.
Sample menu file
res/menu/chromecast.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/action_cast"
android:title="Cast"
app:actionProviderClass="android.support.v7.app.MediaRouteActionProvider"
app:showAsAction="always"/>
</menu>
In an activity that extends AppCompatActivity
private MediaRouter mediaRouter;
private MediaRouteSelector mediaRouteSelector;
private Callback mediaRouterCallback;
private GoogleApiClient currentApiClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
// Normal onCreate code...
mediaRouter = MediaRouter.getInstance(getApplicationContext());
mediaRouteSelector = new MediaRouteSelector.Builder()
.addControlCategory(CastMediaControlIntent.categoryForCast(
CastMediaControlIntent.DEFAULT_MEDIA_RECEIVER_APPLICATION_ID))
.build();
mediaRouterCallback = new Callback() {
@Override
public void onRouteSelected(MediaRouter router, MediaRouter.RouteInfo route) {
stopCasting();
setupCasting(CastDevice.getFromBundle(route.getExtras()));
}
@Override
public void onRouteUnselected(MediaRouter router, MediaRouter.RouteInfo route) {
stopCasting();
}
};
}
@Override
protected void onStart() {
super.onStart();
mediaRouter.addCallback(mediaRouteSelector, mediaRouterCallback,
MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN);
}
@Override
protected void onStop() {
mediaRouter.removeCallback(mediaRouterCallback);
super.onStop();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.chromecast, menu);
MenuItem mediaRouteMenuItem = menu.findItem(R.id.action_cast);
MediaRouteActionProvider mediaRouteActionProvider
= (MediaRouteActionProvider) MenuItemCompat.getActionProvider(mediaRouteMenuItem);
mediaRouteActionProvider.setRouteSelector(mediaRouteSelector);
return true;
}
private void setupCasting(CastDevice device) {
currentApiClient = new GoogleApiClient.Builder(this)
.addApi(Cast.API, Cast.CastOptions.builder(device, new Listener()).build())
.addConnectionCallbacks(new ConnectionCallbacks() {
@Override
public void onConnected(Bundle bundle) {
Cast.CastApi.launchApplication(currentApiClient,
CastMediaControlIntent.DEFAULT_MEDIA_RECEIVER_APPLICATION_ID)
.setResultCallback(new ResultCallback<ApplicationConnectionResult>() {
@Override
public void onResult(ApplicationConnectionResult result) {
if (result.getStatus().isSuccess()) {
// After ten thousand callbacks, we can finally cast something
castVideo();
}
}
});
}
@Override
public void onConnectionSuspended(int i) {
// Log or toast it
}
})
.addOnConnectionFailedListener(new OnConnectionFailedListener() {
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
// Log or toast it
}
})
.build();
currentApiClient.connect();
}
private void castVideo() {
RemoteMediaPlayer remoteMediaPlayer = new RemoteMediaPlayer();
remoteMediaPlayer.load(currentApiClient,
new MediaInfo.Builder("http://techslides.com/demos/sample-videos/small.mp4")
.setContentType("video/mp4")
.setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
.build());
// If remoteMediaPlayer is saved in a field, pause/seek/play can all be called later on as well
}
private void stopCasting() {
if (currentApiClient != null) {
Cast.CastApi.stopApplication(currentApiClient);
currentApiClient = null;
}
}
Important imports
import com.google.android.gms.cast.Cast;
import com.google.android.gms.cast.Cast.ApplicationConnectionResult;
import com.google.android.gms.cast.Cast.Listener;
import com.google.android.gms.cast.CastDevice;
import com.google.android.gms.cast.CastMediaControlIntent;
import com.google.android.gms.cast.MediaInfo;
import com.google.android.gms.cast.RemoteMediaPlayer;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks;
import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener;
import com.google.android.gms.common.api.ResultCallback;
import android.os.Bundle;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.MediaRouteActionProvider;
import android.support.v7.media.MediaRouteSelector;
import android.support.v7.media.MediaRouter;
import android.support.v7.media.MediaRouter.Callback;
import android.view.Menu;
import android.view.MenuItem;