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()