Google的常见Java,C ++和JavaScript库,用于解析,格式化和验证国际电话号码。 Java版本已针对在智能手机上运行而进行了优化,自4.0(冰淇淋三明治)以来,Android Framework使用。
README
。getNumberType
根据数字本身获取数字的类型;能够区分固定线,移动,免费电话,高级费率,共享成本,VoIP,个人数字,UAN,PAGER和语音邮件(只要可行时)。isNumberMatch
对两个数字是否相同,获得了信心水平。getExampleNumber
和getExampleNumberForType
为所有国家/地区提供有效的示例号,并可以选择指定需要哪种类型的示例电话号码。isPossibleNumber
快速猜测一个数字是否仅使用长度信息,比完整验证快得多。isValidNumber
使用长度和前缀信息对区域的电话号码进行全面验证。AsYouTypeFormatter
用户输入每个数字时,正式格式化电话号码。findNumbers
在文本中找到数字。PhoneNumberOfflineGeocoder
提供与电话号码相关的地理信息。PhoneNumberToCarrierMapper
提供与电话号码相关的运营商信息。PhoneNumberToTimeZonesMapper
提供与电话号码相关的时区信息。GITHUB发布后,Java演示的更新略有延迟。
最后一个演示更新:v8.13.50。
注意:即使库(主分支/Maven版本)在v8.12.57,由于某些部署问题,我们也无法使用新的二进制版本更新Java演示。我们很快将解决此问题。同时,请使用JS演示。
如果此数字低于最新版本的版本编号,则我们在发行版之间,并且演示可能在任何一个版本中。
此存储库中有一个称为e.164 formatter的演示Android应用程序。该应用程序的目的是展示一个示例,说明如何在现实生活中使用库,在这种情况下,特别是在使用Java的Android应用中使用库。
JavaScript演示可以以各种标签运行;此链接将带您master
。
要将Java代码包括在您的应用程序中,请与Maven集成(请参阅Wiki)或从Maven存储库中下载最新的罐子。
Javadoc会自动更新,以反映最新版本,网址为https://javadoc.io/doc/com.googlecode.libphonenumber/libphonenumber/。
我们通常按照这些准则选择发布编号。
如果由于上一个版本以来的任何更改都将其推向掌握,与现有性LibphoneNumber API的意图 /规范不相容,或可能导致LibphoneNumber(Java,C ++或JS)客户必须更改代码以保持建筑物,我们发布主要版本。例如,如果最后一个版本是7.7.3,则新版本将是8.0.0。
如果这些更改中的任何一个使客户能够更新其代码以利用新功能,并且如果客户将发布被标记为“不好”的情况,则必须将这些更改倒闭,我们将发布次要版本。例如,我们将从7.7.3到7.8.0。
否则,包括当版本仅包含元数据更改时,我们发布了子罚款版本,例如7.7.3至7.7.4。
有时,我们对代码或元数据进行内部更改,尽管不影响客户的兼容性,但可能会影响图书馆搬运工的兼容性。对于此类更改,我们向LibphoneNumber-Discuss发布了公告。此类更改不会反映在版本编号中,如果没有其他更改,我们将发布子级版本。
想通知新版本吗?在今年的大部分时间里,除了假期和延长的情况外,我们两周都会发布。我们更新发布标签和文档详细发行说明。我们还向LibphoneNumber-Discuss发送了一个公告,每次发行版。
假设您有一个代表来自瑞士的电话号码的字符串。这就是您将其解析/将其归一化为PhoneNumber
对象的方式:
String swissNumberStr = "044 668 18 00" ;
PhoneNumberUtil phoneUtil = PhoneNumberUtil . getInstance ();
try {
PhoneNumber swissNumberProto = phoneUtil . parse ( swissNumberStr , "CH" );
} catch ( NumberParseException e ) {
System . err . println ( "NumberParseException was thrown: " + e . toString ());
}
在这一点上, swissNumberProto
包含:
{
"country_code" : 41 ,
"national_number" : 446681800
}
PhoneNumber
是最初从phonenumber.proto
自动生成的类,具有必要的修改以提高效率。有关每个字段含义的详细信息,请参阅resources/phonenumber.proto
。
现在让我们验证该数字是否有效:
boolean isValid = phoneUtil . isValidNumber ( swissNumberProto ); // returns true
格式化方法支持一些格式,如下所示:
// Produces "+41 44 668 18 00"
System . out . println ( phoneUtil . format ( swissNumberProto , PhoneNumberFormat . INTERNATIONAL ));
// Produces "044 668 18 00"
System . out . println ( phoneUtil . format ( swissNumberProto , PhoneNumberFormat . NATIONAL ));
// Produces "+41446681800"
System . out . println ( phoneUtil . format ( swissNumberProto , PhoneNumberFormat . E164 ));
您还可以选择以从另一个国家拨打的方式格式化数字:
// Produces "011 41 44 668 1800", the number when it is dialed in the United States.
System . out . println ( phoneUtil . formatOutOfCountryCallingNumber ( swissNumberProto , "US" ));
PhoneNumberUtil phoneUtil = PhoneNumberUtil . getInstance ();
AsYouTypeFormatter formatter = phoneUtil . getAsYouTypeFormatter ( "US" );
System . out . println ( formatter . inputDigit ( '6' )); // Outputs "6"
... // Input more digits
System . out . println ( formatter . inputDigit ( '3' )); // Now outputs "650 253"
PhoneNumberOfflineGeocoder geocoder = PhoneNumberOfflineGeocoder . getInstance ();
// Outputs "Zurich"
System . out . println ( geocoder . getDescriptionForNumber ( swissNumberProto , Locale . ENGLISH ));
// Outputs "Zürich"
System . out . println ( geocoder . getDescriptionForNumber ( swissNumberProto , Locale . GERMAN ));
// Outputs "Zurigo"
System . out . println ( geocoder . getDescriptionForNumber ( swissNumberProto , Locale . ITALIAN ));
警告:我们不提供有关电话号码当前载体的数据,只有分配了相应范围的原始载体。阅读有关数字可移植性的信息。
PhoneNumber swissMobileNumber =
new PhoneNumber (). setCountryCode ( 41 ). setNationalNumber ( 798765432L );
PhoneNumberToCarrierMapper carrierMapper = PhoneNumberToCarrierMapper . getInstance ();
// Outputs "Swisscom"
System . out . println ( carrierMapper . getNameForNumber ( swissMobileNumber , Locale . ENGLISH ));
有关如何使用库的更多示例可以在单位测试中找到。
我们已知电话号码库的几个第三方端口。如果它们对开发人员有用,我们在这里共享它们。
但是,我们强调这些端口是由LibphoneNumber项目以外的开发人员。我们不评估其质量或影响其维护过程。
我们自己版本的替代品:
Class#getResourcesAsStream
中加载元数据,并要求Android应用程序遵循Android加载的最佳实践,以重新包装元数据并从AssetManager#open()
自身(FAQ)中加载。如果您不想这样做,请在https://github.com/michaelrocks/libphonenumber-android上查看端口,它确实重新包装元数据并使用AssetManager#open()
,并且可以依赖于这些而无需这些这些客户的特定加载优化。您还应该在https://github.com/lionscribe/libphonenumber-android上查看端口,该端口也支持地理编码,并且只需要更改一行代码。基于LibphoneNumber元数据的工具: