andriod获取带字母的iccid

获取ICCID全20位方法
本文介绍了一种在ICCID包含字母时,通过AT命令而非常规Android接口获取完整20位ICCID的方法。作者在尝试使用TelephonyManager获取ICCID失败后,通过直接操作4G模组并发送AT命令成功获取到了完整的ICCID。文中提供了具体的代码实现,包括读写串口文件的函数及AT命令的发送与接收。

在iccid没有字母的 时候可以用如下代码

TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
iccid = tm.getSimSerialNumber();

但有字母的时候,获取不到20位,在硬件小哥的建议下使用at命令。一开始苦于找不到at的串口,后来直接把4g模组给拆下来,对比后发现少了5个串口,然后一个个试就成功了,以下是实现代码

    void Receive(String file) {
        RandomAccessFile localRandomAccessFile = null;
        try {
            localRandomAccessFile = new RandomAccessFile(file, "r");
            byte[] arrayOfByte = new byte[1024];
            int readSize = 0;
            while ((readSize = localRandomAccessFile.read(arrayOfByte)) == -1) {

            }
            String response = new String(arrayOfByte).substring(0, readSize);
            LogUtils.e("re:"+response);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }
    void Send(String file, String cmd){
        RandomAccessFile localRandomAccessFile = null;
        try {
            localRandomAccessFile = new RandomAccessFile(file, "rw");
            localRandomAccessFile.writeBytes(cmd + "\r\n");
            localRandomAccessFile.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

读写方法只用来测试,根据业务还可以优化

        String com = "/dev/ttyUSB3";
        Send(com,"at+qccid");
        Receive(com);

不同4g模组ccid的指令可能不同,我在网上看的就和我这个不一样,可以测试一下,我这边有模组的文档还是比较好的

后面两个不完全的就是用安卓接口获取的,可以看到从英文f后都被过滤了

<think>嗯,用户现在想知道在Android13中获取ICCID的方法或权限设置。首先需要回顾之前的引用内容,尤其是引用[1]提到在Android11及更高版本中,getIccId()方法返回空字符串,而引用[2]和引用[3]建议用getSubscriptionId()替代。这说明在Android13下,直接获取完整ICCID已经被限制,需要寻找替代方案。接下来要确定用户可能的需求场景。用户可能需要唯一标识SIM卡,而不仅仅是ICCID。引用[1]和引用[3]都提到getSubscriptionId()能提供唯一且持久的标识符,除非恢复出厂设置。这可能是更合适的解决方案。然后考虑权限设置。根据引用[2]和引用[3],需要检查危险权限,特别是READ_PHONE_STATE和READ_PRIVILEGED_PHONE_STATE。但普通应用可能无法获得后者,必须依赖前者。同时,在Android10以上,READ_PHONE_STATE权限的作用域缩小,可能需要动态请求。用户提到Android13,需注意该版本的权限变更。可能限制更严格,因此直接获取ICCID的方法是否可行存在疑问。参考官方文档,Android11开始限制ICCID访问,所以Android13应该延续这一策略。需要确认替代方法,如使用getSubscriptionId()或检查SubscriptionInfo的其他字段。另外,引用[2]提到获取到的ICCID不完整,可能用户遇到同样问题。解决方案包括检查权限,确保在清单中声明并动态请求权限。如果用户需要真正获取ICCID,可能需要特殊权限如carrierprivileges,但这对普通应用不现实。所以总结:用户的核心需求是唯一标识SIM卡,而Android13中获取ICCID受限,推荐使用getSubscriptionId()作为替代方案。如果必须获取ICCID,需要权限和正确的方法调用,但结果可能为空或不完整。需要分步骤指导用户处理权限和实现代码。最后,生成相关问题帮助用户深入:包括替代方案比较、访问完整ICCID的限制因素、权限请求的最佳实践,以及eSIM处理。确保用户全面理解当前限制和可行方法。</think> 在 Android 13 中获取真实的 ICCID 受到严格限制,主要解决方案是使用替代标识符。以下是完整实现方法和关键点: ### 📱 一、核心限制与替代方案 (Android 11+) 1. **`getIccId()` 限制** 系统返回非 null 空字符串 `""`,无法获取真实 ICCID ⚠️ *源码示例(无效)*: ```java String iccid = telephonyManager.getIccId(); // 返回空字符串 ``` 2. **推荐替代标识符** ✅ ```java int subId = telephonyManager.getSubscriptionId(); ``` - 提供从 `1` 开始的整数索引 - 对同一张 SIM 卡保持不变(恢复出厂设置除外) - 支持实体 SIM 和 eSIM ### 🔒 二、权限配置要求 在 `AndroidManifest.xml` 声明: ```xml <uses-permission android:name="android.permission.READ_PHONE_STATE"/> ``` *动态请求代码*: ```java if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_CODE); } ``` ### ⚡ 三、获取 SIM 卡标识符的完整流程 ```java TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); // 1. 获取 SubscriptionId (推荐) int subscriptionId = tm.getSubscriptionId(); // 2. 获取 ICCID (可能返回空值) String iccid = ""; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { iccid = tm.getUiccSlotsInfo()[0].getIccId(); // 尝试但可能失败 } // 3. 通过 SubscriptionInfo 获取更多信息 SubscriptionManager sm = (SubscriptionManager) getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE); List<SubscriptionInfo> subs = sm.getActiveSubscriptionInfoList(); if (subs != null) { for (SubscriptionInfo sub : subs) { int id = sub.getSubscriptionId(); String carrierName = sub.getCarrierName(); // getIccId() 同样受限制 } } ``` ### 🔐 四、注意事项 1. **`READ_PRIVILEGED_PHONE_STATE` 不可用** 该权限仅限系统应用 2. **多卡设备处理** 使用 `TelephonyManager.createForSubscriptionId(int subId)` 区分不同 SIM 卡 3. **结果可靠性** | 方法 | 稳定性 | 隐私合规性 | 适用场景 | |---|---|----|---| | `getSubscriptionId()` | 高 ✅ | 高 ✅ | 设备内唯一标识 | | 直接获取 ICCID | 低 ⚠️ | 受限 ❌ | 特殊特权应用 | > 参考:Android 官方明确限制非重置标识符访问以保护用户隐私[^1],替代方案应优先使用 subscriptionId[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值