在Android项目开发中,在注册或者其他需要手机号码的地方,经常需要校验手机号码的有效性,那么我们如何判断手机号码的有效性呢,当然首先想到的是根据正则表达式来判断,不过不同国家的手机号码的长度不一样,同时我们要根据区号来判断是否该号码符合该区号,那么我们可以怎么做呢?下面提供一个我在项目中用到的方法。
首先,导入这个jar包。
http://pan.baidu.com/s/1kUKRayr
其次,在你的android studio的values/arrays.xml中插入这个国家区号和国家简称对应的数组:
376,AD971,AE93,AF355,AL374,AM599,AN244,AO672,AQ54,AR43,AT61,AU297,AW994,AZ387,BA880,BD32,BE226,BF359,BG973,BH257,BI229,BJ590,BL673,BN591,BO55,BR975,BT267,BW375,BY501,BZ1,CA61,CC243,CD236,CF242,CG41,CH225,CI682,CK56,CL237,CM86,CN57,CO506,CR53,CU238,CV61,CX357,CY420,CZ49,DE253,DJ45,DK213,DZ593,EC372,EE20,EG291,ER34,ES251,ET358,FI679,FJ500,FK691,FM298,FO33,FR241,GA44,GB995,GE233,GH350,GI299,GL220,GM224,GN240,GQ30,GR502,GT245,GW592,GY852,HK504,HN385,HR509,HT36,HU62,ID353,IE972,IL44,IM91,IN964,IQ98,IR39,IT962,JO81,JP254,KE996,KG855,KH686,KI269,KM850,KP82,KR965,KW7,KZ856,LA961,LB423,LI94,LK231,LR266,LS370,LT352,LU371,LV218,LY212,MA377,MC373,MD382,ME261,MG692,MH389,MK223,ML95,MM976,MN853,MO222,MR356,MT230,MU960,MV265,MW52,MX60,MY258,MZ264,NA687,NC227,NE234,NG505,NI31,NL47,NO977,NP674,NR683,NU64,NZ968,OM507,PA51,PE689,PF675,PG63,PH92,PK48,PL508,PM870,PN1,PR351,PT680,PW595,PY974,QA40,RO381,RS7,RU250,RW966,SA677,SB248,SC249,SD46,SE65,SG290,SH386,SI421,SK232,SL378,SM221,SN252,SO597,SR239,ST503,SV963,SY268,SZ235,TD228,TG66,TH992,TJ690,TK670,TL993,TM216,TN676,TO90,TR688,TV886,TW255,TZ380,UA256,UG1,US598,UY998,UZ39,VA58,VE84,VN678,VU681,WF685,WS967,YE262,YT27,ZA260,ZM263,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;ilength;i++){ String[] g=rl[i].split(","); if(g[1].trim().equals(CountryID.trim())){ CountryZipCode=g[0]; break; } } return CountryZipCode; }