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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 14:23:12