我正在尝试从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());
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
从你的代码片段来看,你正尝试从Google Fit API中读取心率(BPM)数据。遇到的错误提示需要在清单文件(AndroidManifest.xml)中添加android.permission.ACTIVITY_RECOGNITION
权限。这是因为从Android 10(API级别29)开始,访问用户的活动识别数据(如步数、运动等)需要明确的运行时权限。
为了修复这个问题,请按照以下步骤操作:
在AndroidManifest.xml中添加权限: 在你的应用的AndroidManifest.xml文件中,确保包含了以下权限声明:
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/>
这行代码应该放在manifest标签内,application标签外。
请求运行时权限: 由于这是一个危险权限,你需要在运行时向用户请求这个权限。可以在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
回调中识别这个权限请求。
处理权限请求结果: 最后,覆盖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获取心率数据了。