You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

代码在模拟器正常运行但真机失效:获取手机号问题排查

排查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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 11:23:22