2016/12/1

AndroidWearで心拍センサーの値をスマホに送る方法(前編)


今回は「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>