GoogleFit可以区分不同设备之间的数据

我正在使用GoogleFit HistoryAPI从用户那里获取步骤数据。 它运作良好。
但是,在我的情况下,我想区分不同设备之间的数据(使用相同的帐户),因为我不希望用户为2个或更多设备使用相同的帐户(这是一个基于步骤的游戏,所以我不想要用户在1台设备上玩,并在许多设备上取得成就)。

我发现Device from DataSource#getDevice , Device#getLocalDevice可以帮助我区分不同设备之间的数据。 以下是官方文档的信息:

要获取有关数据源的设备的信息,请使用DataSource.getDevice方法。 设备信息可用于区分不同设备上的类似传感器,显示从传感器到用户的设备信息,或根据设备不同地处理数据。 例如,您可能有兴趣专门从可穿戴设备上的传感器读取数据,但不能从手机上相同types的传感器读取数据。

要获取运行活动的设备的Device实例,请使用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()); ... } } 

但是,仅来自1 DEVICE的数据源的logcat结果是

 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) 

您可以看到datasource中的uidlocal device uid不同,因此无法区分数据。

有没有办法区分不同设备之间的数据? 任何帮助或建议将非常感谢。

DEMO项目

从我得到的,我认为你是每个设备的稳定ID。 使用ID的方法很少,您可以使用ID进行中继。

 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中继唯一ID。

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

最后,但也许是最正确的方式,我建议使用安全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.的Doc On devices that have multiple users, each user appears as a completely separate device, so the ANDROID_ID value is unique to each user. Settings.Secure#ANDROID_ID

 import android.provider.Settings.Secure; private String android_id = Secure.getString(getContext().getContentResolver(), Secure.ANDROID_ID);