我正在尝试使用Google Fit API从我的Android Wear手表中获取心率。我的手表和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)作为Wear-OS应用直接从手表读取。但是,如果我定义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();
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(); } }
订阅心率/ 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)作为Wear-OS应用直接从手表读取。但是,如果我定义Fitness.SENSORS_API,则趋向于出现onConnectionFailed,错误代码5(INVALID_ACCOUNT)。
在您可以从Google Fit API调用方法之前,您必须连接到以下一个或多个以下API客户端,它们是Google Play服务的一部分:
首先从手持设备连接到上述API之一,然后可以在Watch中调用API。Detailed Answer here.