Считывание частоты пульса на часах с изношенной ОС с помощью Google Fit из сопряженного приложения

Я пытаюсь получить пульсометр на своих часах с операционной системой Android Wear с помощью API Google Fit. Мои часы и устройства Android сопряжены.

Я пробовал 2 подхода:

1) Из приложения Android подключитесь к Google Fit и просканируйте источники данных. Но он будет обнаруживать только датчик шага на моем устройстве Android, без сопряженных датчиков часов.

mFitnessClient = new GoogleApiClient.Builder(this)
 .addApi(Fitness.SENSORS_API)
 .addScope(Fitness.SCOPE_BODY_READ)
 .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
  @Override
  public void onConnected(Bundle bundle) {
   Log.d(TAG, "Fitness client connected");
  }

  @Override
  public void onConnectionSuspended(int i) {
   Log.d(TAG, "Fitness client suspended");
  }
 })
 .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
  @Override
  public void onConnectionFailed(ConnectionResult result) {
   Log.d(TAG, "Fitness Connection failed");
  }
 })
 .build();
mFitnessClient.connect();

DataSourcesRequest dataSourceRequest = new DataSourcesRequest.Builder()
 .setDataTypes(DataType.TYPE_HEART_RATE_BPM)
 .setDataSourceTypes(DataSource.TYPE_RAW)
 .build();

ResultCallback < DataSourcesResult > dataSourcesResultCallback = new ResultCallback < DataSourcesResult > () {
 @Override
 public void onResult(DataSourcesResult dataSourcesResult) {
  for (DataSource dataSource: dataSourcesResult.getDataSources()) {

  }
 }
};

Fitness.SensorsApi.findDataSources(mFitnessClient, dataSourceRequest)
 .setResultCallback(dataSourcesResultCallback);


2) Читайте прямо с часов как приложение для износа. Но если я определяю Fitness.SENSORS_API, я, как правило, получаю onConnectionFailed с кодом ошибки 5 (INVALID_ACCOUNT).

mFitnessClient = new GoogleApiClient.Builder(this)
 .addApi(Fitness.SENSORS_API)
 .addScope(Fitness.SCOPE_BODY_READ)
 .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
  @Override
  public void onConnected(Bundle bundle) {
   Log.d(LOG_TAG, "Connected to fitness API");

  }

  @Override
  public void onConnectionSuspended(int i) {

  }
 })
 .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
  @Override
  public void onConnectionFailed(ConnectionResult connectionResult) {
   Log.d(LOG_TAG, "Connection failed: " + connectionResult.getErrorCode());
  }
 })
 .build();
mFitnessClient.connect();

person djreenykev    schedule 09.11.2019    source источник


Ответы (1)


1) Из приложения Android подключитесь к Google Fit и просканируйте источники данных. Но он будет обнаруживать только датчик шага на моем устройстве Android, без сопряженных датчиков часов.

Вы можете получить частоту пульса с помощью RecordingClient

Android 10 представляет разрешение времени выполнения android.permission.ACTIVITY_RECOGNITION для приложений, которым необходимо определять количество шагов пользователя или классифицировать его физическую активность.

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACTIVITY_RECOGNITION)
                    != PackageManager.PERMISSION_GRANTED) {

                ActivityCompat.requestPermissions(this,
                        PERMISSIONS,
                        PERMISSIONS_REQUEST_ACTIVITY_RECOGNITION);
            }
        } else {
            fintessConnection();

        }


public void fintessConnection() {
        FitnessOptions fitnessOptions = FitnessOptions.builder()
                .addDataType(DataType.TYPE_HEART_RATE_BPM, FitnessOptions.ACCESS_READ)
                .build();
        if (!GoogleSignIn.hasPermissions(GoogleSignIn.getLastSignedInAccount(this), fitnessOptions)) {
            GoogleSignIn.requestPermissions(
                    this, // your activity
                    GOOGLE_FIT_PERMISSIONS_REQUEST_CODE,
                    GoogleSignIn.getLastSignedInAccount(this),
                    fitnessOptions);
        } else {
            accessGoogleFit();
        }
    }

Подписка на Heart Rate / BPM:

Fitness.getRecordingClient(this, GoogleSignIn.getLastSignedInAccount(this))
                .subscribe(DataType.TYPE_HEART_RATE_BPM)
                .addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        Log.i(TAG, "Successfully subscribed!");
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.i(TAG, "There was a problem subscribing.");
                    }
                });

Получение BPM:

 DataReadRequest readRequest = new DataReadRequest.Builder()
                .read(DataType.TYPE_HEART_RATE_BPM)
                .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
                .bucketByTime(365, TimeUnit.DAYS)
                .build();


        Fitness.getHistoryClient(this, GoogleSignIn.getLastSignedInAccount(this))
                .readData(readRequest)
                .addOnSuccessListener(new OnSuccessListener<DataReadResponse>() {
                    @Override
                    public void onSuccess(DataReadResponse dataReadResponse) {
                        Log.d(TAG, "onSuccess()");

                        for (Bucket bucket : dataReadResponse.getBuckets()) {
                            Log.e("History", "Data returned for Data type: " + bucket.getDataSets());

                            List<DataSet> dataSets = bucket.getDataSets();
                            for (DataSet dataSet : dataSets) {
                                showDataSet(dataSet);
                            }
                        }
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.e(TAG, "onFailure()", e);
                    }
                })
                .addOnCompleteListener(new OnCompleteListener<DataReadResponse>() {
                    @Override
                    public void onComplete(@NonNull Task<DataReadResponse> task) {
                        Log.d(TAG, "onComplete()");
                    }
                }); 

2) Читайте прямо с часов как приложение для износа. Но если я определяю Fitness.SENSORS_API, я, как правило, получаю onConnectionFailed с кодом ошибки 5 (INVALID_ACCOUNT).

Прежде чем вы сможете вызывать методы из API Google Fit, вы должны подключиться к одному или нескольким из следующих клиентов API, которые являются частью сервисов Google Play:

  1. Датчики Клиент
  2. Клиент записи
  3. Клиент истории
  4. Клиент сеансов
  5. Клиент целей
  6. Клиент BLE
  7. Клиент конфигурации

Сначала подключитесь к одному из вышеуказанных API с портативного устройства, затем вы можете вызвать API в Watch. Подробный ответ здесь.

person John    schedule 12.01.2020