Android设备有唯一的ID吗?如果有,使用Java访问它的简单方法是什么?


当前回答

借助以下功能获取设备UUID、型号、品牌名称及其版本号。

在Android 10中完美工作,无需允许读取手机状态权限。

代码段:

private void fetchDeviceInfo() {
    String uniquePseudoID = "35" +
            Build.BOARD.length() % 10 +
            Build.BRAND.length() % 10 +
            Build.DEVICE.length() % 10 +
            Build.DISPLAY.length() % 10 +
            Build.HOST.length() % 10 +
            Build.ID.length() % 10 +
            Build.MANUFACTURER.length() % 10 +
            Build.MODEL.length() % 10 +
            Build.PRODUCT.length() % 10 +
            Build.TAGS.length() % 10 +
            Build.TYPE.length() % 10 +
            Build.USER.length() % 10;

    String serial = Build.getRadioVersion();
    String uuid=new UUID(uniquePseudoID.hashCode(), serial.hashCode()).toString();
    String brand=Build.BRAND;
    String modelno=Build.MODEL;
    String version=Build.VERSION.RELEASE;
    Log.e(TAG, "fetchDeviceInfo: \n "+
            "\n uuid is : "+uuid+
            "\n brand is: "+brand+
            "\n model is: "+modelno+
            "\n version is: "+version);
}

调用Above函数并检查上述代码的输出。请在android工作室中查看您的日志猫。如下所示:

其他回答

Android设备mac id也是唯一的id。即使设备本身被格式化,它也不会改变。

使用以下代码获取mac id:

WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo info = manager.getConnectionInfo();
String address = info.getMacAddress();

此外,不要忘记将适当的权限添加到AndroidManifest.xml:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

不建议使用,因为deviceId可以在第三方手中用作跟踪,但这是另一种方式。

@SuppressLint("HardwareIds")
private String getDeviceID() {
    deviceId = Settings.Secure.getString(getApplicationContext().getContentResolver(),
                    Settings.Secure.ANDROID_ID);
    return deviceId;
}

为了包括Android 9,我只有一个想法可以继续工作,那就是(可能)不违反任何条款,需要权限,并且可以跨安装和应用程序工作。

涉及服务器的指纹应该能够唯一地识别设备。硬件信息+已安装的应用程序和安装时间的组合应该会起到作用。除非卸载并再次安装应用程序,否则首次安装时间不会更改。但这必须对设备上的所有应用程序进行,以便无法识别设备(即,在工厂重置后)。

我会这样做:

提取硬件信息、应用程序包名称和首次安装时间。

这是从Android中提取所有应用程序的方法(无需权限):

final PackageManager pm = application.getPackageManager();
List<ApplicationInfo> packages = 
pm.getInstalledApplications(PackageManager.GET_META_DATA);

for (ApplicationInfo packageInfo : packages) {
    try {
        Log.d(TAG, "Installed package :" + packageInfo.packageName);
        Log.d(TAG, "Installed :" + pm.getPackageInfo(packageInfo.packageName, 0).firstInstallTime);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
}

在将每个包名称和安装时间戳组合发送到服务器之前,您可能需要对其进行哈希,因为用户在设备上安装的内容可能与您的业务无关,也可能与您无关。有些应用程序(实际上很多)是系统应用程序。这些可能具有相同的安装时间戳,与出厂重置后的最新系统更新相匹配。因为它们具有相同的安装时间戳,所以用户无法安装它们,并且可以过滤掉它们。将信息发送到服务器,并让它在先前存储的信息中查找最近的匹配。在安装和卸载应用程序时,您需要在与以前存储的设备信息进行比较时设置阈值。但我的猜测是,这一门槛可能很低,因为任何软件包名称和首次安装时间戳组合对于一个设备来说都是非常独特的,而且应用程序的安装和卸载并不频繁。拥有多个应用程序只会增加独一无二的可能性。返回为匹配项生成的唯一id,或生成唯一id,存储设备信息并返回此新id。

注:这是一种未经测试和验证的方法!我相信它会奏效,但我也非常确信,如果这一点流行起来,他们会以某种方式关闭它。

谷歌现在有一个广告ID。这也可以使用,但请注意:

广告ID是用户特定的、唯一的、可重置的ID

and

使用户可以在Google Play应用程序中重置其标识符或选择退出基于兴趣的广告。

因此,尽管这个id可能会改变,但似乎很快我们就没有选择了,这取决于这个id的用途。

更多信息@develper.android

在此处复制粘贴代码

HTH

是的,每个Android设备都有一个唯一的序列号,你可以从这个代码中得到它。Build.SERIAL。请注意,它只是在API级别9中添加的,可能不会出现在所有设备上。要在早期平台上获得唯一ID,您需要读取MAC地址或IMEI等信息。