为了唯一地识别每个设备,我想使用IMEI(或CDMA设备的ESN号)。如何以编程方式访问它?


当前回答

使用下面的代码给你IMEI号码:

TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
System.out.println("IMEI::" + telephonyManager.getDeviceId());

其他回答

对不可重置设备标识符的限制

从Android 10开始,应用程序必须拥有READ_PRIVILEGED_PHONE_STATE特权权限才能访问设备的不可重置标识符,包括IMEI和序列号。

你无法从andorid10 +或29+手机中获得imei号码,这里是用于为设备创建imei号码的替代功能。

public  static String getDeviceID(){
    String devIDShort = "35" + //we make this look like a valid IMEI
            Build.BOARD.length()%10+ Build.BRAND.length()%10 +
            Build.CPU_ABI.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 ; //13 digits

    return  devIDShort;
}

新更新:

对于Android版本6及以上,WLAN MAC地址已弃用,请遵循Trevor Johns的回答

更新:

对于设备的唯一标识,可以使用Secure.ANDROID_ID。

旧的回答:

使用IMEI作为唯一设备ID的缺点:

IMEI依赖于设备的Simcard插槽,所以它不是 对于不使用Simcard的设备,可以获得IMEI。 在双sim卡设备中,我们为同一个设备获得2个不同的imei,因为它有2个sim卡插槽。

您可以使用WLAN MAC地址字符串(不推荐用于Marshmallow和Marshmallow+,因为WLAN MAC地址已在Marshmallow转发上被弃用。所以你会得到一个伪值)

我们也可以使用WLAN MAC地址获得android手机的唯一ID。MAC地址对于所有设备都是唯一的,它适用于所有类型的设备。

使用WLAN MAC地址作为设备ID的优点:

它是所有类型设备的唯一标识符(智能手机和 平板电脑)。 如果重新安装应用程序,它将保持唯一

使用WLAN MAC地址作为设备ID的缺点:

给你一个虚假的价值从棉花糖和以上。 如果设备没有wifi硬件,MAC地址为空, 但通常可以看到大多数Android设备都有wifi 硬件和市场上几乎没有没有wifi的设备 硬件。

来源:technetexperts.com

我使用以下代码获取IMEI或使用Secure。ANDROID_ID作为替代,当设备没有电话功能时:

/**
 * Returns the unique identifier for the device
 *
 * @return unique identifier for the device
 */
public String getDeviceIMEI() {
    String deviceUniqueIdentifier = null;
    TelephonyManager tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
    if (null != tm) {
        deviceUniqueIdentifier = tm.getDeviceId();
    }
    if (null == deviceUniqueIdentifier || 0 == deviceUniqueIdentifier.length()) {
        deviceUniqueIdentifier = Settings.Secure.getString(this.getContentResolver(), Settings.Secure.ANDROID_ID);
    }
    return deviceUniqueIdentifier;
}

Kotlin代码获取DeviceId (IMEI)处理权限和可比性检查的所有android版本:

 val  telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
        == PackageManager.PERMISSION_GRANTED) {
        // Permission is  granted
        val imei : String? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)  telephonyManager.imei
        // older OS  versions
        else  telephonyManager.deviceId

        imei?.let {
            Log.i("Log", "DeviceId=$it" )
        }

    } else {  // Permission is not granted

    }

将此权限添加到AndroidManifest.xml:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/> <!-- IMEI-->