Android 电话号码获取的正确方法:解决常见问题
2024-03-19 04:03:02
获取电话号码的正确方法
简介
在 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.activeSubscriptionInfoList
和subscriptionManager.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.activeSubscriptionInfoList
和 subscriptionManager.getPhoneNumber()
作为替代方法。