/Casty

Small Android library that provides a simple media player for Chromecast, fully consistent with Google Cast v3

Primary LanguageJavaMIT LicenseMIT

Casty

Casty is a small Android library that provides a simple media player for Chromecast. It's fully consistent with Google Cast v3.

Installation

Insert the following dependency to build.gradle file of your project:

dependencies {
    compile 'pl.droidsonroids:casty:1.0.5'
}

Usage

Casty requires Google Play Services and I assume that the target device has it installed (if not this example won't work). In a bigger project I suggest you check it using GoogleApiAvailability.

First, you need to initialize a Casty instance in every Activity you want to use it in:

public class MainActivity extends AppCompatActivity {
    private Casty casty;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        casty = Casty.create(this);
    }
}

If you want to add a Mini Controller widget, you can do it like this:

casty = Casty.create(this)
    .withMiniController();

Alternatively you can place it in your layout XML, just like in the official Google Cast example (remember to change fill_parent to match_parent 😆).

To support device discovery, add a menu item in overriden onCreateOptionsMenu method:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    casty.addMediaRouteMenuItem(menu);
    getMenuInflater().inflate(R.menu.your_menu, menu);
    return true;
}

You can also add a discovery button anywhere else by placing it in your layout XML:

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

And then set in up in your Activity:

MediaRouteButton mediaRouteButton = (MediaRouteButton) findViewById(R.id.media_route_button);
casty.setUpMediaRouteButton(mediaRouteButton);

You can add the above functionality (except MediaRouteButton) simply by extending CastyActivity. It will add a casty field and set up the rest:

public class MainActivity extends CastyActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (casty.isConnected()) {
            casty.getPlayer().loadMediaAndPlay(...)
        }
    }
}

All media player actions are included in a CastyPlayer object, which you can access by calling casty.getPlayer(). When you are connected to the device, you can play media the following way:

MediaData mediaData = new MediaData.Builder("http://distribution.bbb3d.renderfarming.net/video/mp4/bbb_sunflower_1080p_30fps_normal.mp4")
    .setStreamType(MediaData.STREAM_TYPE_BUFFERED) //required
    .setContentType("videos/mp4") //required
    .setMediaType(MediaData.MEDIA_TYPE_MOVIE)
    .setTitle("Sample title")
    .setSubtitle("Sample subtitle")
    .addPhotoUrl("https://peach.blender.org/wp-content/uploads/bbb-splash.png?x11217")
    .build();
casty.getPlayer().loadMediaAndPlay(mediaData);

Alternativly you can use loadMediaAndPlay(MediaInfo, autoPlay, position) similar to Google Cast example.

To react on Chromecast connect and disconnect events, you can simply register a listener:

casty.setOnConnectChangeListener(new Casty.OnConnectChangeListener() {
    @Override
    public void onConnected() {
        Log.d("Casty", "Connected with Chromecast");
    }
    
    @Override
    public void onDisconnected() {
        Log.d("Casty" "Disconnected from Chromecast");
    }
});

Custom usage

In case the library doesn't fit you, I left the possibility to change everything like in Google Cast v3. You can set receiver ID or even the whole CastOptions in your Application class:

Casty.configure(receiverId); //or
Casty.configure(customCastOptions);

Get CastContext by calling:

CastContext.getSharedInstance(context);

Get CastSession (so RemoteMediaClient) by register OnCastSessionUpdatedListener:

casty.setOnCastSessionUpdatedListener(new Casty.OnCastSessionUpdatedListener() {
    @Override
    public void onCastSessionUpdated(CastSession castSession) {
        if (castSession != null) {
            RemoteMediaClient remoteMediaClient = castSession.getRemoteMediaClient();
            //...
        }
    }
});

License

MIT