MarshMallow警告"不建议获取设备标识符"后的唯一Android设备ID?

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进行分析.

有什么解决方案吗?它有害还是其他什么?

Raf*_*ima 1

非常简单的答案是,如果您需要唯一地标识应用程序的每个用户,请在首次使用时创建一个随机 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)

这没有害处,只是谷歌不喜欢你这样做