开发者社区 问答 正文

com.google.step_count.cumulative需要android.permissi

我正在尝试从android中的google-fit API检索BPM。但要获得com.google.step_count.cumulative错误,还需要清单文件中的android.permission.ACTIVITY_RECOGNITION包含权限:

private void readDataFitnessHistory() {
    Calendar cal = Calendar.getInstance();
    Date now = new Date();
    cal.setTime(now);
    long endTime = cal.getTimeInMillis();

    cal.add(Calendar.WEEK_OF_YEAR, -1);
    long startTime = cal.getTimeInMillis();

    java.text.DateFormat dateFormat = getDateInstance();
    Log.d("Range Start", "Range Start: " + dateFormat.format(startTime));
    Log.d("Range End", "Range End: " + dateFormat.format(endTime));

    DataReadRequest readRequest = new DataReadRequest.Builder()
            .aggregate(DataType.TYPE_HEART_RATE_BPM, DataType.AGGREGATE_HEART_RATE_SUMMARY)
            .bucketByTime(1, TimeUnit.DAYS)
            .enableServerQueries()
            .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
            .build();


    DataReadResult dataReadResult = Fitness.HistoryApi.readData(mGoogleApiClient, readRequest).await(0, TimeUnit.MINUTES);
    DataSet dataSet = dataReadResult.getDataSet(DataType.TYPE_HEART_RATE_BPM);
    showDataSet(dataSet);
    displayBpmDataForToday();
}
private void showDataSet(DataSet dataSet) {
    Log.e("History", "Data returned for Data type: " + dataSet.getDataType().getName());
    DateFormat dateFormat = getDateInstance();
    DateFormat timeFormat = DateFormat.getTimeInstance();

    for (DataPoint dp : dataSet.getDataPoints()) {
        Log.e("History", "Data point:");
        Log.e("History", "\tType: " + dp.getDataType().getName());
        Log.e("History", "\tStart: " + dateFormat.format(dp.getStartTime(TimeUnit.MILLISECONDS)) + " " + timeFormat.format(dp.getStartTime(TimeUnit.MILLISECONDS)));
        Log.e("History", "\tEnd: " + dateFormat.format(dp.getEndTime(TimeUnit.MILLISECONDS)) + " " + timeFormat.format(dp.getStartTime(TimeUnit.MILLISECONDS)));
        for(Field field : dp.getDataType().getFields()) {
            Log.e("History", "\tField: " + field.getName() + " Value: " + dp.getValue(field));
        }
    }
}
private void displayBpmDataForToday() {
    DailyTotalResult result = Fitness.HistoryApi.readDailyTotal( mGoogleApiClient, DataType.TYPE_HEART_RATE_BPM ).await(0, TimeUnit.MINUTES);
    showDataSet(result.getTotal());
}

展开
收起
几许相思几点泪 2019-12-05 15:39:29 506 分享 版权
阿里云 AI 助理回答

从你的代码片段来看,你正尝试从Google Fit API中读取心率(BPM)数据。遇到的错误提示需要在清单文件(AndroidManifest.xml)中添加android.permission.ACTIVITY_RECOGNITION权限。这是因为从Android 10(API级别29)开始,访问用户的活动识别数据(如步数、运动等)需要明确的运行时权限。

为了修复这个问题,请按照以下步骤操作:

  1. 在AndroidManifest.xml中添加权限: 在你的应用的AndroidManifest.xml文件中,确保包含了以下权限声明:

    <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/>
    

    这行代码应该放在manifest标签内,application标签外。

  2. 请求运行时权限: 由于这是一个危险权限,你需要在运行时向用户请求这个权限。可以在Activity的适当位置(比如启动上述功能前)添加如下代码来请求权限:

    // 检查是否已经有了该权限
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACTIVITY_RECOGNITION)
           != PackageManager.PERMISSION_GRANTED) {
       // 如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true。
       if (ActivityCompat.shouldShowRequestPermissionRationale(this,
               Manifest.permission.ACTIVITY_RECOGNITION)) {
           // 显示解释为什么需要这个权限的对话框,然后再次请求权限
           Snackbar.make(findViewById(R.id.main_activity), 
                   "Activity recognition permission needed for fetching BPM.",
                   Snackbar.LENGTH_INDEFINITE).setAction("OK", new View.OnClickListener() {
               @Override
               public void onClick(View view) {
                   // 请求权限
                   ActivityCompat.requestPermissions(MainActivity.this,
                           new String[]{Manifest.permission.ACTIVITY_RECOGNITION},
                           MY_PERMISSIONS_REQUEST_ACTIVITY_RECOGNITION);
               }
           }).show();
       } else {
           // 直接请求权限
           ActivityCompat.requestPermissions(this,
                   new String[]{Manifest.permission.ACTIVITY_RECOGNITION},
                   MY_PERMISSIONS_REQUEST_ACTIVITY_RECOGNITION);
       }
    } else {
       // 权限已授予,可以执行读取BPM的操作
       readDataFitnessHistory();
    }
    

    注意替换MY_PERMISSIONS_REQUEST_ACTIVITY_RECOGNITION为你自定义的请求码,用于在onRequestPermissionsResult回调中识别这个权限请求。

  3. 处理权限请求结果: 最后,覆盖onRequestPermissionsResult方法来处理用户的选择:

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
       switch (requestCode) {
           case MY_PERMISSIONS_REQUEST_ACTIVITY_RECOGNITION: {
               if (grantResults.length > 0
                       && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                   // 权限被用户同意,可以执行读取BPM的操作
                   readDataFitnessHistory();
               } else {
                   // 权限被用户拒绝,根据情况处理
                   Toast.makeText(this, "Permission denied to read heart rate data.", Toast.LENGTH_SHORT).show();
               }
               return;
           }
           // 其他 'case' 行来检查其他权限请求
       }
    }
    

完成以上步骤后,你的应用应该能够正确请求并使用ACTIVITY_RECOGNITION权限来从Google Fit API获取心率数据了。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答标签:
问答地址: