我正在使用GoogleFit HistoryAPI从用户那里获取步骤数据。运行良好
但是,在我的情况下,我想区分不同设备(使用同一帐户)之间的数据,因为我不希望用户使用同一帐户使用2个或更多设备(这是基于步骤的游戏,因此我不希望用户在1台设备上玩,并在许多设备上都有成就)。
我发现Device,DataSource#getDevice中的Device#getLocalDevice可以帮助我区分不同设备中的数据。以下是官方文档的信息:
要获取有关数据源设备的信息,请使用DataSource.getDevice方法。设备信息可用于区分不同设备上的类似传感器,向传感器显示设备信息给用户或根据设备而不同地处理数据。例如,您可能有兴趣专门从可穿戴设备上的传感器读取数据,而不是从手机上的同一类型的传感器读取数据。
要获取运行您的活动的设备的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个设备的数据源的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)
您会发现uid
中的datasource
与local device uid
不同,因此我无法区分数据。
有什么方法可以区分不同设备之间的数据吗?任何帮助或建议将不胜感激。
答案 0 :(得分:1)
从我得到的信息中,我认为您对每个设备都有一个稳定的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.
Settings.Secure#ANDROID_ID
import android.provider.Settings.Secure;
private String android_id = Secure.getString(getContext().getContentResolver(),
Secure.ANDROID_ID);