返回

Android 电话号码获取的正确方法:解决常见问题

Android

获取电话号码的正确方法

简介

在 Android 设备上获取电话号码至关重要,因为它可用于各种应用程序,例如身份验证、短信和来电识别。虽然曾经有许多方法可以获取电话号码,但 Google Play Services 最近的更新已更改了这种情况。本文将介绍获取电话号码的正确方法,并探讨常见问题和解决办法。

正确的方法

自 Play Services v21 开始,获取电话号码的官方方法是使用 Identity.getSignInClient() 获取 GetPhoneNumberHintIntent。此方法会返回一个 IntentSender,该 IntentSender 可以启动一个对话框,允许用户选择他们的电话号码。

private val phoneNumberHintIntentResultLauncher =
    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 showPhonePickerDialog() {
    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")
        }
}

常见问题

错误:16: 此设备上未找到电话号码

此错误通常在模拟器或某些设备上发生。确保您的设备具有电话号码,并且已授予该应用程序拨打电话的权限。

不正确的国家前缀

一些设备可能会返回不正确的国家前缀。这是 Play Services 的一个已知问题,正在解决中。作为临时解决办法,您可以使用 libphonenumber 库手动更正前缀。

无效的电话号码

如果返回的电话号码无效,则可能是因为该设备上的电话号码存在问题。请尝试使用其他方法(例如 subscriptionManager.getPhoneNumber())获取电话号码。

替代方法

除了使用 Identity.getSignInClient() 之外,还可以使用以下替代方法获取电话号码:

  • subscriptionManager.activeSubscriptionInfoListsubscriptionManager.getPhoneNumber()
  • 旧的 telephonyManager.line1Number(不推荐使用)

结论

获取 Android 设备上的电话号码至关重要。虽然获取电话号码的方法随着时间的推移而发生变化,但使用 Identity.getSignInClient() 是获取电话号码的最新且推荐的方法。如果您遇到任何问题,请参阅本文中列出的常见问题解答和解决办法。

常见问题解答

1. 为什么以前的方法不再可用?

由于隐私和安全问题,旧的方法已弃用。新方法更安全,并且需要用户明确同意。

2. 我应该在哪里报告有关此方法的问题?

您可以使用此链接向 Google Play Services 报告问题:https://issuetracker.google.com/issues/new?component=741685&template=1271678

3. 这个方法会在所有设备上都正常工作吗?

该方法应该在所有支持 Google Play Services 的设备上正常工作。但是,某些设备可能存在已知的限制。

4. 如何处理不正确的国家前缀?

您可以使用 libphonenumber 库手动更正国家前缀。

5. 如果我无法使用此方法获取电话号码,还有其他替代方法吗?

是的,您可以使用 subscriptionManager.activeSubscriptionInfoListsubscriptionManager.getPhoneNumber() 作为替代方法。