使用 Google fit 从配对应用程序中读取 Wear os 手表的心率
Posted
技术标签:
【中文标题】使用 Google fit 从配对应用程序中读取 Wear os 手表的心率【英文标题】:Reading the Heart Rate from wear os watch using Google fit from a paired app 【发布时间】: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();
【问题讨论】:
【参考方案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 服务的一部分:
-
传感器客户端
录音客户端
历史客户端
会话客户端
目标客户
BLE 客户端
配置客户端
首先从手持设备连接到上述API,然后您可以在Watch.Detailed Answer here.调用API。
【讨论】:
以上是关于使用 Google fit 从配对应用程序中读取 Wear os 手表的心率的主要内容,如果未能解决你的问题,请参考以下文章
将点保存到Google Fitness API(fitness.body.write)
如何从Google Fitness REST API检索步数数据?
使用 Google Fit 的 Android 应用程序中的 OAuth 同意屏幕为空白