安卓设备是否有唯一的设备ID?

3079

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


48
如果你正在使用 ANDROID_ID,请务必阅读这个答案这个漏洞 - Dheeraj Vepakomma
54个回答

2

序列号是一种唯一的设备标识符,可通过android.os.Build.SERIAL获得。

public static String getSerial() {
    String serial = "";
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
        serial = Build.getSerial();
    }else{ 
        serial = Build.SERIAL;    
    }
    return serial;
}

在调用getSerial()之前,请确保您拥有READ_PHONE_STATE权限。

注意:它不适用于没有电话功能的设备(例如仅支持WiFi的平板电脑)。


3
请注意,文档中指出此方法将返回硬件序列号“如果可用”,这暗示Build.SERIAL(或Build.getSerial())并非总是可用。更多信息请参阅Android O中设备标识符的更改博客文章。同样值得一读的是:唯一标识符的最佳实践 - Ted Hopp

2
String SERIAL_NUMER = Build.SERIAL;

返回一个设备中唯一的串行号作为字符串。

2

为了完整起见,这里是如何在Xamarin.Android和C#中获取Id的方法:

最初的回答:

var id = Settings.Secure.GetString(ContentResolver, Settings.Secure.AndroidId);

如果您不在一个Activity中:
var id = Settings.Secure.GetString(context.ContentResolver, Settings.Secure.AndroidId);

当传入上下文时,context代表传入的上下文。

最初的回答

1

这个例子展示了如何在Android中获取和存储设备ID,但我使用的是Kotlin语言。

      val textView: TextView = findViewById(R.id.textView)
      val uniqueId: String = Settings.Secure.getString(contentResolver, Settings.Secure.ANDROID_ID)
      textView.text = "Device ID: $uniqueId"

1

生成设备标识符

 private String generateDeviceIdentifier() {
    String uniqueDevicePseudoID = "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(uniqueDevicePseudoID.hashCode(), serial.hashCode()).toString();
    Log.e("DeviceIdentifier ", "\nDeviceIdentifier uuid is : " + uuid);
    return uuid;
}

输出

DeviceIdentifier uuid is : 00000000-36ab-9c3c-0000-0000714a4f37

enter image description here


1
是的,每个Android设备都有一个唯一的序列号,您可以通过此代码获取它:Build.SERIAL。请注意,此功能仅在API级别9中添加,并且可能不适用于所有设备。要在早期平台上获取唯一ID,您需要读取类似MAC地址或IMEI的内容。

1

只需获取设备ID一次,然后将其存储在数据库或文件中。在这种情况下,如果是应用程序的第一次启动,则生成一个ID并将其存储。下一次,它只会取出存储在文件中的ID。


7
目的是拥有一个在卸载并重新安装应用后仍然存在的ID。将ID保存到数据库中是无效的,因为当应用被卸载时,数据库也会被删除。 - Ted Hopp

1

经过大量的搜索,我意识到没有一个确定的方法可以获得唯一的ID。

假设我们希望每个用户只能在一个手机上使用该应用程序。

我的做法是:

当用户在我的应用程序中注册时,我将当前时间作为唯一的ID保存在服务器和应用程序数据库中。

当用户尝试在另一台手机上登录时,我从服务器获取用户信息并意识到该用户已经登录,因为唯一ID字段已满,因此向他/她显示对话框,询问他/她是否要离开之前的会话,如果他说是,我将为他创建一个新的唯一ID并更新服务器上的唯一ID详细信息。

在我的应用程序中,每次运行时我都从服务器获取用户配置文件。 如果服务器上存储的唯一ID与应用程序数据库中存储的唯一ID不同,则会自动注销用户。


很好。谢谢分享。 - Thelouras
@Thelouras 我很乐意。 - farhad.kargaran
如果用户在设备上重新安装应用程序会怎样?这种方法将失败。 - Vakas
@Vakas 用户正在使用凭据登录应用程序,因此重新安装应用程序不是问题,因为他们必须再次登录。 - lasec0203
@lasec0203 我们有一个金融应用程序,人们试图克隆和绕过安全措施,因此我们需要检查哪个用户从设备上签名了多少次。在我们的情况下,这种技术失败了。 - Vakas

1
android.telephony.TelephonyManager.getDeviceId()

这将返回唯一标识设备的任何字符串(GSM上的IMEI,CDMA上的MEID)。
您需要在AndroidManifest.xml中添加以下权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

4
它已经被弃用。 - Googlian

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接