今回は「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>
貴方のサイトを拝見させていだたきました。
私が使用しているものがPolar M600つまりwear2.0のものを使用しています。
そのためか何なのかはわからないのですがなかなかうまくいきません。
ActivityMain.javaの40行目のtimeと
activity_main.xmlの20行目が存在しないエラーでつまずいています。
もしわかるようでしたら教えていただけると幸いです。
記事をご覧いただきありがとうございます。
ご質問にお答えいたします。
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
またわからない点などございましたら、お気軽にコメントください。