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

Xamarin Android 6.0 Marshmallow下无法通过代码获取手机号求助

解决Android 6.0 Marshmallow中TelephonyManager获取Line1Number返回空字符串的问题

嘿,这个问题在Android 6.0及以上版本里真的挺常见的——哪怕你已经授予了所有权限,Line1Number还是可能返回空。我来帮你拆解下可能的原因,以及对应的解决办法:

最常见的原因:SIM卡本身没存储号码

很多运营商并不会把你的手机号写入SIM卡的Line1字段,这是导致返回空的头号原因。你可以先换一台手机插这张SIM卡试试,如果其他设备也看不到本机号码,那大概率是SIM卡的问题,直接联系运营商让他们把号码写入SIM卡就行。

权限申请方式可能不对

Android 6.0开始引入了动态权限机制,READ_PHONE_STATE属于危险权限,光在Manifest里声明是不够的,必须在运行时主动向用户申请权限。你可以检查下自己的权限申请逻辑是不是正确,比如:

// 先检查权限是否已授予
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) 
    != PackageManager.PERMISSION_GRANTED) {
    // 如果没授权,发起权限请求
    ActivityCompat.requestPermissions(this, 
        new String[]{Manifest.permission.READ_PHONE_STATE}, 
        100); // 100是自定义的请求码
} else {
    // 权限已授权,尝试获取号码
    TelephonyManager mTelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    String contact = mTelephonyMgr.getLine1Number();
}

另外,有些厂商的定制系统会额外限制这个API的调用,哪怕权限给了也拿不到数据,这种情况就属于系统层面的限制了。

替代方案:别依赖Line1Number,换更可靠的方式

由于getLine1Number()的可靠性本来就不高(受SIM卡、运营商、系统限制太多),现在主流APP都会用用户手动输入+短信验证码的方式来获取和验证手机号,这种方式更稳定,也不会受SIM卡的影响。

另外提个小细节:你代码里的GetSystemService(TelephonyService)应该是getSystemService(Context.TELEPHONY_SERVICE),可能是输入时的笔误,但如果你的代码已经能运行,那可能只是书写问题~

内容的提问来源于stack exchange,提问作者Gurvinder Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:18:29