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

新版Google Phone Picker无法正常工作的问题咨询

背景

过去,可通过以下方式实现手机号选择器:

implementation "com.google.android.gms:play-services-auth:20.7.0"

代码示例:

private val requestFillPhoneNumber: ActivityResultLauncher<IntentSenderRequest> =
    registerForActivityResult(
        ActivityResultContracts.StartIntentSenderForResult()) { result: ActivityResult ->
        if (result.resultCode != Activity.RESULT_OK)
            return@registerForActivityResult
        val cred: Credential = result.data?.getParcelableExtraCompat(Credential.EXTRA_KEY)
            ?: return@registerForActivityResult
        val phoneNumber = cred.id
        Log.d("AppLog", "phone:$phoneNumber")
    }

private fun showPhonePickerDialog() {
    val hintRequest = HintRequest.Builder().setPhoneNumberIdentifierSupported(true).build()
    val intent = Credentials.getClient(this).getHintPickerIntent(hintRequest)
    try {
        requestFillPhoneNumber.launch(IntentSenderRequest.Builder(intent.intentSender).build())
    } catch (e: Exception) {
        Log.d("AppLog", "failed to show phone picker using old method:$e")
    }
}

问题描述

近期新版本移除了上述类,因此改用以下依赖:

implementation 'com.google.android.gms:play-services-auth:21.1.1'

代码示例:

private val phoneNumberHintIntentResultLauncher: ActivityResultLauncher<IntentSenderRequest> =
    registerForActivityResult(
        ActivityResultContracts.StartIntentSenderForResult()
    ) { result ->
        try {
            val phoneNumber =
                Identity.getSignInClient(this).getPhoneNumberFromIntent(result.data)
            Log.d("AppLog", "phone:$phoneNumber")
        } catch (e: Exception) {
            Log.d("AppLog", "failed to get phone number from picker:$e")
        }
    }

private fun showNewPhonePickerDialog() {
    val request: GetPhoneNumberHintIntentRequest =
        GetPhoneNumberHintIntentRequest.builder().build()
    Identity.getSignInClient(this)
        .getPhoneNumberHintIntent(request)
        .addOnSuccessListener {
            phoneNumberHintIntentResultLauncher.launch(
                IntentSenderRequest.Builder(it.intentSender).build()
            )
        }
        .addOnFailureListener { e ->
            Log.d("AppLog", "failed to show phone picker using new method:$e")
        }
}

但新版实现存在不一致性,甚至返回错误结果:

  • 在API 34模拟器上可正常工作。
  • 在搭载Android 14的Pixel 6和Android 13的三星A32上,抛出异常 com.google.android.gms.common.api.ApiException: 16: No phone number is found on this device.,且无法弹出选择器对话框。
  • 在搭载API 33的荣耀Magic4 Pro上,返回多SIM卡手机号,但国家前缀错误(显示“+1”而非正确的“+972”),经号码验证工具验证无效。

已尝试方案

虽存在替代方案(如使用subscriptionManager.activeSubscriptionInfoList配合subscriptionManager.getPhoneNumber,或旧版telephonyManager.line1Number),但需申请电话权限,而官方推荐的该方式可让用户自主选择。此前已通过官方问题跟踪平台反馈问题,但至今未修复。

咨询问题

  1. 我的新版实现是否正确?
  2. 若实现无误,应向何处反馈该问题?
  3. 为何部分设备会返回错误的手机号国家前缀?

内容的提问来源于stack exchange,提问作者android developer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 23:22:09