Android各バージョンでIMEI、MEIDを取得
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を返します.
ツールクラス
Demoの例:
8.0以下のシステム(カード1:移動/連通、カード2:電気通信)
8.0以上10以下のシステム(カード1:移動/連通、カード2:電気通信)
違いは、8.0以下のgetDeviceId()はSIMカードに基づいて対応機器idを取得し、カードを挿入しないか移動、連通カードである場合、imeiに戻る.電気通信カードを挿入するとmeidに戻ります.8.0以上の場合、getImei()とgetMeid()メソッドで対応するパラメータを正確に取得できます.
開発時に同じ方法で異なるシステムバージョンや異なるSIMカードで値が異なる場合も、自分で異なる携帯電話を探してみることができます.
その他デバイスID
IMEI/MEID以外にも一部のidを取得しようとしています
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これをそのまま使ってもいいし、
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取得状況
ツールクラス
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これをそのまま使ってもいいし、