android 根据区号判断手机号码是否符合格式


    在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;
}

  

你可能感兴趣的:(android 根据区号判断手机号码是否符合格式)