代码在模拟器正常运行但真机失效:获取手机号问题排查
排查SubscriptionManager获取手机号真机失效的代码问题
以下是代码中存在的关键问题及修复方案:
1. 不必要的API版本限制导致低版本真机无法执行
你的btnGetPhoneNumber方法添加了@RequiresApi(api = Build.VERSION_CODES.TIRAMISU)(对应Android 13/API33)注解,但SubscriptionManager.getPhoneNumber()实际在API22就已引入。这会导致Android12及以下的真机点击按钮时直接跳过方法执行,出现无响应,而API33+的模拟器可正常运行。
修复:移除该注解,确保全版本兼容:
// 移除@RequiresApi(api = Build.VERSION_CODES.TIRAMISU)注解 public void btnGetPhoneNumber(View view) { SubscriptionManager subscriptionManager = (SubscriptionManager) getSystemService(TELEPHONY_SUBSCRIPTION_SERVICE); // 后续逻辑不变 }
2. 权限请求后未处理用户授权结果
onCreate中请求权限后直接return,但未实现onRequestPermissionsResult方法处理用户授权后的逻辑。真机上用户授予权限后,应用不会重新触发权限检查,后续点击按钮仍可能因权限判断失败而无法执行。
修复:添加权限回调处理:
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 1) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { txtPhoneNumber.setText("权限已授予,请点击按钮获取手机号"); } else { txtPhoneNumber.setText("权限被拒绝,无法获取手机号"); } } }
3. 直接使用默认订阅ID存在适配隐患
SubscriptionManager.DEFAULT_SUBSCRIPTION_ID在多SIM卡设备或未正确识别SIM的真机上可能无效,导致获取不到手机号。建议先获取激活的SIM订阅列表,再选择有效ID:
修改按钮点击方法的获取逻辑:
if (ActivityCompat.checkSelfPermission(this, READ_PHONE_NUMBERS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{READ_PHONE_NUMBERS}, 1); return; } // 获取激活的SIM订阅列表 List<SubscriptionInfo> activeSubscriptions = subscriptionManager.getActiveSubscriptionInfoList(); if (activeSubscriptions != null && !activeSubscriptions.isEmpty()) { SubscriptionInfo info = activeSubscriptions.get(0); String phoneNumber = subscriptionManager.getPhoneNumber(info.getSubscriptionId()); txtPhoneNumber.setText(phoneNumber != null ? phoneNumber : "未获取到手机号"); } else { txtPhoneNumber.setText("未检测到激活的SIM卡"); }
4. 权限声明可能缺失
确保AndroidManifest.xml中添加必要权限:
<!-- API26+ 所需权限 --> <uses-permission android:name="android.permission.READ_PHONE_NUMBERS"/> <!-- 兼容API26以下设备,部分厂商可能需要 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" android:maxSdkVersion="25"/>
额外说明
若修复后仍无法获取,可能是运营商未将手机号写入SIM卡,或设备隐私机制限制,需结合真机具体情况排查。
内容的提问来源于stack exchange,提问作者Hassan Usman
相关产品推荐
相关产品推荐

