android - MarshMallow 警告 "get device identifiers is not recommended"后的唯一 Android 设备 ID?

标签 android telephonymanager android-settings android-identifiers

我看到了我最好的问题之一 Is there a unique Android device ID?

编辑:

我也需要适用于 Android 10 的解决方案。

我使用以下代码来获取唯一 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;
}

但我在悬停时收到一些警告

tm.getDeviceId();

Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); 如下:

Using getString to get device identifiers is not recommended.

Using device identifiers is not recommended other than for high value fraud prevention and advanced telephony use-cases. For advertising use-cases, use AdvertisingIdClient$Info#getId and for analytics, use InstanceId#getId.

有什么解决办法吗?它是有害的还是其他什么?

最佳答案

非常简单的答案是,如果您需要唯一标识应用的每个用户,请在首次使用时创建一个随机 id。

    UUID.randomUUID().toString()

您可以将其保存在 SharedPreferences 中,简单的工作就完成了。无需权限

问题是如果用户卸载并重新安装应用程序,它不会帮助你。

在 android 10 之前可以做到的一个简单技巧(根据 google,在 android 11 上将不再可能)是将其保存在外部存储中的隐藏文件中...

然后在第一次使用应用程序时查找此类文件,如果存在读取 UUID,则不生成新文件并保存文件。

这个策略的问题是你需要WRITE_EXTERNAL_STORAGE PERMISSION

万一这不是问题,简单做...

new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + ".my_hidden_folder").mkdir();

保存在此文件夹中的任何文件都将对用户隐藏,在卸载您的应用时不会被删除

我个人使用

Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);

这无害,只是谷歌不喜欢你这样做

关于android - MarshMallow 警告 "get device identifiers is not recommended"后的唯一 Android 设备 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40283432/

相关文章:

java - 从 XML 获取自定义 TextView 的自定义属性

Android SQLite ContextWrapper.openOrCreateDatabase() 空指针?

java - 获取双 SIM 卡安卓手机的 SimOperatorName

android - 在双卡手机中获取两个 simcard 运营商名称

Android:我可以在不将用户重定向到 "google maps"应用程序中的设置屏幕的情况下启用 GPS

android - 如何注册 OMX 内核以添加新的解码器

java - 以编程方式在 Android Facebook 应用程序中打开 Facebook 帖子 URL

Android 4.2及以上读取APN设置

java - Android:SharedPreferences 未从 PreferenceFragment 更新

android - 如何从 Android SharedPreference 获取文本条目?