我对Google健身有疑问。 我正在创建一个计步器(哦,不知道 g )。到目前为止,我已经做了这件事,并不是很难。 但现在我们遇到了问题。我只是阅读传感器API的步骤。问题是,我可以通过Google Fit应用添加新数据,它也将计入我的应用中。这引入了作弊,我不想要这个。
所以我需要一种只读取“设备创建”数据而不是手动添加数据的方法。这有什么好办法吗? 从SDK文档中,不清楚如何继续这里。
答案 0 :(得分:0)
所以我需要有一种方法只能读取“设备创建”数据而不是 手动添加数据。有一个很好的方法吗?
您需要使用Private Custom Data Types
来实现这一目标。了解您可以上传到Google Fit here的不同类型的健身数据。
<强> 1。公共数据类型
平台提供的标准数据类型,例如com.google.step_count.delta。任何应用程序都可以读写数据 这些类型。有关更多信息,请参阅公共数据类型。
<强> 2。私人自定义数据类型
特定应用定义的自定义数据类型。 只有定义数据类型的应用才能读写数据 此类型。 有关详细信息,请参阅自定义数据类型。
第3。可共享的数据类型
应用开发者提交给平台的自定义数据类型。一旦批准,任何应用程序都可以读取数据 可分享的类型,但只有指定的列入白名单的应用程序 开发人员可以编写该可共享类型的数据。欲获得更多信息, 请参阅可共享数据类型。
答案 1 :(得分:0)
我能够在这个算法的帮助下做到这一点。但请记住,由于Android碎片,此代码仍会删除一些用户的数据并将其视为惩罚
private String dumpDataSet(DataSet dataSet, int x) {
List<String> days = new ArrayList<>();
days.add("Monday");
days.add("Tuesday");
days.add("Wednesday");
days.add("Thursday");
days.add("Friday");
days.add("Saturday");
days.add("Sunday");
String day = days.get(Math.round(x / 24));
Log.d(TAG, "\tDay: " + day);
Log.i(TAG, "Data returned for Data type: " + dataSet.getDataType().getName());
DateFormat dateFormat = getTimeInstance();
String text = "";
try {
for (DataPoint dp : dataSet.getDataPoints()) {
Log.i(TAG, "\tStepCount getStreamName: " + dp.getOriginalDataSource().getStreamName());
Log.i(TAG, "\tStepCount getStreamIdentifier: " + dp.getOriginalDataSource().getStreamIdentifier());
Log.i(TAG, "\tStepCount App Type: " + dp.getDataType().getName());
Log.i(TAG, "\tStepCount Type: " + dp.getOriginalDataSource().getType());
for (Field field : dp.getDataType().getFields()) {
Log.i(TAG, "\tField: " + field.getName() + " Value: " + dp.getValue(field));
text += dp.getValue(field);
String si[] = dp.getOriginalDataSource().getStreamIdentifier().toLowerCase().split(":");
if ((((si[si.length - 1].contains("soft")) || (si[si.length - 1].contains("step"))) && si[si.length - 1].contains("counter"))) {
totalSteps += Integer.parseInt(dp.getValue(field).toString());
Log.d(TAG, "\tStepCount" + " Added Steps -> " + dp.getValue(field) + " steps");
text += "\n\n";
} else {
Log.e(TAG, "\tStepCount PENALTY ---------------------------------------------------------------");
Log.e(TAG, "\tDay = " + day + " | Hour Number = " + x + " | StepCount" + " PENALTY DEDUCTED -> " + dp.getValue(field) + " steps");
Log.e(TAG, "\tStepCount PENALTY getStreamIdentifier: " + dp.getOriginalDataSource().getStreamIdentifier());
Log.e(TAG, "\tStepCount PENALTY getStreamName: " + dp.getOriginalDataSource().getStreamName());
Log.e(TAG, "\tStepCount PENALTY App Type: " + dp.getDataType().getName());
Log.e(TAG, "\tStepCount PENALTY Type: " + dp.getOriginalDataSource().getType());
Log.e(TAG, "\tStepCount PENALTY ---------------------------------------------------------------");
}
}
}
} catch (Exception ex) {
ex.getStackTrace();
}
return text;
}
-----更新-----
您也可以致电
DataPoint.getOriginalDataSource()。getAppPackageName()
过滤掉智能手表和其他应用。
答案 2 :(得分:0)
我尝试了Ali Shah lakhani的建议,但
DataPoint.getOriginalDataSource().getAppPackageName();
/*I also tried but could not achieve what I wanted*/
DataPoint.getOriginalDataSource().getStreamName();
DataPoint.getOriginalDataSource().getStreamIdentifier();
至少在检索数据时对我不起作用。我最终使用了如下所示的 readDailyTotalFromLocalDevice()来捕获仅由设备捕获的步骤。
Fitness.HistoryApi.readDailyTotalFromLocalDevice(mApiClient, DataType.TYPE_STEP_COUNT_DELTA).await(1, TimeUnit.MINUTES)
我与某些应用进行了交叉检查,避免在其应用中进行手动输入,并且上述功能提供的计数完全相同。
注意:如果用户拥有多个设备,并且在所有设备上都使用该应用程序,则 readDailyTotalFromLocalDevice()对于每个设备都将具有不同的值,因为函数仅负责返回设备特定的数据。