安卓设备是否有像iPhone的UDID?

9

Android有像iPhone一样的UDID吗?如果有,我能以编程方式获取它吗?

谢谢 Chris


重复的问题:https://dev59.com/V3E85IYBdhLWcg3wbS1h 还有一个:https://dev59.com/6k7Sa4cB1Zd3GeqP5amD#3116243 - ognian
4个回答

12

文档中得知:

getDeviceId()

返回设备的唯一标识符,例如 GSM 设备的 IMEI 和 CDMA 设备的 MEID。如果设备 ID 不可用,则返回 null。


8
很容易获取Android设备的UDID,请查看以下代码:
public class DemoActivityActivity extends Activity {

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    TelephonyManager tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);

    Log.d(">>>>", "Android ID: " + Secure.getString(getContentResolver(), Secure.ANDROID_ID));
    Log.d(">>>>", "Device ID : " + tm.getDeviceId());

}

为了获取设备ID,您需要在AndroidManifest.xml中设置以下权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

获取Android ID无需设置任何权限。


1
我实现了一个类来获取IMEI / Wifi MAC地址 / 设备ID,希望对你有用 ^^
public class DeviceInfo {

protected static String imeiNumber;
protected static String wifiMacAddress;
protected static String deviceID;

// This method must be called before other method
public static void init(Context context) throws Exception {
    imeiNumber = getImei(context);
    wifiMacAddress = getWifiMacAddress(context);
    deviceID = getDeviceId(context);
}

public static String getDeviceInfo() {
    return deviceID;
}

public static String getImei() {
    return imeiNumber;
}

public static String getWifiMacAddress() {
    return wifiMacAddress;
}

public static String getModel() {
    return Build.MODEL;
}

public static String getOsVersion() {
    return Build.VERSION.RELEASE;
}

protected static String getDeviceId(Context context) throws Exception {
    String imei = getImei(context);
    if (imei != null) return imei;
    String tid = getWifiMacAddress(context);
    return tid;
}

protected static String getWifiMacAddress(Context context) throws Exception {
    WifiManager manager = (WifiManager) context
            .getSystemService(Context.WIFI_SERVICE);
    WifiInfo wifiInfo = manager.getConnectionInfo();
    if (wifiInfo == null || wifiInfo.getMacAddress() == null)
        return md5(UUID.randomUUID().toString());
    else return wifiInfo.getMacAddress().replace(":", "").replace(".", "");
}

protected static String getImei(Context context) {
    TelephonyManager m = (TelephonyManager) context
            .getSystemService(Context.TELEPHONY_SERVICE);
    String imei = m != null ? m.getDeviceId() : null;
    return imei;
}

protected static String md5(String s) throws Exception {
    MessageDigest md = MessageDigest.getInstance("MD5");

    md.update(s.getBytes());

    byte digest[] = md.digest();
    StringBuffer result = new StringBuffer();

    for (int i = 0; i < digest.length; i++) {
        result.append(Integer.toHexString(0xFF & digest[i]));
    }
    return (result.toString());
}
}

使用上述代码添加以下权限。 <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> - user1154390

1
设备ID以前只能在您通过将手机与Google帐户关联来启动Market时获得,即在模拟器上不可用。这似乎在Android 2.2中已经改变,模拟器也会生成一个设备ID。我不认为它与IMEI、ICC或任何其他与手机相关的令牌相关联,而是由Google Web服务生成的伪唯一标识符,用于识别您的手机。

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