Android Wearの加速度センサーを使う方法 2


Pocket

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を触りだして、はじめて作ったのが今回のプログラムです。
腕の動きを使って何かしたかったので、手っ取り早く加速度センサーを使ってみました。

腕時計型のデバイスなので、常に腕の動きをセンシングできるため、よりセンサを活用したアプリが作れそうです。
引き続きもうちょっと各種センサーで遊んでみたいと思います。

ちょっと気になった点としては、腕を振って遊ぶようなアプリだと、歩数計が反応してしまい、いつの間にか歩いたことになってるので、歩数計のカウントを一時停止とかできないかなと。

ではでは~。
 
 


Leave a Comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

2 thoughts on “Android Wearの加速度センサーを使う方法

  • Reply
    こーびー

    ウェアを使ったボクシングアプリ面白くて作らせていただきました。

    続いて心拍数データもとりたいのですが、取り方がわからず困っています。
    助言をいただけたらありがたいです。

    • Reply
      koike Post author

      心拍数データも基本同じやり方で取得できると思います。

      上記コードからの変更ポイントとしては、
      1.”android.permission.BODY_SENSORS”パーミッション追加
      2.mSensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE)でSensorインスタンス取得
      として、後はSensorEventListenerで心拍数が取得出来ると思います。

      ※sdkversion=20でやった時の情報なので変更されてたらすいません。