Android 下获取 ICCID、电话号码 的两种方式

本文详细介绍了在Android设备上获取SIM卡信息的方法,包括读取ICCID和电话号码。探讨了不同Android版本和双卡手机下获取信息的差异,并提供了API22以上版本的代码示例。

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

一、需要权限:
   <uses-permission android:name="android.permission.READ_PHONE_STATE" />
二、获取方法:
  1. 常规方法:
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(context.TELEPHONY_SERVICE);
String  iccid    = telephonyManager.getSimSerialNumber();
String  phoneNumber = telephonyManager.getLine1Number();
  1. 在 Android Q 以后,就不能获取到值了

  2. 如果是双卡手机,SIM卡槽1插卡时,获取到的是1卡的值。SIM卡槽1没有插卡时,获取到的是2卡的值。

  1. 第二种方法:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP_MR1)
{
    SubscriptionManager sm = SubscriptionManager.from(context);
    List<SubscriptionInfo> sis =sm.getActiveSubscriptionInfoList();
    if (sis.size() >= 1)
    {
        SubscriptionInfo si1 = sis.get(0);
        String iccId1 = si1.getIccId();
        String phoneNum1 = si1.getNumber();
    }
    if (sis.size() >= 2)
    {
        SubscriptionInfo si2 = sis.get(1);
        String iccId2 = si2.getIccId();
        String phoneNum2 = si2.getNumber();
    }
    // 获取SIM卡数量相关信息:
    int count = sm.getActiveSubscriptionInfoCount();//当前实际插卡数量
    int max   = sm.getActiveSubscriptionInfoCountMax();//当前卡槽数量
}
  1. 只能在API 22及以上使用

  2. 可以获取到卡槽数量、当前插卡数量

  3. 可以获取到每个卡的信息:ICCID、电话号码等

### 获取热点连接相关卡号的技术实现 在物联网 (IoT) 的应用场景中,设备通常会通过 Wi-Fi 或蜂窝网络建立热点连接。为了获取与热点连接相关的卡号(例如 SIM 卡号),可以采用以下方法和技术: #### 1. 使用 AT 命令读取 IMSI 号码 大多数嵌入式模块支持通过串口发送 AT 命令来查询 SIM 卡的相关信息。IMSI(International Mobile Subscriber Identity)号码是唯一识别 SIM 卡的关键字段之一。可以通过如下命令获取 IMEI 和 IMSI: ```bash AT+CIMI // 查询 IMSI 号码 AT+CGSN // 查询设备的 IMEI 号码 ``` 这些命令可以直接通过 UART 接口向通信模组发送并解析返回值[^2]。 #### 2. 调用 API 访问运营商接口 如果设备运行的是操作系统(如 Linux 或 Android),则可通过调用特定库函数访问底层硬件资源。例如,在 Linux 平台上,`libqmi` 是一种常用的工具包,能够帮助开发者提取 QMI 数据服务中的 ICCID 和 IMSI 字段。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char cmd[50]; FILE *fp; strcpy(cmd, "mmcli -m 0 --sim-get-iccid"); fp = popen(cmd, "r"); if (fp == NULL) { printf("Failed to run command\n" ); exit(1); } char iccid[20]; fscanf(fp, "%s", iccid); pclose(fp); printf("ICCID: %s\n", iccid); } ``` 上述代码片段展示了如何利用 `mmcli` 工具捕获指定 Modem 上绑定的 ICCID 编号[^4]。 #### 3. 配置 IoT 设备以报告身份数据 某些情况下,可能需要将采集到的信息上传至云端平台以便进一步处理分析。OneNet 是中国移动推出的开放云服务平台,允许用户轻松管理海量终端节点的数据流传输过程。下面是一个简单的示例程序说明怎样把传感器测量结果连同对应的卡片编号一并发往服务器端存储起来: ```python import requests from time import sleep def send_data_to_onenet(api_key, device_id, sim_card_number, temperature, humidity): url = f"http://api.heclouds.com/devices/{device_id}/datapoints" headers = {"api-key": api_key} payload = [ {"id":"temp","value":temperature}, {"id":"hum","value":humidity}, {"id":"card_num","value":sim_card_number}] response = requests.post(url,json=payload,headers=headers) if __name__ == "__main__": API_KEY = 'your_api_key_here' DEVICE_ID = 'your_device_id_here' while True: temp_value = read_temperature_sensor() hum_value = read_humidity_sensor() card_info = fetch_sim_card_details_via_at_commands_or_other_method() send_data_to_onenet(API_KEY, DEVICE_ID, card_info['imsi'], temp_value, hum_value) sleep(60*5) # Wait five minutes before next transmission cycle. ``` 此脚本假定存在两个辅助函数分别负责实际物理量检测以及从本地无线通讯单元那里取得当前激活状态下的手机号标签属性值[^1]。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值