Pra*_*ani 16 android telephonymanager android-identifiers android-settings
我看到了一个我最好的问题是否有一个独特的Android设备ID?
我使用了一些以下代码来获取唯一ID.
public static String getDeviceId(Activity context) {
PermissionsChecker checker = new PermissionsChecker(context);
if (checker.lacksPermissions(Manifest.permission.READ_PHONE_STATE))
PermissionsActivity.startActivityForResult(context, 0, REQUIRED_PERMISSION);
else {
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
final String tmDevice = tm.getDeviceId();
final String androidId = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
UUID deviceUuid = new UUID(androidId.hashCode(), ((long) tmDevice.hashCode() << 32));
return deviceUuid.toString();
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
但是我在悬停时会收到一些警告
tm.getDeviceId();
和
Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
如下:
建议不要使用getString来获取设备标识符.
除高价值防欺诈和高级电话用例外,不建议使用设备标识符.对于广告用例,请使用AdvertisingIdClient $ Info#getId并使用InstanceId#getId进行分析.
有什么解决方案吗?它有害还是其他什么?
非常简单的答案是,如果您需要唯一地标识应用程序的每个用户,请在首次使用时创建一个随机 ID。
UUID.randomUUID().toString()
Run Code Online (Sandbox Code Playgroud)
您可以将其保存SharedPreferences,然后简单的工作就完成了。无需权限
问题是,如果用户卸载并重新安装该应用程序,它不会帮助您。
在 Android 10 之前可以执行的一个简单技巧(根据谷歌的说法,在 Android 11 上不再可能)是将其保存在外部存储中的隐藏文件中......
然后在第一次使用应用程序时,您会查找此类文件,如果存在,则读取 UUID,如果不生成新文件并保存文件。
这个策略的问题是你需要WRITE_EXTERNAL_STORAGE许可
如果这不是问题,简单做...
new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + ".my_hidden_folder").mkdir();
Run Code Online (Sandbox Code Playgroud)
此文件夹中保存的任何文件都将对用户隐藏,卸载应用程序时不会被删除
我个人使用
Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);
Run Code Online (Sandbox Code Playgroud)
这没有害处,只是谷歌不喜欢你这样做
| 归档时间: |
|
| 查看次数: |
8733 次 |
| 最近记录: |