Форматирование номера телефона в формате E164 в Android
Я хочу конвертировать каждый номер телефона из conatct на устройстве в формат E164. Итак, я использовал OpenSource ниже.
Так что я использовал это как здесь.
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.
Версия Java оптимизирована для работы на смартфонах и используется платформой Android начиная с 4.0 (Ice Cream Sandwich).
Я хочу использовать это из Android SDK. Итак, я нашел это. Android SDK предоставляет этот PhoneNumberUtils.
И есть функция
formatNumberToE164(String phoneNumber, String defaultCountryIso)
Это действительно легко использовать. но уровень API этой функции - 21.
Итак, мой вопрос... Как я могу использовать PhoneNumberUtils для преобразования номера телефона в E164 в соответствии с API Level 14(ICS) ~ 21?
Спасибо.!
2 ответа
Проблема в 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