How to get the device's IMEI/ESN programmatically in android?

后端 未结 20 2265
滥情空心
滥情空心 2020-11-22 05:19

To identify each devices uniquely I would like to use the IMEI (or ESN number for CDMA devices). How to access this programmatically?

相关标签:
20条回答
  • 2020-11-22 05:47

    Kotlin Code for getting DeviceId ( IMEI ) with handling permission & comparability check for all android versions :

     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
    
        }
    

    Also add this permission to AndroidManifest.xml :

    <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <!-- IMEI-->
    
    0 讨论(0)
  • 2020-11-22 05:49

    In addition to the answer of Trevor Johns, you can use this as follows:

    TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
    telephonyManager.getDeviceId();
    

    And you should add the following permission into your Manifest.xml file:

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

    In emulator, you'll probably get a like a "00000..." value. getDeviceId() returns NULL if device ID is not available.

    0 讨论(0)
  • 2020-11-22 05:49

    You can use this TelephonyManager TELEPHONY_SERVICE function to get unique device ID, Requires Permission: READ_PHONE_STATE

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

    Example, the IMEI for GSM and the MEID or ESN for CDMA phones.

    /**
     * Gets the device unique id called IMEI. Sometimes, this returns 00000000000000000 for the
     * rooted devices.
     **/
    public static String getDeviceImei(Context ctx) {
        TelephonyManager telephonyManager = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);
        return telephonyManager.getDeviceId();
    }
    

    Return null if device ID is not available.

    0 讨论(0)
  • 2020-11-22 05:49

    Try this(need to get first IMEI always)

    TelephonyManager mTelephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
            if (ActivityCompat.checkSelfPermission(LoginActivity.this,Manifest.permission.READ_PHONE_STATE)!= PackageManager.PERMISSION_GRANTED) {
    
             return;
    }
    
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    if (mTelephony.getPhoneCount() == 2) {
                        IME = mTelephony.getImei(0);
                    }else{
                        IME = mTelephony.getImei();
                    }
                }else{
                    if (mTelephony.getPhoneCount() == 2) {
                        IME = mTelephony.getDeviceId(0);
                    } else {
                        IME = mTelephony.getDeviceId();
                    }
                }
            } else {
                IME = mTelephony.getDeviceId();
            }
    
    0 讨论(0)
  • 2020-11-22 05:50

    New Update:

    For Android Version 6 And Above, WLAN MAC Address has been deprecated , follow Trevor Johns answer

    Update:

    For uniquely Identification of devices, You can Use Secure.ANDROID_ID.

    Old Answer:

    Disadvantages of using IMEI as Unique Device ID:

    • IMEI is dependent on the Simcard slot of the device, so it is not possible to get the IMEI for the devices that do not use Simcard. In Dual sim devices, we get 2 different IMEIs for the same device as it has 2 slots for simcard.

    You can Use The WLAN MAC Address string (Not Recommended For Marshmallow and Marshmallow+ as WLAN MAC Address has been deprecated on Marshmallow forward. So you'll get a bogus value)

    We can get the Unique ID for android phones using the WLAN MAC address also. The MAC address is unique for all devices and it works for all kinds of devices.

    Advantages of using WLAN MAC address as Device ID:

    • It is unique identifier for all type of devices (smart phones and tablets).

    • It remains unique if the application is reinstalled

    Disadvantages of using WLAN MAC address as Device ID:

    • Give You a Bogus Value from Marshmallow and above.

    • If device doesn’t have wifi hardware then you get null MAC address, but generally it is seen that most of the Android devices have wifi hardware and there are hardly few devices in the market with no wifi hardware.

    SOURCE : technetexperts.com

    0 讨论(0)
  • 2020-11-22 05:50

    You'll need the following permission in your AndroidManifest.xml:

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

    To get IMEI (international mobile equipment identifier) and if It is above API level 26 then we get telephonyManager.getImei() as null so for that, we use ANDROID_ID as a Unique Identifier.

     public static String getIMEINumber(@NonNull final Context context)
                throws SecurityException, NullPointerException {
            TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
            String imei;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                assert tm != null;
                imei = tm.getImei();
                //this change is for Android 10 as per security concern it will not provide the imei number.
                if (imei == null) {
                    imei = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
                }
            } else {
                assert tm != null;
                if (tm.getDeviceId() != null && !tm.getDeviceId().equals("000000000000000")) {
                    imei = tm.getDeviceId();
                } else {
                    imei = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
                }
            }
    
            return imei;
        }
    
    0 讨论(0)
提交回复
热议问题