不合理的谷歌适合步数计数器

时间:2015-12-28 16:11:44

标签: android google-fit google-fit-sdk

我对Google健身有疑问。 我正在创建一个计步器(哦,不知道 g )。到目前为止,我已经做了这件事,并不是很难。 但现在我们遇到了问题。我只是阅读传感器API的步骤。问题是,我可以通过Google Fit应用添加新数据,它也将计入我的应用中。这引入了作弊,我不想要这个。

所以我需要一种只读取“设备创建”数据而不是手动添加数据的方法。这有什么好办法吗? 从SDK文档中,不清楚如何继续这里。

3 个答案:

答案 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()对于每个设备都将具有不同的值,因为函数仅负责返回设备特定的数据。