【问题标题】:Is it possible to check whether a given phone number is of a cell phone or not?是否可以检查给定的电话号码是否是手机号码?
【发布时间】:2017-01-17 15:46:13
【问题描述】:

背景

可以使用此代码和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;
    ...

问题

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

如果是这样,怎么办?

【问题讨论】:

  • 引用库的 README 文件:"getNumberType" - gets the type of the number based on the number itself; able to distinguish Fixed-line, Mobile, Toll-free, Premium Rate, Shared Cost, VoIP and Personal Numbers (whenever feasible).
  • 你要求验证吗?
  • @W4R10CK 我在问我是否可以检查给定的号码是手机号码还是其他号码。
  • @Prera​​kSola 我怎么错过了...谢谢。我应该在使用它之前调用 isValidNumber 吗?你能把它写在答案中吗?
  • 是的,我想您应该在检测号码类型之前致电isValidNumber。这不是一个实际的答案。你只是错过了阅读图书馆的一部分...... :)

标签: android phone-number libphonenumber


【解决方案1】:

似乎我错过了库中的功能。操作方法如下:

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。

【讨论】:

    【解决方案2】:

    这是土耳其的手机验证。您可以将正则表达式安排为您的国家/地区。您可以从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();
    }
    

    【讨论】:

    • 将此提交到他们的问题跟踪器上的 libphonenumber 库。
    【解决方案3】:

    如果你想要一个国家的正则表达式,你可以这样做

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

    好的,请检查此行是否有 MOBILE 或 FIXED_LINE phoneUtil.getNumberType(nepalNumber)

    【讨论】:

    • 再说一次,这与一般电话验证无关。这是关于检查它是否是手机号码。
    • 您针对哪个地区或国家/地区的应用程序?
    • 是的,可以根据libphonenumber.appspot.com 来完成。我们需要输入电话号码和国家(ISO 3166-1 两个字母的国家代码)。您有电话号码,您可以使用 String locale = context.getResources().getConfiguration().locale.getCountry(); 获取语言环境代码// 让我检查一下,然后再回复你,你也可以试试。
    • 我询问了检查给定电话号码是否是手机的问题。我没有问它是否有效。另外,我已经用这个库写了答案。
    • 是的,现在您可以检查它是 MOBILE 还是 FIXED_LINE
    猜你喜欢
    • 2018-08-30
    • 2023-03-14
    • 2012-06-07
    • 2022-06-21
    • 2023-03-24
    • 1970-01-01
    • 2011-12-03
    • 2021-03-30
    • 1970-01-01
    相关资源
    最近更新 更多