Android各バージョンでIMEI、MEIDを取得

50058 ワード

MEID/IMI 1/IMEI 2(携帯電話のダイヤルアップキーボードに*#06#を入力することで検索可能)
IMEI:(International Mobile Equipment Identity)国際モバイル機器のアイデンティティコードの略で、15~17(中国では基本的に15)ビットの数字からなる電子シリアル番号が携帯電話1台1台に対応し、このコードは世界で唯一である.
MEID:(Mobile Equipment Identifier)モバイルデバイス識別コードは、CDMA携帯電話のアイデンティティ識別コードであり、CDMA携帯電話または通信タブレット1台あたりの唯一の識別コードでもあり、14ビットの数字から構成されている.
中国ではモバイルカードとユニコムカードはGSM方式でIMEIを使用し、電気通信カードはCDMA方式でMEIDを使用する
AndroidバージョンでのMEID/IMEI取得状況
  • バージョン<=4.x MEID/IMI 1/IMEI 2を取得するには--実は難しいです.getDeviceId()という方法しか使えないからです
  • バージョン=5.xのシステムMEID/IMI 1/IMEI 2------frameworkレイヤが2つの属性値「ril.cdma.meid」と「ril.gsm.imei」を提供してmeid、imei 1、imei 2を取得する場合はgetDeviceId()で
  • を取得することもできます
  • 6.0>=バージョン<8のシステムMEID/IMI 1/IMEI 2を取得したい場合はgetDeviceId()で
  • を取得できます.
  • 8.0<=バージョン<10は、個のgetMeid/getImeiで対応する値を優先的に取得してもよいし、getDeviceId()で
  • を取得してもよい.
  • バージョン>=10システムAPI制限、imei/meid以上のメソッドを取得できない
  • 注意:getDeviceId():imeiまたはmeidを取得できます.カードを挿入することによって対応する値が返されます.カードを挿入しないか、モバイルカードを挿入しないでデフォルトでimeiカードを挿入するとmeid getMeid()を返します.8.0以降の呼び出しはmeid getImei()を返します.8.0以降の呼び出しはimeiを返します.
    ツールクラス
     public class IMEIUtil {
    
        /**
         *      imei      IMEI 1
         *
         * @param context
         * @return
         */
        public static String getIMEI1(Context context) {
            //    IMEI(      )         MEID
            return getImeiOrMeid(context, 0);
    
        }
    
        /**
         *   imei2
         *
         * @param context
         * @return
         */
        public static String getIMEI2(Context context) {
            //imei2    imei1   
            String imeiDefault = getIMEI1(context);
            if (TextUtils.isEmpty(imeiDefault)) {
                //    imei     ,        ,     
                //     ,   imei2      
                return "";
            }
    
            //  ,     IMEI   0, 2  IMEI   1,    
            String imei1 = getImeiOrMeid(context, 0);
            String imei2 = getImeiOrMeid(context, 1);
            //sim      ,imei1  imei2     ,  imeidefault      
            if (!TextUtils.equals(imei2, imeiDefault)) {
                //    imeiDefault     
                return imei2;
            }
            if (!TextUtils.equals(imei1, imeiDefault)) {
                return imei1;
            }
            return "";
        }
    
        /**
         *    Imei/Meid        IMEI(      )         MEID
         * 

    * CDMA SIM ( ) , Android 8 MEID , IMEI * 8 #imei IMEI #deviceId MEID * * @param context * @param slotId slotId Id, 0、1; * @return */

    public static String getImeiOrMeid(Context context, int slotId) { String imei = ""; //Android 6.0 if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { return imei; } try { TelephonyManager manager = (TelephonyManager) context.getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE); if (manager != null) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {// android 8 getImei MEID Method method = manager.getClass().getMethod("getImei", int.class); imei = (String) method.invoke(manager, slotId); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //5.0 MEID/IMEI1/IMEI2 ----framework “ril.cdma.meid" “ril.gsm.imei" imei = getSystemPropertyByReflect("ril.gsm.imei"); // getDeviceId } else {//5.0 imei/meid getDeviceId } } } catch (Exception e) { } if (TextUtils.isEmpty(imei)) { imei = getDeviceId(context, slotId); } return imei; } /** * Imei meid * * @param slotId slotId Id, 0、1; * @return */ public static String getImeiOnly(Context context, int slotId) { String imei = ""; //Android 6.0 if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { return imei; } try { TelephonyManager manager = (TelephonyManager) context.getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE); if (manager != null) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {// android 8 getImei MEID Method method = manager.getClass().getMethod("getImei", int.class); imei = (String) method.invoke(manager, slotId); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //5.0 MEID/IMEI1/IMEI2 ----framework “ril.cdma.meid" “ril.gsm.imei" imei = getSystemPropertyByReflect("ril.gsm.imei"); // getDeviceId } else {//5.0 imei/meid getDeviceId } } } catch (Exception e) { } if (TextUtils.isEmpty(imei)) { String imeiOrMeid = getDeviceId(context, slotId); // 15 imei 14 meid if (!TextUtils.isEmpty(imeiOrMeid) && imeiOrMeid.length() >= 15) { imei = imeiOrMeid; } } return imei; } /** * Meid imei * meid * * @param context * @param slotId slotId Id, 0、1; * @return */ public static String getMeidOnly(Context context, int slotId) { String meid = ""; //Android 6.0 if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { return meid; } try { TelephonyManager manager = (TelephonyManager) context.getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE); if (manager != null) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {// android 8 getMeid Imei Method method = manager.getClass().getMethod("getMeid", int.class); meid = (String) method.invoke(manager, slotId); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //5.0 MEID/IMEI1/IMEI2 ----framework “ril.cdma.meid" “ril.gsm.imei" meid = getSystemPropertyByReflect("ril.cdma.meid"); // getDeviceId } else {//5.0 imei/meid getDeviceId } } } catch (Exception e) { } if (TextUtils.isEmpty(meid)) { String imeiOrMeid = getDeviceId(context, slotId); // 15 imei 14 meid if (imeiOrMeid.length() == 14) { meid = imeiOrMeid; } } return meid; } private static String getSystemPropertyByReflect(String key) { try { @SuppressLint("PrivateApi") Class<?> clz = Class.forName("android.os.SystemProperties"); Method getMethod = clz.getMethod("get", String.class, String.class); return (String) getMethod.invoke(clz, key, ""); } catch (Exception e) {/**/} return ""; } /** * IMEI/MEID * * @param context * @return "" */ public static String getDeviceId(Context context) { String imei = ""; //Android 6.0 if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { return imei; } // 1. api imei imei = getDeviceIdFromSystemApi(context); if (TextUtils.isEmpty(imei)) { imei = getDeviceIdByReflect(context); } return imei; } /** * IMEI/MEID * * @param context * @param slotId slotId Id, 0、1; * @return "" */ public static String getDeviceId(Context context, int slotId) { String imei = ""; // 1. api imei imei = getDeviceIdFromSystemApi(context, slotId); if (TextUtils.isEmpty(imei)) { imei = getDeviceIdByReflect(context, slotId); } return imei; } /** * IMEI/MEID *

    * Android 6.0 {@link Manifest.permission#READ_PHONE_STATE} , * api IMEI/MEID , {@linkplain #getDeviceIdByReflect(Context)} } * * @param context * @return "" */

    public static String getDeviceIdFromSystemApi(Context context, int slotId) { String imei = ""; try { TelephonyManager telephonyManager = (TelephonyManager) context.getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE); if (telephonyManager != null) { imei = telephonyManager.getDeviceId(slotId); } } catch (Throwable e) { } return imei; } public static String getDeviceIdFromSystemApi(Context context) { String imei = ""; try { TelephonyManager telephonyManager = (TelephonyManager) context.getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE); if (telephonyManager != null) { imei = telephonyManager.getDeviceId(); } } catch (Throwable e) { } return imei; } /** * IMEI/MEID *

    * Android 6.0 {@link Manifest.permission#READ_PHONE_STATE} , * api IMEI/MEID , * * @param context * @return "" */

    public static String getDeviceIdByReflect(Context context) { try { TelephonyManager tm = (TelephonyManager) context.getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE); if (Build.VERSION.SDK_INT >= 21) { Method simMethod = TelephonyManager.class.getDeclaredMethod("getDefaultSim"); Object sim = simMethod.invoke(tm); Method method = TelephonyManager.class.getDeclaredMethod("getDeviceId", int.class); return method.invoke(tm, sim).toString(); } else { Class<?> clazz = Class.forName("com.android.internal.telephony.IPhoneSubInfo"); Method subInfoMethod = TelephonyManager.class.getDeclaredMethod("getSubscriberInfo"); subInfoMethod.setAccessible(true); Object subInfo = subInfoMethod.invoke(tm); Method method = clazz.getDeclaredMethod("getDeviceId"); return method.invoke(subInfo).toString(); } } catch (Throwable e) { } return ""; } /** * deviceId * * @param context * @param slotId slotId Id, 0、1; * @return */ public static String getDeviceIdByReflect(Context context, int slotId) { try { TelephonyManager tm = (TelephonyManager) context.getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE); Method method = tm.getClass().getMethod("getDeviceId", int.class); return method.invoke(tm, slotId).toString(); } catch (Throwable e) { } return ""; } }

    Demoの例:
    8.0以下のシステム(カード1:移動/連通、カード2:電気通信)
     * getIMEI1 = imei1
     * getIMEI2 = meid / imei     meid
     * getImeiOnly(0)  = imei1
     * getImeiOnly(1)  =imei2 / null 
     * getMeidOnly(0)  = meid / null 
     * getMeidOnly(1)  = meid / null 
     * getImeiOrMeid(0) = imei1 
     * getImeiOrMeid(1) = meid / imei     meid
     * getDeviceId(0) = imei1
     * getDeviceId(1) = meid / imei     meid
    

    8.0以上10以下のシステム(カード1:移動/連通、カード2:電気通信)
     * getIMEI1 = imei1
     * getIMEI2 = imei2
     * getImeiOnly(0) = imei1
     * getImeiOnly(1)  =imei2
     * getMeidOnly(0)  = meid
     * getMeidOnly(1)  = meid
     * getImeiOrMeid(0) = imei1
     * getImeiOrMeid(1) = imie2
     * getDeviceId(0) = imei1
     * getDeviceId(1) = imei2
    

    違いは、8.0以下のgetDeviceId()はSIMカードに基づいて対応機器idを取得し、カードを挿入しないか移動、連通カードである場合、imeiに戻る.電気通信カードを挿入するとmeidに戻ります.8.0以上の場合、getImei()とgetMeid()メソッドで対応するパラメータを正確に取得できます.
    開発時に同じ方法で異なるシステムバージョンや異なるSIMカードで値が異なる場合も、自分で異なる携帯電話を探してみることができます.
    その他デバイスID
    IMEI/MEID以外にも一部のidを取得しようとしています
    android_id
    String andoirdID =Settings.Secure.getString(context.applicationContext.contentResolver, Settings.Secure.ANDROID_ID )
    

    注意:一部のデバイスAndroid Idは空または複数のデバイスAndroid Idが同じである可能性があります.
    oaid(知らないことは自分で調べてもいい)
    //モバイルセキュリティ連盟AMSに対応するSDKを申請し、ドキュメントをドッキングする必要があるhttp://www.msa-alliance.cn/col.jsp?id=120
    ここに私がダウンロードしたのがあって、すでにアップロードしましたhttps://download.csdn.net/download/MirkoWug/12737761これをそのまま使ってもいいし、