今回は「AndroidWearで心拍センサーの値をスマホに送る方法」の前編です. この記事では,AndroidWearで心拍数を取得して, ウォッチの画面に出力するところまで,紹介します.
はじめに
AndroidWearで心拍数を取得して表示するサンプルアプリを作っていきます. 検証した実機は Moto360(初代) HUAWEI WATCHs の二つです.
手順
1.センサーマネージャの取得 2.イベントリスナーの登録 3.値の取得 という流れになります.
1.センサーマネージャの取得
/*****↓センサーマネージャ取得↓*****/
//センサーマネージャーを取得
manager = (SensorManager)getSystemService(SENSOR_SERVICE);
//センサマネージャから TYPE_HEART_RATE についての情報を取得する
sensor_h = manager_h.getDefaultSensor(Sensor.TYPE_HEART_RATE);
/****↑センサーマネージャ取得↑****/
2.イベントリスナーの登録
final SensorEventListener mHeartListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
if (hTextView != null) {
hTextView.setText(String.valueOf(event.values[0]));
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
3.心拍数の取得
@Override public void onSensorChanged(SensorEvent event) {
Sensor sensor = event.sensor;
if (sensor.getType() == Sensor.TYPE_HEART_RATE) {
hTextView.setText(String.valueOf(event.values[0])); Log.d("HR",df.format(date)+":-:"+event.values[0]);
}
}
サンプル
MainActivity.java
package yokohama.mio.mywear;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.support.wearable.activity.WearableActivity;
import android.support.wearable.view.BoxInsetLayout;
import android.util.Log;
import android.widget.TextView;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class MainActivity extends WearableActivity implements SensorEventListener {
private static final SimpleDateFormat AMBIENT_DATE_FORMAT =
new SimpleDateFormat("HH:mm", Locale.US);
private BoxInsetLayout mContainerView;
private TextView mTextView;
/*****↓定義↓*****/
SensorManager manager;
Sensor sensor;
TextView hTextView;
TextView tText;
/*****↑定義↑*****/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setAmbientEnabled();
/*****↓センサーマネージャ取得↓*****/
setContentView(R.layout.activity_main);
hTextView = (TextView)findViewById(R.id.hValue);
tText = (TextView)findViewById(R.id.time);
//センサーマネージャーを取得
manager = (SensorManager)getSystemService(SENSOR_SERVICE);
//センサマネージャから TYPE_HEART_RATE についての情報を取得する
sensor = manager.getDefaultSensor(Sensor.TYPE_HEART_RATE);
/****↑センサーマネージャ取得↑****/
}
/*******↓リスナー↓*******/
final SensorEventListener mHeartListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
//Log.d(TAG, "Heart Rate Changed : " + event.values[0]);
if (hTextView != null) {
hTextView.setText(String.valueOf(event.values[0]));
//hTextView.setBackgroundColor(0xFF000000 + mR.nextInt(0xFFFFFF));
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
//Log.d(TAG, "onAccuracyChanged : " + accuracy);
}
};
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
protected void onResume() {
super.onResume();
manager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_UI);
Sensor heart = manager.getDefaultSensor(Sensor.TYPE_HEART_RATE);
//Sensor heart = manager_h.getDefaultSensor(65562);
manager.registerListener(mHeartListener, heart, 3);
}
@Override
protected void onPause() {
super.onPause();
manager.unregisterListener(this);
manager.unregisterListener(mHeartListener);
}
@Override
public void onSensorChanged(SensorEvent event) {
Sensor sensor = event.sensor;
// 値が変化したセンサーが心拍センサーだった場合
if (sensor.getType() == Sensor.TYPE_HEART_RATE) {
hTextView.setText(String.valueOf(event.values[0]));
final DateFormat df = new SimpleDateFormat("HH:mm:ss");
final Date date = new Date(System.currentTimeMillis());
tText.setText(String.valueOf(date));
Log.d("HR",df.format(date)+":"+event.values[0]);
}
}
/*******↑リスナー↑*******/
@Override
public void onEnterAmbient(Bundle ambientDetails) {
super.onEnterAmbient(ambientDetails);
updateDisplay();
}
@Override
public void onUpdateAmbient() {
super.onUpdateAmbient();
updateDisplay();
}
@Override
public void onExitAmbient() {
updateDisplay();
super.onExitAmbient();
}
private void updateDisplay() {
if (isAmbient()) {
mContainerView.setBackgroundColor(getResources().getColor(android.R.color.black));
mTextView.setTextColor(getResources().getColor(android.R.color.white));
} else {
mContainerView.setBackground(null);
mTextView.setTextColor(getResources().getColor(android.R.color.black));
}
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.wearable.view.BoxInsetLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="yokohama.mio.mywear.MainActivity"
tools:deviceIds="wear">
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center">
<TextView
android:id="@+id/text_heart_rate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/heart_rate" />
<TextView
android:id="@+id/hValue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_box="all" />
</LinearLayout>
</android.support.wearable.view.BoxInsetLayout>