在Android项目开发中,在注册或者其他需要手机号码的地方,经常需要校验手机号码的有效性,那么我们如何判断手机号码的有效性呢,当然首先想到的是根据正则表达式来判断,不过不同国家的手机号码的长度不一样,同时我们要根据区号来判断是否该号码符合该区号,那么我们可以怎么做呢?下面提供一个我在项目中用到的方法。
首先,导入这个jar包。
http://pan.baidu.com/s/1kUKRayr
其次,在你的android studio的values/arrays.xml中插入这个国家区号和国家简称对应的数组:
376,AD
971,AE
93,AF
355,AL
374,AM
599,AN
244,AO
672,AQ
54,AR
43,AT
61,AU
297,AW
994,AZ
387,BA
880,BD
32,BE
226,BF
359,BG
973,BH
257,BI
229,BJ
590,BL
673,BN
591,BO
55,BR
975,BT
267,BW
375,BY
501,BZ
1,CA
61,CC
243,CD
236,CF
242,CG
41,CH
225,CI
682,CK
56,CL
237,CM
86,CN
57,CO
506,CR
53,CU
238,CV
61,CX
357,CY
420,CZ
49,DE
253,DJ
45,DK
213,DZ
593,EC
372,EE
20,EG
291,ER
34,ES
251,ET
358,FI
679,FJ
500,FK
691,FM
298,FO
33,FR
241,GA
44,GB
995,GE
233,GH
350,GI
299,GL
220,GM
224,GN
240,GQ
30,GR
502,GT
245,GW
592,GY
852,HK
504,HN
385,HR
509,HT
36,HU
62,ID
353,IE
972,IL
44,IM
91,IN
964,IQ
98,IR
39,IT
962,JO
81,JP
254,KE
996,KG
855,KH
686,KI
269,KM
850,KP
82,KR
965,KW
7,KZ
856,LA
961,LB
423,LI
94,LK
231,LR
266,LS
370,LT
352,LU
371,LV
218,LY
212,MA
377,MC
373,MD
382,ME
261,MG
692,MH
389,MK
223,ML
95,MM
976,MN
853,MO
222,MR
356,MT
230,MU
960,MV
265,MW
52,MX
60,MY
258,MZ
264,NA
687,NC
227,NE
234,NG
505,NI
31,NL
47,NO
977,NP
674,NR
683,NU
64,NZ
968,OM
507,PA
51,PE
689,PF
675,PG
63,PH
92,PK
48,PL
508,PM
870,PN
1,PR
351,PT
680,PW
595,PY
974,QA
40,RO
381,RS
7,RU
250,RW
966,SA
677,SB
248,SC
249,SD
46,SE
65,SG
290,SH
386,SI
421,SK
232,SL
378,SM
221,SN
252,SO
597,SR
239,ST
503,SV
963,SY
268,SZ
235,TD
228,TG
66,TH
992,TJ
690,TK
670,TL
993,TM
216,TN
676,TO
90,TR
688,TV
886,TW
255,TZ
380,UA
256,UG
1,US
598,UY
998,UZ
39,VA
58,VE
84,VN
678,VU
681,WF
685,WS
967,YE
262,YT
27,ZA
260,ZM
263,ZW
然后,现在,比如我们输入了一个手机号,区号CountryCode="+86", phoneNumber="15813849762" ,那么我们如何判断该手机号是否符合格式呢?
第一步: 根据这个CountryCode获取对应的国家简称,可以用以下这个方法,遍历以上的数组,得到国家的简称;
String countryCode =getPhoneCountryCode(CountryCode.replace("+", ""), getResources().getStringArray(R.array.CountryCodes))[1];得到的 countryCode 指得是国家简称
/** * * @param phone :不带"+"号的区号.例如:86 * @param countryCodes :values/arrays中存储的区号数组 * @return :String[0]:当前传入的区号,string[1]:当前区号对应的国家简称 */ public static String[] getPhoneCountryCode(String phone, String[] countryCodes) { String[] countryCode = new String[2]; countryCode[0] = ""; countryCode[1] = ""; for (int i = 0; i < countryCodes.length; i++) { try{ if(countryCodes[i].split(",")[0].toString().equals(phone)){ countryCode[0] = countryCodes[i].split(",")[0]; //得到区号 countryCode[1] = countryCodes[i].split(",")[1]; //得到区号对应的国家简称 break; } }catch (Exception e){e.printStackTrace(); } } return countryCode; }第二步: 调用我们在上面导入的库来帮助我们判断该手机号码的有效性
boolean isValid=isPhoneNumberValid(phoneNumber, countryCode );
/** * 根据区号判断是否是正确的电话号码 * @param phoneNumber :不带区号的电话号码 * @param countryCode :国家简称 return :true 合法 false:不合法 */ public static boolean isPhoneNumberValid(String phoneNumber, String countryCode) { System.out.println("isPhoneNumberValid: "+phoneNumber+"/"+countryCode); //NOTE: This should probably be a member variable. PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); try { Phonenumber.PhoneNumber numberProto = phoneUtil.parse(phoneNumber, countryCode); return phoneUtil.isValidNumber(numberProto); } catch (NumberParseException e) { System.err.println("NumberParseException was thrown: " + e.toString()); } return false; }it's over .
另外,我们可以通过TelephonyManager.getSimCountryIso()来获取手机电话卡所代表的国家区号简称,然后和以上该数组匹配得到实际的区号即可,不过由于手机系统的权限和安全问题,所以并不是所有手机都能获取到SIM卡的区号。
/** * 直接输出电话卡的区号 * @param context * @return */ public static String getCountryZipCode(Context context){ String CountryID=""; String CountryZipCode=""; TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); //getNetworkCountryIso CountryID= manager.getSimCountryIso().toUpperCase(); String[] rl=context.getResources().getStringArray(R.array.CountryCodes); for(int i=0;i<rl.length;i++){ String[] g=rl[i].split(","); if(g[1].trim().equals(CountryID.trim())){ CountryZipCode=g[0]; break; } } return CountryZipCode; }