GoogleFit различает данные между разными устройствами - PullRequest
0 голосов
/ 25 июня 2018

Я использую GoogleFit HistoryAPI для получения данных о шагах от пользователя. Работает хорошо.
Однако в моем случае я хочу различать данные между разными устройствами (используя одну и ту же учетную запись), потому что я не хочу, чтобы пользователь использовал одну и ту же учетную запись для 2 или более устройств (это основа игры на шаге, поэтому я не хочу, чтобы пользователь играть на 1 устройстве и иметь достижения на многих устройствах).

Я обнаружил, что Устройство из DataSource # getDevice , Устройство # getLocalDevice может помочь мне отличить данные между различными устройствами. Ниже приведена информация из официальных документов:

Чтобы получить информацию об устройстве для источника данных, используйте метод DataSource.getDevice. Информация об устройстве полезна для того, чтобы отличать одинаковые датчики на разных устройствах, показывать информацию об устройстве от датчика пользователю или обрабатывать данные по-разному в зависимости от устройства. Например, вас может заинтересовать чтение данных, в частности, с сенсора на носимом устройстве, но не с сенсора того же типа на телефоне.

Чтобы получить экземпляр устройства для устройства, на котором выполняется ваша деятельность, используйте статический метод Device.getLocalDevice. Это полезно, если вы хотите проверить, находится ли источник данных на том же устройстве, на котором работает ваше приложение.

Итак,

// My idea is comparing the uid of local device and uid of device in datasource
// if it is same => step come from THIS device
// if not => step come from OTHER device
private void dumpDataSet(DataSet dataSet) {
    for (DataPoint dp : dataSet.getDataPoints()) {
        Log.i(Constant.TAG, "Origin type uid: " + dp.getOriginalDataSource().getDevice().getUid());
        Log.i(Constant.TAG, "Local device uid: " + Device.getLocalDevice(getApplicationContext()).getUid());

        ... 
     }
}

Однако, результат logcat для источника данных только из 1 DEVICE равен

Origin type uid: 9ff67c48
Local device uid: f2b01c49ecd9c389
// Only the model, manufacturer is same (but I can not use 2 fields because user can use 2 devices with same model, manufacturer)

Вы можете видеть, что uid из datasource отличается от local device uid, поэтому я не могу различить данные.

Есть ли способ отличить данные между разными устройствами? Буду признателен за любую помощь или предложение.

ДЕМО-проект

1 Ответ

0 голосов
/ 27 июня 2018

Из того, что я получаю, я думаю, вы ищете стабильный идентификатор для каждого устройства.Существует несколько способов использования идентификатора, по которому вы можете ретранслировать.

public static String getSerial() {
    final String serial;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
        serial = Build.getSerial();
    } else { 
        serial = Build.SERIAL;    
    }
    return serial;
}

В качестве другого примера, часто используется IMEI для ретрансляции по уникальному идентификатору из Telephony Manager.

public static String getDeviceImei(Context ctx) {
    TelephonyManager telephonyManager = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);
    return telephonyManager.getDeviceId();
}

И последний, но, возможно, самый правильный способ, я предлагаю использовать Secure ID.Что обеспечивает стабильный фон использования этого значения.Из документа On devices that have multiple users, each user appears as a completely separate device, so the ANDROID_ID value is unique to each user. Настройки. Безопасный # ANDROID_ID

import android.provider.Settings.Secure;

private String android_id = Secure.getString(getContext().getContentResolver(),
                                                        Secure.ANDROID_ID); 
...