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
相关产品推荐
相关产品推荐

