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

本文介绍了一种在Android项目中验证国际手机号有效性的方法,通过使用特定库和自定义函数结合国家区号,确保手机号格式正确。


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

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值