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

  • このエントリーをはてなブックマークに追加
  • Pocket

 

今回は「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>
  • このエントリーをはてなブックマークに追加
  • Pocket

SNSでもご購読できます。

コメント

  1. komaru より:

    貴方のサイトを拝見させていだたきました。

    私が使用しているものがPolar M600つまりwear2.0のものを使用しています。
    そのためか何なのかはわからないのですがなかなかうまくいきません。
    ActivityMain.javaの40行目のtimeと
    activity_main.xmlの20行目が存在しないエラーでつまずいています。
    もしわかるようでしたら教えていただけると幸いです。

    1. matu_mio より:

      記事をご覧いただきありがとうございます。
      ご質問にお答えいたします。

      MainActivity.javaの40行目
      tText = (TextView)findViewById(R.id.time);
      は削除してください。

      activity_main.xmlの20行目
      android:text=”@string/heart_rate” />

      android:text=”heart_rate” />
      に変更してください。

      これでうまくいかない場合、心拍数を表示するアプリの記事を書きましたので、
      こちらの方をご参照いただければと思います。
      なお、この記事の内容ではAndroidWearのバージョンによる差はないと思われます。

      AndroidWearで心拍数をリアルタイムに取得する!|mio.yokohama
      http://mio.yokohama/?p=479

      またわからない点などございましたら、お気軽にコメントください。

matu_mio へ返信する コメントをキャンセル

*