Android Wearの加速度センサーの使い方です。
といっても、センサーの使用方法はスマホの場合と同じですので、Wearのセンサー値をスマホ側へ送信するところも含めてメモっときます。
<参考>
Sending and Syncing Data
Accessing Google APIs
Handling Data layer Events
こんなことができます
Wear側で取得したセンサー値により、スマホ側のアプリを制御しています。
具体的には、Wear側の加速度センサー値により、ストレート、アッパー、フックを判定して、その結果をスマホへ送信しています。
スマホ側は受信した値により、画面の切り替え&効果音の再生を行っています。
1.センサーの使い方
たぶん今まで通りです。
(※全センサーを調べてないのでおそらくですが…あと、歩数計、心拍計とかはどうなんだろう??そのうち調べます)
// Wear側ソースコード:加速度センサーの場合 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); } @Override protected void onResume() { super.onResume(); Sensor sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); mSensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { super.onPause(); mSensorManager.unregisterListener(this); } @Override public void onSensorChanged(SensorEvent event) { センサー値取得時の処理 }
2.Wear→Handheldへのデータ送信
Wearデバイスとhandheld(スマホ)間の通信方法には、DataApiを使う方法とMessageApiを使う方法があります。
実装する通信用途によってどちかを選択します。(詳しくはこちら)
今回はWear側からhandheld側に一方的にセンサー判定結果を送信するだけなので、MessageApiを使用することにしました。
2.1.GoogleApiClientのインスタンス生成
Wearとhandheld間の通信は(DataApi,MessageApiどちらの場合も)Google Play services APIを介して行われるため、
まずはそこにアクセスするためのGoogleApiClientインスタンスを生成します。
//Wear側 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); ・・略・・ mGoogleApiClicent = new GoogleApiClient.Builder(this) .addApi(Wearable.API) .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() { @Override public void onConnected(Bundle bundle) { //省略 } @Override public void onConnectionSuspended(int i) { } }) .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() { @Override public void onConnectionFailed(ConnectionResult connectionResult) { Log.d(TAG, "onConnectionFailed : " + connectionResult.toString()); } }) .build(); } @Override protected void onResume() { //略 mGoogleApiClient.connect(); } @Override protected void onPause() { //略 mGoogleApiClient.disconnect(); }
あと、Google Play serviceを使用するため、忘れずにAndroidManifestに下記を追加する必要があります。
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
2.2.メッセージの送信
後は、MessageApi.sendMessage()を使ってメッセージを送信するだけです。
MessageApiを使用する場合は、送信先のNodeIDが必要になるので、処理の手順としては、
1.NodeIDを取得
2.メッセージを送信
となります。
//Wear側 @Override public void onConnected(Bundle bundle) { //GoogleApiClient.ConnectionCallback内でNodeIDを取得しています。 Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).setResultCallback(new ResultCallback<NodeApi.GetConnectedNodesResult>() { @Override public void onResult(NodeApi.GetConnectedNodesResult nodes) { //とりあえずNodeは1個に限定 if (nodes.getNodes().size() > 0) { mNode = nodes.getNodes().get(0).getId(); } } }); } @Override public void onSensorChanged(SensorEvent event) { //今回の例では、センサー変化時のコールバック内でメッセージを送信しています。 //さすがに毎回送信されないように工夫する ・・略・・ Wearable.MessageApi.sendMessage(mGoogleApiClient, mNode, SEND_MESSAGE, null).setResultCallback(new ResultCallback<MessageApi.SendMessageResult>() { @Override public void onResult(MessageApi.SendMessageResult result) { if (!result.getStatus().isSuccess()) { Log.d(TAG, "ERROR : failed to send Message" + result.getStatus()); } } }); }
送信側は以上です。
3.Handheld側でのデータ受信
次にデータ受信処理です。
3.1.GoogleApiClientのインスタンス生成
送信するときと同じ。
3.2.MessageApi.MessageListenerの実装
MessageListenerを実装すればOKです。詳しくはこちら。
public class MainActivity extends Activity implements MessageApi.MessageListener { @Override public void onMessageReceived(MessageEvent event) { if (SEND_MESSAGE.equals(event.getPath())) { //受信処理 } } }
これで、Wearデバイスのセンサー値をHandheld側へ送信することができます。
あと、参考までに上の動画で使用したコードは下記に置いておきます。
https://github.com/workpiles/AndroidWear_SensorSample
あとがき
Android Wearを触りだして、はじめて作ったのが今回のプログラムです。
腕の動きを使って何かしたかったので、手っ取り早く加速度センサーを使ってみました。
腕時計型のデバイスなので、常に腕の動きをセンシングできるため、よりセンサを活用したアプリが作れそうです。
引き続きもうちょっと各種センサーで遊んでみたいと思います。
ちょっと気になった点としては、腕を振って遊ぶようなアプリだと、歩数計が反応してしまい、いつの間にか歩いたことになってるので、歩数計のカウントを一時停止とかできないかなと。
ではでは~。
ウェアを使ったボクシングアプリ面白くて作らせていただきました。
続いて心拍数データもとりたいのですが、取り方がわからず困っています。
助言をいただけたらありがたいです。
心拍数データも基本同じやり方で取得できると思います。
上記コードからの変更ポイントとしては、
1.”android.permission.BODY_SENSORS”パーミッション追加
2.mSensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE)でSensorインスタンス取得
として、後はSensorEventListenerで心拍数が取得出来ると思います。
※sdkversion=20でやった時の情報なので変更されてたらすいません。