从WearOS(安卓服装)获取心率传感器信息到移动通道google Fit

时间:2018-04-04 14:36:27

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

我的问题:我希望从我的Android Wear设备上的传感器获取HeartRate,以便使用Google Fit API将其发送到Android手机应用程序。

我有华为手表2(可穿戴设备)和三星Galaxy S7(手机),它们通过WearOS应用程序连接并通过蓝牙配对。

它与问here几乎相同,但在我的案例中没有一个有用的答案。而且听起来很明显。

到目前为止我尝试了什么:

  1. 在电话上的Google健身传感器页面here上运行代码。结果:只有手机背面的集成HR传感器显示。
  2. 在Wearable上的Google Fit传感器页面here上运行代码。结果:E / GoogleFitSensor:com.google.android.gms.common.api.Api异常:17:API:此设备无法使用Fitness.SENSORS_CLIENT。
  3. 使用描述为here的代码创建软件传感器,手机上的Fitness.SensorClient无法在可穿戴设备上找到服务。看着可穿戴设备的logcat,从未创建过该服务。我的怀疑是意图不能跨设备工作。
  4. 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);
                    }
                }
            }
    }
    

    我缺少什么?提前谢谢!

0 个答案:

没有答案