是否可以检查给定的 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();
}
背景
可以使用此代码以及 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();
}