Получите частоту пульса от Android Wear

Я знаю, что это может быть довольно простой вопрос, и многие люди задавали один и тот же вопрос, но все же у меня есть проблема с получением частоты пульса. Конечно, я сделал так много исследований для решения.

Как правило, для использования датчика сердечного ритма нам нужно получить разрешение и использовать sensormanager, а также использовать registerListener для датчика в mainActivity.

Некоторые говорят, что для SDK 23 или выше, мы должны объявить разрешение отдельно, но до сих пор я разрабатываю только часть Android Wear, и в телефоне ничего нет.

И я также попытался переустановить и перезапустить приложение. Все эти методы не работают для меня.

Вот мой код, все, что я хочу, это показывать частоту пульса на часах.

AWHeartRateSensor \ износ \ SRC \ главная \ Java \ COM \ например \ Android \ awheartratesensor \ MainActivity.java

package com.example.android.awheartratesensor;

import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.support.wearable.view.WatchViewStub;
import android.util.Log;
import android.widget.TextView;

import static com.google.android.gms.wearable.DataMap.TAG;

public class MainActivity extends Activity {

private SensorManager mSensorManager;
private Sensor mHeartSensor;
private TextView mTextView;
WatchViewStub mStub;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
        mStub = (WatchViewStub) findViewById(R.id.watch_view_stub);
    mStub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
        @Override
        public void onLayoutInflated(WatchViewStub stub) {
            mTextView = (TextView) stub.findViewById(R.id.text);
            mTextView.setText("I am here");
        }
    });

    mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    mHeartSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE);


    mStub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
        @Override
        public void onLayoutInflated(WatchViewStub stub) {
            mTextView = (TextView) stub.findViewById(R.id.text);
            mTextView.setText("I have the sensor manager");
        }
    });

}
protected void onResume() {
    super.onResume();
    mSensorManager.registerListener(mSensorEventListener, mHeartSensor, SensorManager.SENSOR_DELAY_NORMAL);
}

protected void onPause() {
    super.onPause();
    mSensorManager.unregisterListener(mSensorEventListener);
}
private SensorEventListener mSensorEventListener = new SensorEventListener() {


    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        final SensorEvent event1=event;

        mStub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {

            @Override
            public void onLayoutInflated(WatchViewStub stub) {
                mTextView = (TextView) stub.findViewById(R.id.text);
                mTextView.setText(Float.toString(event1.values[0]));
            }
        });
    }


    };
}

Вот манифест.xml

<?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.awheartratesensor">

    <uses-feature android:name="android.hardware.type.watch" />
    <uses-permission android:name="android.permission.BODY_SENSORS" />

  <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@android:style/Theme.DeviceDefault">
        <uses-sdk android:minSdkVersion="23"
            android:targetSdkVersion="23"
            />
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

1 ответ

Есть два способа решить эту проблему.

Для быстрого исправления

Перейдите в раздел настроек приложения (или "Информация о приложении") на своем носимом устройстве и посмотрите, не установлено ли разрешение для датчиков тела для вашего приложения. Разрешение для приложения всегда отключено по умолчанию, даже если вы включаете разрешение в свой манифест. Когда вы включите разрешение в настройках, приложение начнет правильно использовать датчик сердечного ритма.

Правильное исправление

В дополнение к добавлению разрешения в манифест, Android требует от вас реализации разрешения времени выполнения для "Body Sensors". Это разрешение во время выполнения требуется только один раз. После этого он всегда будет работать как задумано.

Другие вопросы по тегам