Android获取手机号提示报ApiException:16,求解决方案(HintRequest已弃用)
解决GetPhoneNumberHintIntentRequest报错16的问题
报错原因分析
错误码16对应CommonStatusCodes.NO_PHONE_NUMBER_FOUND,说明系统无法检测到设备上已关联的手机号,常见触发场景包括:
- 设备未插入有效SIM卡,或SIM卡未注册手机号
- 系统设置中未保存手机号(部分双卡设备仅识别主卡信息)
- Google Play服务版本低于20.0.0(
GetPhoneNumberHintIntentRequest的最低兼容版本)
修复步骤与代码优化
1. 验证基础运行条件
- 确认设备已插入激活状态的SIM卡,且SIM卡已绑定手机号
- 检查Google Play服务版本,确保已更新至20.0.0及以上
2. 配置并申请必要权限
在AndroidManifest.xml中添加权限声明:
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="com.google.android.gms.permission.PHONE_NUMBER_HINT" />
调用获取手机号方法前,先动态申请READ_PHONE_STATE权限:
if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> { if (isGranted) { getHintPhoneNumber(); } else { // 提示用户需授权才能自动填充手机号 } }).launch(Manifest.permission.READ_PHONE_STATE); return; }
3. 优化错误处理逻辑
修改getHintPhoneNumber方法的失败回调,针对性处理错误码16:
public void getHintPhoneNumber() { Log.d("getHintPhoneNumber", "getHintPhoneNumber"); GetPhoneNumberHintIntentRequest request = GetPhoneNumberHintIntentRequest.builder().build(); Identity.getSignInClient(getActivity()) .getPhoneNumberHintIntent(request) .addOnSuccessListener(result -> { try { phoneNumberHintIntentResultLauncher.launch( new IntentSenderRequest.Builder(result.getIntentSender()).build() ); } catch (Exception e) { e.printStackTrace(); } }) .addOnFailureListener(e -> { if (e instanceof ApiException) { ApiException apiException = (ApiException) e; if (apiException.getStatusCode() == CommonStatusCodes.NO_PHONE_NUMBER_FOUND) { setErrorField("未检测到设备关联手机号,请手动输入", phonenumber_error); } else { e.printStackTrace(); } } else { e.printStackTrace(); } }); }
4. 完善ActivityResult处理
替换原StartActivityForResult为更适配的StartIntentSenderForResult,并补充空值判断:
ActivityResultLauncher<IntentSenderRequest> phoneNumberHintIntentResultLauncher = registerForActivityResult( new ActivityResultContracts.StartIntentSenderForResult(), result -> { try { phoneNumber = Identity.getSignInClient(getActivity()).getPhoneNumberFromIntent(result.getData()); if (phoneNumber != null && !phoneNumber.isEmpty()) { phonenumber_error.setVisibility(View.GONE); et_otp_InputMobile.setText(phoneNumber); } else { setErrorField("请输入手机号", phonenumber_error); } } catch (ApiException apiException) { if (apiException.getStatusCode() == CommonStatusCodes.NO_PHONE_NUMBER_FOUND) { setErrorField("未检测到设备关联手机号,请手动输入", phonenumber_error); } else { apiException.printStackTrace(); } } catch (Exception e) { e.printStackTrace(); } });
测试建议
- 使用真机测试(模拟器通常无法模拟真实SIM卡的手机号信息)
- 双卡设备可尝试切换主卡后重新触发获取逻辑
- 确认Google Play服务已更新至最新稳定版本
内容的提问来源于stack exchange,提问作者Liya
相关产品推荐
相关产品推荐

