Contexte

Il est possible de vérifier si une chaîne donnée représente un numéro de téléphone valide, en utilisant ce code, avec le PhoneNumberUtil bibliothèque de Google (disponible ici ):

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

Le problème

Ce n'est qu'une vérification générale, mais je ne peux pas savoir s'il est possible de savoir si le numéro de téléphone est en fait celui d'un appareil mobile.

Ce que j'ai essayé

Comme je l'ai lu sur certains sites Web, la vérification ci-dessus peut nécessiter un petit ajustement pour savoir s'il s'agit d'un appareil mobile, mais selon mes tests, c'est faux:

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

La question

Est-il possible de savoir si le numéro de téléphone est celui d'un appareil mobile?

Si c'est le cas, comment ?

4
android developer 17 janv. 2017 à 18:46

2 réponses

Meilleure réponse

Il semble que j'ai manqué la fonction dans la bibliothèque. Voici comment procéder:

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

EDIT: il semble que certains numéros (aux États-Unis et quelques autres) ne peuvent pas être déterminés s'il s'agit de téléphones mobiles ou non. Dans ce cas, FIXED_LINE_OR_MOBILE est renvoyé.

Si vous avez toujours besoin de savoir si le numéro de téléphone est mobile, il existe des services en ligne pour le vérifier (bien qu'ils ne puissent pas tout savoir, bien sûr), tels que Pathfinder.

9
android developer 19 janv. 2017 à 08:22

vous pouvez le faire si vous le souhaitez pour une expression régulière de pays

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

Et vous pouvez appeler cette fonction comme ceci:

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) {

            }
        });

Et plus encore, vous pouvez également limiter android: maxlength = 10; dans le texte d'édition pour ne pas laisser l'utilisateur entrer un numéro avec une longueur supérieure à 10

Si vous avez besoin d'une base de pays ou de paramètres régionaux, vous pouvez l'utiliser à l'aide de la bibliothèque de numéros de téléphone Google.

Dépendance de cette bibliothèque si vous utilisez 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());
        }

OK, veuillez vérifier cette ligne pour MOBILE ou FIXED_LINE phoneUtil.getNumberType (nepalNumber)

-1
taman neupane 19 janv. 2017 à 11:17