新版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),但需申请电话权限,而官方推荐的该方式可让用户自主选择。此前已通过官方问题跟踪平台反馈问题,但至今未修复。
咨询问题
- 我的新版实现是否正确?
- 若实现无误,应向何处反馈该问题?
- 为何部分设备会返回错误的手机号国家前缀?
内容的提问来源于stack exchange,提问作者android developer
相关产品推荐
相关产品推荐

