我的问题:我希望从我的Android Wear设备上的传感器获取HeartRate,以便使用Google Fit API将其发送到Android手机应用程序。
我有华为手表2(可穿戴设备)和三星Galaxy S7(手机),它们通过WearOS应用程序连接并通过蓝牙配对。
它与问here几乎相同,但在我的案例中没有一个有用的答案。而且听起来很明显。
到目前为止我尝试了什么:
Google健身传感器页面指出可以列出设备和配套设备上的数据源。以下图片支持: Google Fit On Android
我查看了这些问题,但无法找到合适的答案。
代码:
public class GoogleFitSensor {
private Activity mActivity;
private DataType mRequestedDatatype;
private int mRequestedDataSource;
private static final String LOG_TAG = "GoogleFitSensor";
private static final int GOOGLE_FIT_PERMISSIONS_REQUEST_CODE = 1123;
private OnSensorResultInterface mOnSensorResultInterface;
/**
* Object that handles the connection with google fit devices.
* @param mActivity The activity from which the requests are called.
* @param requestedDatatype The requested Datatype (ex. DataType.TYPE_HEART_RATE_BPM)
* @param requestedDataSource The requested Data Source (ex. DataSource.TYPE_RAW)
*/
public GoogleFitSensor(Activity mActivity, DataType requestedDatatype, int requestedDataSource, @Nullable OnSensorResultInterface onSensorResultInterface ) {
this.mActivity = mActivity;
this.mRequestedDatatype = requestedDatatype;
this.mOnSensorResultInterface = onSensorResultInterface;
this.mRequestedDataSource = requestedDataSource;
}
public void connectToGoogleFit(){
FitnessOptions fitnessOptions = FitnessOptions.builder()
.addDataType(DataType.TYPE_HEART_RATE_BPM)
.build();
if (!GoogleSignIn.hasPermissions(GoogleSignIn.getLastSignedInAccount(mActivity), fitnessOptions)) {
GoogleSignIn.requestPermissions(
mActivity, // your mActivity
GOOGLE_FIT_PERMISSIONS_REQUEST_CODE,
GoogleSignIn.getLastSignedInAccount(mActivity),
fitnessOptions);
} else {
Dexter.withActivity(mActivity).withPermission("android.permission.BODY_SENSORS").withListener(new PermissionListener() {
@Override
public void onPermissionGranted(PermissionGrantedResponse response) {
findSensorAndAddListener(mRequestedDatatype, mRequestedDataSource);
}
@Override
public void onPermissionDenied(PermissionDeniedResponse response) {
Log.d(LOG_TAG, "Permission Denied.");
}
@Override
public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
Log.d(LOG_TAG, "Permission Denied, rationale should be shown.");
token.continuePermissionRequest();
}
}).check();
}
}
private void findSensorAndAddListener(final DataType dataType, int dataSource) {
Fitness.getSensorsClient(mActivity, GoogleSignIn.getLastSignedInAccount(mActivity))
.findDataSources(
new DataSourcesRequest.Builder()
.setDataTypes(dataType)
.setDataSourceTypes(dataSource)
.build())
.addOnSuccessListener(
new OnSuccessListener<List<DataSource>>() {
@Override
public void onSuccess(List<DataSource> dataSources) {
for (DataSource dataSource : dataSources) {
Log.i(LOG_TAG, "Data source found: " + dataSource.toString());
Log.i(LOG_TAG, "Data Source type: " + dataSource.getDataType().getName());
// Let's register a listener to receive Activity data!
if (dataSource.getDataType().equals(dataType)) {
Log.i(LOG_TAG, "Data source for HEART RATE found! Registering.");
registerFitnessDataListener(dataSource, dataType);
}
}
}
})
.addOnFailureListener(
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.e(LOG_TAG, "failed", e);
}
});
}
private void registerFitnessDataListener(DataSource dataSource, DataType type) {
Fitness.getSensorsClient(mActivity, GoogleSignIn.getLastSignedInAccount(mActivity))
.add(
new SensorRequest.Builder()
.setDataSource(dataSource) // Optional but recommended for custom data sets.
.setDataType(type) // Can't be omitted.
.setSamplingRate(1, TimeUnit.SECONDS)
.build(),
new OnDataPointListener() {
@Override
public void onDataPoint(DataPoint dataPoint) {
for (Field field : dataPoint.getDataType().getFields()) {
if (mOnSensorResultInterface != null){
mOnSensorResultInterface.onNewResult(dataPoint.getValue(field));
}
Value val = dataPoint.getValue(field);
Log.i(LOG_TAG, "Detected DataPoint field: " + field.getName());
Log.i(LOG_TAG, "Detected DataPoint value: " + val);
}
}
})
.addOnCompleteListener(
new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
Log.i(LOG_TAG, "Listener registered!");
} else {
Log.e(LOG_TAG, "Listener not registered.", task.getException());
}
}
});
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK) {
if (requestCode == GOOGLE_FIT_PERMISSIONS_REQUEST_CODE) {
findSensorAndAddListener(mRequestedDatatype, mRequestedDataSource);
}
}
}
}
我缺少什么?提前谢谢!