8

我想将设备中的每个电话号码从联系人转换为 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;
}

我读到这个库自 4.0 以来就被 Android 框架使用。

Java 版本针对在智能手机上运行进行了优化,自 4.0(Ice Cream Sandwich)起就被 Android 框架使用。

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

还有一个功能

formatNumberToE164(String phoneNumber, String defaultCountryIso)

它真的很容易使用。但是这个函数的 API 级别是 21。

所以我的问题是..如何在 API 级别 14(ICS) ~ 21 下使用 PhoneNumberUtils 将电话号码转换为 E164?

谢谢。!

4

2 回答 2

8

该问题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;
}
于 2016-06-06T20:58:25.133 回答
0

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

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
于 2021-09-07T04:42:22.677 回答