Skip to content

Instantly share code, notes, and snippets.

@KazuyukiEguchi
Created June 5, 2014 03:27
Show Gist options
  • Save KazuyukiEguchi/0e9995d753a848c1364e to your computer and use it in GitHub Desktop.
Save KazuyukiEguchi/0e9995d753a848c1364e to your computer and use it in GitHub Desktop.
Chromecastにキャストするサンプルアプリ作ってみた for Android ref: http://qiita.com/KazuyukiEguchi/items/ea137f4419d36d070535
package com.example.castcast;
import com.google.android.gms.cast.CastMediaControlIntent;
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.media.MediaRouteSelector;
import android.support.v7.media.MediaRouter;
import android.support.v7.media.MediaRouter.RouteInfo;
import android.util.Log;
public class MainActivity extends Activity
{
private String TAG = "test";
// Google Cast SDK Developer Consoleから取得した Application IDを設定してください
private static String APPLICATION_ID = "hogehoge";
// Chromecastを探索するのに使う変数類
private MediaRouter mRouter;
private MediaRouteSelector mMediaRouteSelector;
private MediaRouter.Callback mCB;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Chromecastを探す準備
mRouter = MediaRouter.getInstance(this);
mMediaRouteSelector = new MediaRouteSelector.Builder().addControlCategory(CastMediaControlIntent.categoryForCast(APPLICATION_ID)).build();
mCB = new MediaRouter.Callback()
{
@Override
public void onRouteAdded(MediaRouter router, RouteInfo route)
{
Log.d(TAG,"onRouteAdded=" + route.getName());
}
@Override
public void onRouteRemoved(MediaRouter router, RouteInfo route)
{
Log.d(TAG,"onRouteRemoved" + route.getName());
}
};
}
@Override
protected void onResume()
{
super.onResume();
// Chromecastを探す
mRouter.addCallback(mMediaRouteSelector, mCB,MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN);
}
@Override
protected void onPause()
{
if (isFinishing())
{
mRouter.removeCallback(mCB);
}
super.onPause();
}
}
// 最初に見つけたデバイスに接続を行う。
if(mSelectedDevice == null)
{
mSelectedDevice = CastDevice.getFromBundle(route.getExtras());
Cast.CastOptions.Builder apiOptionsBuilder = Cast.CastOptions.builder(mSelectedDevice, mCastClientListener);
apiOptionsBuilder.setVerboseLoggingEnabled(true);
mApiClient = new GoogleApiClient.Builder(getBaseContext())
.addApi(Cast.API, apiOptionsBuilder.build())
.addConnectionCallbacks(mConnectionCallbacks)
.addOnConnectionFailedListener(mConnectionFailedListener)
.build();
mApiClient.connect();
}
// Chromecastに接続確認用コールバック
private GoogleApiClient.ConnectionCallbacks mConnectionCallbacks = new GoogleApiClient.ConnectionCallbacks()
{
@Override
public void onConnected(Bundle connectionHint)
{
Log.d(TAG,"onConnected");
try
{
Cast.CastApi.launchApplication(mApiClient, APPLICATION_ID, false)
.setResultCallback(new ResultCallback<Cast.ApplicationConnectionResult>()
{
@Override
public void onResult(ApplicationConnectionResult result)
{
Status status = result.getStatus();
if (status.isSuccess())
{
mSessionId = result.getSessionId();
Log.d(TAG,"mSessionID=" + mSessionId);
}
}
});
}
catch(Exception ex)
{
Log.d(TAG,ex.toString());
}
}
@Override
public void onConnectionSuspended(int cause)
{
}
};
// Chromecastに接続失敗した場合に呼ばれる
private GoogleApiClient.OnConnectionFailedListener mConnectionFailedListener = new GoogleApiClient.OnConnectionFailedListener()
{
@Override
public void onConnectionFailed(ConnectionResult result)
{
}
};
// Chromecastとの接続を解除する
private void peardown()
{
if (mApiClient != null)
{
if (mApiClient.isConnected())
{
try
{
Cast.CastApi.stopApplication(mApiClient, mSessionId);
}
catch (Exception e)
{
Log.e(TAG, "Exception while removing channel", e);
}
mApiClient.disconnect();
}
mApiClient = null;
mSelectedDevice = null;
mSessionId = null;
}
}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<style type="text/css">
body {
overflow:hidden;
}
div {
height:720PX;
width:1280PX;
text-align:center;
border:0px solid silver;
display: table-cell;
vertical-align:middle;
color:#FFFFFF;
background-color:#000000;
font-weight:bold;
font-family:Verdana, Geneva, sans-serif;
font-size:40px;
}
</style>
<title>Chromecastテストページ</title>
<script src="//www.gstatic.com/cast/sdk/libs/receiver/2.0.0/cast_receiver.js"></script>
<script type="text/javascript">
window.onload = function() {
cast.receiver.logger.setLevelValue(0);
window.castReceiverManager = cast.receiver.CastReceiverManager.getInstance();
console.log('Starting Receiver Manager');
// handler for the 'ready' event
castReceiverManager.onReady = function(event) {
console.log('Received Ready event: ' + JSON.stringify(event.data));
window.castReceiverManager.setApplicationState("Application status is ready...");
};
// handler for 'senderconnected' event
castReceiverManager.onSenderConnected = function(event) {
console.log('Received Sender Connected event: ' + event.data);
console.log(window.castReceiverManager.getSender(event.data).userAgent);
};
// handler for 'senderdisconnected' event
castReceiverManager.onSenderDisconnected = function(event) {
console.log('Received Sender Disconnected event: ' + event.data);
if (window.castReceiverManager.getSenders().length == 0) {
window.close();
}
};
// handler for 'systemvolumechanged' event
castReceiverManager.onSystemVolumeChanged = function(event) {
console.log('Received System Volume Changed event: ' + event.data['level'] + ' ' +
event.data['muted']);
};
// initialize the CastReceiverManager with an application status message
window.castReceiverManager.start({statusText: "Application is starting"});
console.log('Receiver Manager started');
};
</script>
</head>
<body>
<div>Chromecastテストぺーじだよ〜〜〜ん</div>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment