识别应用程序安装
2018-03-12 本文已影响9人
寒冬_腊月
跟踪应用程序安装
第一次启动的时候,随机生成一个UUID,并创建一个文件来保存起来,也可以存相关安装的数据. 不用TelephonyManager.getDeviceId()的原因有两个:
- 不是手机:没有电话硬件的Wifi专用设备或音乐播放器没有这种唯一标识符
- 持久性:在具有此功能的设备上,它会持续存在设备数据擦除和出厂重置。目前还不清楚,在这种情况下,您的应用应该将此视为同一设备。
- 特权:它需要READ_PHONE_STATE权限,如果您不使用或需要电话,这会很刺激
- 错误:我们已经看到了一些生产型手机的实例,其中的实现有问题并返回垃圾,例如零或星号。
public class Installation {
private static String sID = null;
private static final String INSTALLATION = "INSTALLATION";
public synchronized static String id(Context context) {
if (sID == null) {
File installation = new File(context.getFilesDir(), INSTALLATION);
try {
if (!installation.exists())
writeInstallationFile(installation);
sID = readInstallationFile(installation);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
return sID;
}
private static String readInstallationFile(File installation) throws IOException {
RandomAccessFile f = new RandomAccessFile(installation, "r");
byte[] bytes = new byte[(int) f.length()];
f.readFully(bytes);
f.close();
return new String(bytes);
}
private static void writeInstallationFile(File installation) throws IOException {
FileOutputStream out = new FileOutputStream(installation);
String id = UUID.randomUUID().toString();
out.write(id.getBytes());
out.close();
}
}
返回的格式
7bebb30f-fb61-429e-9022-2caf57f55efa
Mac Address
可以从设备的WiFi或蓝牙硬件中检索Mac地址。我们不建议将此用作唯一标识符。首先,并非所有设备都具有WiFi。另外,如果WiFi未打开,硬件可能不会报告Mac地址。
Serial Number
由于Android 2.3(“姜饼”),这是可以通过android.os.Build.SERIAL。没有电话的设备需要在这里报告唯一的设备ID;有些手机也可能这样做。
ANDROID_ID
更具体地说,Settings.Secure.ANDROID_ID。这是设备第一次引导时生成并存储的64位数量。设备被擦拭时会重置。
ANDROID_ID似乎是唯一设备标识符的不错选择。有缺点:首先,它在2.2之前的Android版本(“Froyo”)上不是100%可靠的。
ANDROID_ID似乎是唯一设备标识符的不错选择。有缺点:首先,它在2.2之前的Android版本(“Froyo”)上不是100%可靠的。此外,主流制造商的流行手机中至少有一个广泛观察到的错误,其中每个实例具有相同的ANDROID_ID。
String android_id = Settings.Secure.getString(mContext.getContentResolver(),
Settings.Secure.ANDROID_ID);
结论
避免识别特定设备的尝试有很多很好的理由。对于那些想要尝试的人来说,最好的方法可能是在任何合理现代的情况下使用ANDROID_ID