【问题标题】:Reading the Heart Rate from wear os watch using Google fit from a paired app使用 Google fit 从配对应用程序中读取 Wear os 手表的心率
【发布时间】:2020-03-05 17:30:18
【问题描述】:

我正在尝试使用 Google fit api 从我的 Android wear-os 手表获取心率。 我的手表和安卓设备都已配对。

我尝试了两种方法:

1) 从 Android 应用程序连接到 google fit 并扫描数据源。但它只会检测我的安卓设备上的步数传感器,而不会检测到配对的手表传感器。

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();

【问题讨论】:

    标签: android google-fit google-fit-sdk android-wear-2.0


    【解决方案1】:

    1) 从 Android 应用程序连接到 google fit 并扫描数据源。但它只会检测我的安卓设备上的步数传感器,而不会检测到配对的手表传感器。

    您可以使用 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();
            }
        }
    

    订阅心率/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)。

    在您可以从 Google Fit API 调用方法之前,您必须连接到以下一个或多个 API 客户端,它们是 Google Play 服务的一部分:

    1. 传感器客户端
    2. 录音客户端
    3. 历史客户端
    4. 会话客户端
    5. 目标客户
    6. BLE 客户端
    7. 配置客户端

    首先从手持设备连接到上述API,然后您可以在Watch.Detailed Answer here.调用API。

    【讨论】:

      猜你喜欢
      • 2016-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多