Android获取手机IMEI,IMSI, MAC标识和唯一标识的生成

本文深入解析了Android设备上的各种唯一标识符,包括IMEI、IMSI、MAC地址、蓝牙地址和InstalltionID,探讨了它们的用途、权限需求及如何在代码中获取。同时,介绍了结合多种标识符生成CombinedDeviceID的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

急的直接看这个:

android 获取设备IMEI与序列号:

​
//IMEI(imei)
TelephonyManager tm = (TelephonyManager) ChinaApplication.getAppContext().getSystemService(Context.TELEPHONY_SERVICE);
String imei = tm.getDeviceId();
if(!TextUtils.isEmpty(imei)){
    deviceId.append("imei");
    deviceId.append(imei);
    return deviceId.toString();
}

//序列号(sn)
String sn = tm.getSimSerialNumber();
if(!TextUtils.isEmpty(sn)){
    deviceId.append("sn");
    deviceId.append(sn);
    return deviceId.toString();
}

​

Android的几种标识

1. IMEI

IMEI(International Mobile Equipment Identity)是国际移动设备身份码的缩写,国际移动装备辨识码,是由15位数字组成的"电子串号",它与每台移动电话机一一对应,而且该码是全世界唯一的。每一只移动电话机在组装完成后都将被赋予一个全球唯一的一组号码,这个号码从生产到交付使用都将被制造生产的厂商所记录。

PS:通俗来讲就是标识你当前设备(手机)全世界唯一,类似于个人身份证

权限要求:android.permission.READ_PHONE_STATE

​
public synchronized static String getid(Context context) { 
    TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);  
    String ID= TelephonyMgr.getDeviceId(); 
    return ID;
}

​

2. IMSI

国际移动用户识别码(IMSI:International Mobile Subscriber Identification

Number)是区别移动用户的标志,储存在SIM卡中,可用于区别移动用户的有效信息。其总长度不超过15位,同样使用0~9的数字。其中MCC是移动用户所属国家代号,占3位数字,中国的MCC规定为460;MNC是移动网号码,由两位或者三位数字组成,中国移动的移动网络编码(MNC)为00;用于识别移动用户所归属的移动通信网;MSIN是移动用户识别码,用以识别某一移动通信网中的移动用户

PS:通俗来讲就是标识你当前SIM卡(手机卡)唯一,同样类似于个人身份证


3. MAC

MAC(Media Access Control或者Medium Access Control)地址,意译为媒体访问控制,或称为物理地址、硬件地址,用来定义网络设备的位置。在OSI模型中,第三层网络层负责 IP地址,第二层数据链路层则负责 MAC地址。因此一个主机会有一个MAC地址,而每个网络位置会有一个专属于它的IP地址

PS:通俗来讲就是标识你当前使用我这个软件(功能)时的地址

最主要的是:在平板设备上,无法通过imei标示设备,我们会将mac地址作为用户的唯一标识

权限要求:android.permission.ACCESS_WIFI_STATE 

​
public synchronized static String getMacid(Context context) { 
      WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
       String WLANMAC = wm.getConnectionInfo().getMacAddress();
       return WLANMAC ;
 }

​

4. 蓝牙

权限要求:android.permission.BLUETOOTH

​
public synchronized static String getMacid(Context context) { 
    BluetoothAdapter mBlueth= BluetoothAdapter.getDefaultAdapter();  
    String mBluethId= mBlueth.getAddress();
     return mBluethId; 
}

​

5. Installtion ID

     考虑到Android设备的多样性,比如一些平板没有通话功能,或者部分低价设备没有WLAN或者蓝牙,甚至用户不愿意赋予APP这些需要的权限,我们就使用无需权限的方法;这种方式的原理是在程序安装后第一次运行时生成一个ID,该方式和设备唯一标识不一样,不同的应用程序会产生不同的ID,同一个程序重新安装也会不同。所以这不是设备的唯一ID,但是可以保证每个用户的ID是不同的。可以说是用来标识每一份应用程序的唯一ID(即Installtion ID),可以用来跟踪应用的安装数量等。 

​
public class GetDeviceid { 
private static String sID = null; 
private static final String INSTALLATION = "INSTALLATION"; 
public synchronized static String id(Context context) { 
      if (sID == null) {
         File installation = new File(context.getFilesDir(), INSTALLATION); 
      try {
     if (!installation.exists()) 
        writeInstallationFile(installation);
         sID = readInstallationFile(installation); 
    } catch (Exception e) {
     throw new RuntimeException(e); 
    } 
  } 
      return sID;
 }

 private static String readInstallationFile(File installation) throws IOException { 
      RandomAccessFile f = new RandomAccessFile(installation, "r"); 
      byte[] bytes = new byte[(int) f.length()];
      f.readFully(bytes); 
      f.close(); 
      return new String(bytes);
 } 

private static void writeInstallationFile(File installation) throws IOException { 
      FileOutputStream out = new FileOutputStream(installation); 
      String id = UUID.randomUUID().toString(); 
      out.write(id.getBytes());
       out.close(); 
    }
}

​

5. Combined Device ID

      综上所述,我们有多种方式取得设备的唯一标识。它们中的一些可能会返回null,或者由于硬件缺失、权限问题等获取失败。但你总能获得至少一个能用。所以,最好的方法就是通过拼接,或者拼接后的计算出的MD5值来产生一个结果。

String m_szLongID = m_szImei + m_szDevIDShort + m_szAndroidID+ m_szWLANMAC + m_szBTMAC;
     MessageDigest m = null;
     try { 
        m = MessageDigest.getInstance("MD5"); 
    } catch (NoSuchAlgorithmException e) { 
        e.printStackTrace(); 
  } 
      m.update(m_szLongID.getBytes(),0,m_szLongID.length()); 
    
// get md5 bytes  
      byte p_md5Data[] = m.digest(); 

// create a hex string  
      String m_szUniqueID = new String();
       for (int i=0;i<p_md5Data.length;i++) {
           int b = (0xFF & p_md5Data[i]);
                if (b <= 0xF) {
                  m_szUniqueID+="0"; 
              }
              
          // add number to string  
          m_szUniqueID+=Integer.toHexString(b);
         }

 // hex string to uppercase 
 m_szUniqueID = m_szUniqueID.toUpperCase();

另外直接生成UUID也是一个额外的便捷选择。通常我们建议使用UUID来标识对象或持久化数据。UUID详情见这篇博客:java /python UUID 生成_许进进的博客-优快云博客

### Java获取 Android 设备唯一标识的方法 在 Java 编程环境中,可以通过调用 Android 提供的相关 API 来获取设备的唯一标识符。以下是几种常见的实现方式: #### 方法一:通过 `ANDROID_ID` 获取设备唯一标识 可以使用 `Secure.ANDROID_ID` 来获取设备的唯一标识符。此 ID 是由 Google 定义的一个 64 位数字符串,通常用于表示设备的独特身份。 ```java import android.provider.Settings.Secure; public class DeviceIdentifier { public static String getAndroidID(android.content.Context context) { return Secure.getString(context.getContentResolver(), Secure.ANDROID_ID); } } ``` 上述代码片段展示了如何利用 `Secure.ANDROID_ID` 获取设备的唯一标识[^1]。 --- #### 方法二:通过 IMSI 获取国际移动用户识别码 IMSI(International Mobile Subscriber Identity)是运营商分配给用户的唯一编号,可用于区分不同的 SIM 卡持有者。需要注意的是,在某些情况下可能无法访问该属性,因为其权限已被严格控制于 Android 的隐私政策之中。 ```java import android.os.SystemProperties; import android.telephony.TelephonyProperties; public class DeviceIdentifier { public static String getIMSI() { try { return SystemProperties.get(TelephonyProperties.PROPERTY_IMSI); } catch (Exception e) { return null; // 如果无权访问,则返回 null } } } ``` 以上代码实现了基于系统属性读取 IMSI 值的功能[^2]。然而请注意,自 Android 10 起,应用需具备特殊权限才能访问此类敏感数据。 --- #### 方法三:其他替代方案 由于隐私保护策略日益增强,传统的 IMEIMAC 地址等方式已逐渐被废弃或受限。开发者可考虑采用以下两种推荐做法之一作为补充手段: 1. **UUID**:创建并存储一个随机生成的 UUID 字符串至本地 SharedPreferences 文件中; 2. **Firebase Installation ID**:借助 Firebase SDK 自动生成全局唯一的安装实例号。 这两种方法均能有效规避因硬件变更而导致原有标志失效的风险。 --- ### 注意事项 - 使用任何涉及个人隐私的数据前,请务必确认应用程序拥有足够的运行时权限。 - 部分旧版技术路径可能会在未来版本中遭到弃用甚至完全禁用,因此建议优先选用官方文档推荐的最佳实践。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

许进进

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值