将 phone 数字格式化为 Android 中的 E164 格式

Formatting phone number to E164 format in Android

我想将每个 phone 号码从设备中的 conatct 转换为 E164 格式。 所以,我在下面使用了开源。

libphonenumber

所以我在这里使用它。

Phonenumber.PhoneNumber formattedNumber = null;
String formatted = null;

try {
    formattedNumber = phoneUtil.parse(phoneNumber, "KR");
    formatted = phoneUtil.format(formattedNumber,PhoneNumberUtil.PhoneNumberFormat.E164);

    if (StringUtils.isEmpty(formatted) == false && formatted.length() > 0 && StringUtils.isEmpty(name) == false && name.length() > 0) {
        listName.add(name);
        listPhoneNumber.add(formatted);
    }
} catch (NumberParseException e) {
    continue;
}

而且我读到这个库被 Android 框架从 4.0 开始使用。

The Java version is optimized for running on smartphones, and is used by the Android framework since 4.0 (Ice Cream Sandwich).

我想使用 Android SDK 中的这个。所以我找到了这个。 Android SDK 提供了这个 PhoneNumberUtils .

还有一个函数

formatNumberToE164(String phoneNumber, String defaultCountryIso)

真的好用。但是 API 这个函数的级别是 21.

所以我的问题是..如何使用 PhoneNumberUtils 将 phonenumber 转换为 API Level 14(ICS) ~ 21 下的 E164?

谢谢!

问题是 PhoneNumberUtils.formatNumberToE164(...) 在旧设备上不可用,并且 PhoneNumberUtils 中没有其他功能可以完成相同的工作。

我建议在可用时使用 PhoneNumberUtils,在旧设备上使用 libphonenumber,例如:

public String formatE164Number(String countryCode, String phNum) {

    String e164Number;
    if (TextUtils.isEmpty(countryCode)) {
        e164Number = phNum;
    } else {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            e164Number = PhoneNumberUtils.formatNumberToE164(phNum, countryCode);
        } else {
            try {
                PhoneNumberUtil instance = PhoneNumberUtil.getInstance();
                Phonenumber.PhoneNumber phoneNumber = instance.parse(phNum, countryCode);
                e164Number = instance.format(phoneNumber, PhoneNumberUtil.PhoneNumberFormat.E164);

            } catch (NumberParseException e) {
                Log.e(TAG, "Caught: " + e.getMessage(), e);
                e164Number = phNum;
            }
        }
    }

    return e164Number;
}

我试过上面的代码,它对我也不起作用,需要做一些小的改动,我正在分享更新的代码:

public String formatE164Number(String countryCode, String phNum) {

    String e164Number;
    if (TextUtils.isEmpty(countryCode)) {
        e164Number = phNum;
    } else {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            /*e164Number = PhoneNumberUtils.formatNumberToE164(phNum, countryCode);*/
            e164Number =PhoneNumberUtils.formatNumber(phNum, countryCode);
            Timber.d("e164Number E164 :"+ e164Number);
            Toast.makeText(this,"e164 : "+e164Number, Toast.LENGTH_SHORT).show();
        } else {
            try {
                PhoneNumberUtil instance = PhoneNumberUtil.getInstance();
                Phonenumber.PhoneNumber phoneNumber = instance.parse(phNum, countryCode);
                e164Number = instance.format(phoneNumber, PhoneNumberUtil.PhoneNumberFormat.E164);
                Timber.d("e164Number E164 : $e164Number");
                Timber.d("e164Number INTERNATIONAL  : "+instance.format(phoneNumber, PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL));
                Timber.d("e164Number NATIONAL :  "+instance.format(phoneNumber, PhoneNumberUtil.PhoneNumberFormat.NATIONAL));
                Timber.d("e164Number RFC3966 :  "+instance.format(phoneNumber, PhoneNumberUtil.PhoneNumberFormat.RFC3966));

            } catch (NumberParseException e) {
                Log.e(TAG, "Caught: " + e.getMessage(), e);
                e164Number = phNum;
            }
        }
    }

    return e164Number;
}

现在你可以这样操作了:

 formatE164Number("US","5712712384");
 (571) 271-2384 


formatE164Number("US","+15712712384");
+1 571-271-2384