Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I discover a Chromecast device using Android?

I'd like to discover a Chromecast device and adjust the volume.

like image 476
Les Vogel - Google DevRel Avatar asked Jul 24 '13 19:07

Les Vogel - Google DevRel


People also ask

Why is my Chromecast not showing up as a device?

If Chromecast isn't showing up in your Google Home app first ensure that your device is plugged in and powered on. Then, make sure your Chromecast and Google Home are both connected to the same network. Lastly, make sure you've given the Google Home app the right location permissions on your mobile device.


1 Answers

  1. Get a device
  2. Get your device whitelisted (you'll need the device serial #, and a URL for your HTML5 receiver)
  3. You'll be sent two APPID (development / production)
  4. In your development environment make sure to update to Android Support Library v18
  5. You'll be using MediaRouter
  6. Initialize

import com.google.cast.CastContext;     
Context applicationContext = …; CastContext castContext = new
CastContext(applicationContext);
  • You'll need a 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);
  • Construct a CastContext.

mCastContext = new CastContext(getApplicationContext());

- Register the MinimalCastMediaRouteProvider by calling MediaRouteHelper.registerMinimalMediaRouteProvider(), passing an object that implements the MediaRouteAdapter interface.

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

  • Construct a MediaRouteSelector by calling MediaRouteHelper.buildMediaRouteSelector(). There are two forms of this method: the first takes no parameters and the second takes a receiver application name and/or a list of message protocols. This latter form is used to perform device filtering equivalent to that done by the SDK’s ApplicationSupportFilterListener.

mMediaRouteSelector = MediaRouteHelper.buildMediaRouteSelector( MediaRouteHelper.CATEGORY_CAST);
  • Assign the MediaRouteSelector to the MediaRouteButton.

mMediaRouteButton.setRouteSelector(mMediaRouteSelector);

  • Implement a MediaRouter.Callback and add it to the MediaRouter, passing CALLBACK_FLAG_REQUEST_DISCOVERY to the MediaRouter to initiate discovery. When the user selects or deselects a route in the GUI picker, the corresponding method on this callback interface will be invoked.
    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();
}
  • In the MediaRouter.Callback’s onRouteSelected() callback, make a call to MediaRouteHelper.requestCastDeviceForRoute() to obtain a CastDevice object for the selected media route, as well as the MediaRouteStateChangeListener that will need to be notified whenever route volume or connecting state changes.
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.
}

}

like image 163
Les Vogel - Google DevRel Avatar answered Sep 22 '22 08:09

Les Vogel - Google DevRel