是否可以检查给定的电话号码是否属于手机?

时间:2017-01-17 15:46:13

标签: android phone-number libphonenumber

背景

可以使用此代码以及PhoneNumberUtil library by Google(可用here)来检查给定字符串是否代表有效的电话号码:

public static boolean isValidNumber(final PhoneNumber phone) {
    if (phone == null)
        return false;
    final PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance();
    return phoneNumberUtil.isValidNumber(phone);
}

public static boolean isValidPhoneNumber(String phone) {
    if (TextUtils.isEmpty(phone))
        return false;
    phone = phone.replaceAll("[^0-9]", "");
    final PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance();
    PhoneNumber phoneNumber = null;
    try {
        phoneNumber = phoneNumberUtil.parse(phone, Locale.getDefault().getCountry());
    } catch (final Exception e) {
    }
    return isValidNumber(phoneNumber);
}

问题

这只是一般性检查,但我无法确定是否可以知道电话号码是否真的属于移动设备。

我尝试了什么

正如我在某些网站上所读到的,上述检查可能需要进行一些小调整才能知道它是否属于移动设备,但根据我的测试,这是错误的:

    ...
    phone = phone.replaceAll("[^0-9]", "");
    if (phone.length() < 7)
        return false;
    ...

问题

是否可以知道电话号码是否属于移动设备?

如果是这样,怎么样?

3 个答案:

答案 0 :(得分:6)

似乎我错过了库中的功能。这是如何做到的:

public static boolean isValidMobileNumber(String phone) {
    if (TextUtils.isEmpty(phone))
        return false;
    final PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance();
    try {
        PhoneNumber phoneNumber = phoneNumberUtil.parse(phone, Locale.getDefault().getCountry());
        PhoneNumberUtil.PhoneNumberType phoneNumberType = phoneNumberUtil.getNumberType(phoneNumber);
        return phoneNumberType == PhoneNumberUtil.PhoneNumberType.MOBILE;
    } catch (final Exception e) {
    }
    return false;
}
编辑:似乎有些数字(在美国和其他一些国家)无法确定它们是否属于手机。在这种情况下,返回FIXED_LINE_OR_MOBILE。

如果您仍然需要知道电话号码是否可以移动,还有在线服务可以查看(当然,他们不能全部知道),例如Pathfinder。

答案 1 :(得分:0)

这是针对土耳其的手机验证。您可以将正则表达式设置为您所在的国家/地区。您可以从 Wikipedia

查看算法
public static boolean validateMobilePhone(String phone) {
  String regEx = "(^(\\+905)|^(905)|^(05)|^(5))((01)|(05)|(06)|(07)|(51)|(52)| 
  (53)|(54)|(55)|(59)|(30)|(31)|(32)|(33)|(34)|(35)|(36)|(37)|(38)|(39)|(61)| 
  (40)|(41)|(42)|(43)|(44)|(45)|(46)|(47)|(48)|(49))(\\d{7})$";
    
 return Pattern.compile(regEx).matcher(phone).matches();
}

答案 2 :(得分:-1)

如果您想要一个国家正则表达式

,您可以这样做
   private boolean isValidNumber(String phonenumber) {
            String PHONE_PATTERN = "^(984|986)\\d{7}$"; 
// phone number starts with 984 and 986 and has 7 digit after that ex: 9842248633 (true or valid) and 9851048633(false or not valid) and in total 10 digits number

            Pattern pattern = Pattern.compile(PHONE_PATTERN);
            Matcher matcher = pattern.matcher(phonenumber);
            return matcher.matches();
        }

你可以这样调用这个函数:

phoneNumber.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if(!isValidNumber(s.toString())){
                    isnumbervalid=false;
                    phoneNumber.setTextColor(Color.parseColor("#F44336"));
                }else {
                    isnumbervalid=true;
                    phoneNumber.setTextColor(Color.parseColor("#000000"));
                }
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

还有更多你也可以限制android:maxlength = 10;在编辑文本时不允许用户输入长度大于10的数字

如果您需要国家/地区或区域设置,则可以使用Google语音库来使用此功能。

如果您使用的是class1

,则依赖于此库
compile 'com.googlecode.libphonenumber:libphonenumber:7.1.1'





String nepalNumberStr = "9842248633";
        PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
        TelephonyManager tm = (TelephonyManager)this.getSystemService(this.TELEPHONY_SERVICE); // for device containing sim card
        String locale = tm.getNetworkCountryIso();// for device containing sim card
        // Else you need to access locale through GPS
        try {
            Phonenumber.PhoneNumber nepalNumber = phoneUtil.parse(nepalNumberStr, locale.toUpperCase());
            boolean isValid = phoneUtil.isValidNumber(nepalNumber); // returns true
            if(isValid) {
                String internationally = phoneUtil.format(nepalNumber, PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL);
                Toast.makeText(this, nepalNumberStr + " is " + isValid + " and number is :" + internationally + "And is "+ phoneUtil.getNumberType(nepalNumber), Toast.LENGTH_SHORT).show();
            }else{
                Toast.makeText(this, "This phone number is not valid for " + locale, Toast.LENGTH_SHORT).show();
            }
        } catch (NumberParseException e) {
            System.err.println("NumberParseException was thrown: " + e.toString());
        }

好的,请查看此行以了解MOBILE或FIXED_LINE phoneUtil.getNumberType(nepalNumber)