如何解决在 Flutter 中使用 Google fit API
我需要我的应用从 Google Fit 读取步数。我正在使用健康 3.05 包。现在我复制了示例代码以查看它是否有效,不幸的是它无效。当然,我从这个包自述文件中完成了每一步。我设置了 OAuth2 客户端 ID,我更改了 gradle.properties 显示的内容,并在 AndroidManifest.xml 中放置了 <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/>
。但是,在运行应用程序后,我没有获得任何权限窗口,当我单击按钮获取数据时,控制台中出现错误“未授予授权”。我应该怎么办?谢谢
这是我复制表单包示例的代码:
import 'dart:async';
import 'package:Flutter/material.dart';
import 'package:health/health.dart';
class DailyStepsScreen extends StatefulWidget {
@override
_DailyStepsScreenState createState() => _DailyStepsScreenState();
}
enum AppState {
DATA_NOT_FETCHED,FETCHING_DATA,DATA_READY,NO_DATA,AUTH_NOT_GRANTED
}
class _DailyStepsScreenState extends State<DailyStepsScreen> {
List<HealthDataPoint> _healthDataList = [];
AppState _state = AppState.DATA_NOT_FETCHED;
@override
void initState() {
super.initState();
}
Future<void> fetchData() async {
/// Get everything from midnight until Now
DateTime startDate = DateTime(2020,11,07,0);
DateTime endDate = DateTime(2025,23,59,59);
HealthFactory health = HealthFactory();
/// Define the types to get.
List<HealthDataType> types = [
HealthDataType.STEPS,HealthDataType.WEIGHT,HealthDataType.HEIGHT,HealthDataType.BLOOD_gluCOSE,HealthDataType.disTANCE_WALKING_RUNNING,];
setState(() => _state = AppState.FETCHING_DATA);
/// You MUST request access to the data types before reading them
bool accessWasGranted = await health.requestAuthorization(types);
int steps = 0;
if (accessWasGranted) {
try {
/// Fetch new data
List<HealthDataPoint> healthData =
await health.getHealthDataFromTypes(startDate,endDate,types);
/// Save all the new data points
_healthDataList.addAll(healthData);
} catch (e) {
print("Caught exception in getHealthDataFromTypes: $e");
}
/// Filter out duplicates
_healthDataList = HealthFactory.removeDuplicates(_healthDataList);
/// Print the results
_healthDataList.forEach((x) {
print("Data point: $x");
steps += x.value.round();
});
print("Steps: $steps");
/// Update the UI to display the results
setState(() {
_state =
_healthDataList.isEmpty ? AppState.NO_DATA : AppState.DATA_READY;
});
} else {
print("Authorization not granted");
setState(() => _state = AppState.DATA_NOT_FETCHED);
}
}
Widget _contentFetchingData() {
return Column(
mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[
Container(
padding: EdgeInsets.all(20),child: CircularProgressIndicator(
strokeWidth: 10,)),Text('Fetching data...')
],);
}
Widget _contentDataReady() {
return ListView.builder(
itemCount: _healthDataList.length,itemBuilder: (_,index) {
HealthDataPoint p = _healthDataList[index];
return ListTile(
title: Text("${p.typestring}: ${p.value}"),trailing: Text('${p.unitString}'),subtitle: Text('${p.dateFrom} - ${p.dateto}'),);
});
}
Widget _contentNoData() {
return Text('No Data to show');
}
Widget _contentNotFetched() {
return Text('Press the download button to fetch data');
}
Widget _authorizationNotGranted() {
return Text('''Authorization not given.
For Android please check your OAUTH2 client ID is correct in Google Developer Console.
For iOS check your permissions in Apple Health.''');
}
Widget _content() {
if (_state == AppState.DATA_READY)
return _contentDataReady();
else if (_state == AppState.NO_DATA)
return _contentNoData();
else if (_state == AppState.FETCHING_DATA)
return _contentFetchingData();
else if (_state == AppState.AUTH_NOT_GRANTED)
return _authorizationNotGranted();
return _contentNotFetched();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Plugin example app'),actions: <Widget>[
IconButton(
icon: Icon(Icons.file_download),onpressed: () {
fetchData();
},)
],),body: Center(
child: _content(),)
);
}
}
解决方法
步骤 1 使用 health: 3.0.4
第 2 步正确设置 OAuth2 客户端 ID,下载新的 google-service.json
第 3 步从 Android 10 开始,您必须添加 ACTIVITY_RECOGNITION
才能在 AndroidManifest.xml
中获得 STEP Count 权限。
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
第 4 步然后使用 permission_handler 请求许可。
if (Platform.isAndroid) {
final permissionStatus = Permission.activityRecognition.request();
if (await permissionStatus.isDenied ||
await permissionStatus.isPermanentlyDenied) {
showToast(
'activityRecognition permission required to fetch your steps count');
return;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。