是否可以检查给定的 phone 数字是否属于单元格 phone?

Is it possible to check whether a given phone number is of a cell phone or not?

背景

可以使用此代码以及 PhoneNumberUtil library by Google (available here) :

来检查给定的字符串是否表示有效的 phone 数字
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 = phone.replaceAll("[^0-9]", "");
    if (phone.length() < 7)
        return false;
    ...

问题

是否可以知道phone号码是不是手机号码?

如果可以,怎么办?

我好像错过了库中的函数。方法如下:

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

编辑:似乎有些号码(在美国和其他一些国家)无法确定它们是否属于 phone 手机。在这种情况下,返回 FIXED_LINE_OR_MOBILE。

如果您仍然需要知道 phone 号码是否在手机上,可以使用在线服务进行检查(当然他们不能知道全部),例如 Pathfinder。

如果你想要一个国家的正则表达式就可以做到

   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 电话号码库。

如果您使用的是 gradel,则依赖此库

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());
        }

好的,请检查此行是否适用于移动设备或 FIXED_LINE phoneUtil.getNumberType(尼泊尔号码)

这是针对土耳其的移动 phone 验证。您可以安排正则表达式,因为您的 country.You 可以从 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();
}