Android 13下获取SIM序列号(ICCID)遇问题求解决
在Android 13中获取SIM序列号(ICCID)的解决方案
问题核心
Android 13(API 33)收紧了隐私权限管控,原有的READ_PHONE_STATE权限不再允许获取ICCID,必须申请专门的权限才能正常获取该信息。
解决方案步骤
1. 更新权限声明
在AndroidManifest.xml中添加适配Android 13的权限,同时保留旧权限以兼容低版本系统:
<!-- 兼容Android 12及以下版本 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- Android 13及以上版本获取ICCID所需权限 --> <uses-permission android:name="android.permission.READ_PHONE_NUMBERS" /> <!-- 若应用本身需要读取短信,也可使用READ_SMS权限替代 --> <!-- <uses-permission android:name="android.permission.READ_SMS" /> -->
2. 动态申请权限
READ_PHONE_NUMBERS和READ_SMS均为危险权限,必须在运行时向用户申请:
private static final int REQUEST_CODE_PHONE_PERMISSIONS = 1001; // 检查并申请权限 private void checkAndRequestPermissions() { List<String> permissionsNeeded = new ArrayList<>(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_NUMBERS) != PackageManager.PERMISSION_GRANTED) { permissionsNeeded.add(Manifest.permission.READ_PHONE_NUMBERS); } } else { if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { permissionsNeeded.add(Manifest.permission.READ_PHONE_STATE); } } if (!permissionsNeeded.isEmpty()) { ActivityCompat.requestPermissions(this, permissionsNeeded.toArray(new String[0]), REQUEST_CODE_PHONE_PERMISSIONS); } else { // 权限已授予,直接获取ICCID getSimSerialNumber(); } } // 处理权限申请结果 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_CODE_PHONE_PERMISSIONS) { boolean allGranted = true; for (int result : grantResults) { if (result != PackageManager.PERMISSION_GRANTED) { allGranted = false; break; } } if (allGranted) { getSimSerialNumber(); } else { Toast.makeText(this, "需要权限才能获取SIM序列号", Toast.LENGTH_SHORT).show(); } } }
3. 获取ICCID的兼容代码
权限申请通过后,使用SubscriptionManager获取ICCID,适配Android 13的API变化:
private void getSimSerialNumber() { SubscriptionManager subscriptionManager = getSystemService(SubscriptionManager.class); if (subscriptionManager != null) { List<SubscriptionInfo> subscriptionInfoList; // Android 13及以上使用getActiveSubscriptionInfoListCompat提升兼容性 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { subscriptionInfoList = subscriptionManager.getActiveSubscriptionInfoListCompat(); } else { subscriptionInfoList = subscriptionManager.getActiveSubscriptionInfoList(); } if (subscriptionInfoList != null && !subscriptionInfoList.isEmpty()) { for (SubscriptionInfo info : subscriptionInfoList) { String iccid = info.getIccId(); if (iccid != null) { // 处理获取到的ICCID,例如打印日志或展示 Log.d("SIM_DETAIL", "ICCID: " + iccid); } } } else { Log.d("SIM_DETAIL", "无活跃SIM卡"); } } }
注意事项
- 优先使用
READ_PHONE_NUMBERS权限,它比READ_SMS权限更轻量化,仅针对SIM相关信息获取。 - 必须确保用户授予权限后再调用获取ICCID的方法,否则会返回
null。 - 多SIM卡设备下,遍历
subscriptionInfoList可获取所有活跃SIM卡的ICCID。
内容的提问来源于stack exchange,提问作者Vishal Sojitra
相关产品推荐
相关产品推荐

