2

Google Fit について質問があります。ステップカウンターを作成しています(ああ、不思議です)。これは私がこれまでに行ったことであり、それほど難しいことではありません。しかし、今、私は私の問題に来ています。Sensor API を使用した手順のみを読んでいます。問題は、たとえば Google Fit アプリを介して新しいデータを追加でき、アプリでもカウントされることです。これは不正行為をもたらし、私はこれを望んでいません。

したがって、手動で追加されたデータではなく、「デバイスが作成した」データのみを読み取る方法が必要です。これに良い方法はありますか?SDK のドキュメントからは、ここでどのように処理を進めるかが明確ではありません。

4

3 に答える 3

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()

スマートウォッチやその他のアプリを除外します。

于 2016-05-01T09:21:32.260 に答える
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()はデバイスごとに異なる値を持ちます。

于 2019-07-23T10:59:46.353 に答える
0

したがって、手動で追加されたデータではなく、「デバイスが作成した」データのみを読み取る方法が必要です。これに良い方法はありますか?

あなたはそれPrivate Custom Data Typesを達成するために使用したいと思うでしょう。Google Fit にアップロードできるさまざまな種類のフィットネス データについては、こちらをご覧ください。

1. 公開データ型

com.google.step_count.delta など、プラットフォームによって提供される標準のデータ型。どのアプリでも、これらのタイプのデータを読み書きできます。詳細については、パブリック データ型を参照してください。

2. プライベート カスタム データ型

特定のアプリによって定義されたカスタム データ型。データ型を定義するアプリのみが、この型のデータを読み書きできます。詳細については、カスタム データ型を参照してください。

3. 共有可能なデータ型

アプリ開発者によってプラットフォームに送信されたカスタム データ型。承認されると、どのアプリでも共有可能なタイプのデータを読み取ることができますが、その共有可能なタイプのデータを書き込むことができるのは、開発者が指定したホワイトリストに登録されたアプリだけです。詳細については、共有可能なデータ型を参照してください。

于 2016-01-14T12:52:19.973 に答える