可以使用此代码以及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;
...
是否可以知道电话号码是否属于移动设备?
如果是这样,怎么样?
答案 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)