2013-04-21 3 views
1

Я работаю над приложением, которое захватывает входящие/исходящие SMS-сообщения на устройствах Android.Android Eclipse входящий и исходящий смс: формат номера телефона?

Теперь, когда я уже в бета-версии, я заметил на своем SQL-сервере, что входящий SMS-адрес формируется как международный номер, например +32477889977.

Однако исходящие SMS формируются как 0477 88 99 77, как пользователь сохраняет его на своем телефоне.

Мой код для исходящего SMS является

 
int addressColumn = cursor.getColumnIndex("address"); 
String number = cursor.getString(addressColumn); 

Но во входящем мониторе код

 
String from = msg[i].getOriginatingAddress(); 

Теперь вопрос, как я могу сделать icoming SMS, чтобы иметь тот же формат, исходящий, поэтому международный номер, а не номер, хранящийся в телефоне?

Для моего приложения очень важно, чтобы номера телефонов были международными, так как я нацелен на всемирное приложение. Таким образом, локальное формирование не является вариантом.

Мне действительно нужно прочитать номер, который был отправлен по сети.

У кого-нибудь есть опыт? Я искал google в течение нескольких часов, с результатами.

Спасибо!

ответ

2

Вы должны использовать формат номеров E164. E164 является стандартом для форматирования телефонных номеров, он учитывает локаль, над которой вы работаете.

Google имеет свою E164 библиотеку: https://code.google.com/p/libphonenumber/


пример форматирования числа в E164 с помощью библиотеки будет выглядеть примерно так:

PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); 
    PhoneNumber phoneNumber; 
    try { 
     phoneNumber = phoneUtil.parse(phone, locale.getCountry()); 
    } catch (NumberParseException e) { 
     throw new InvalidNumberException(convertErrorType(e.getErrorType()), e.getMessage(), e); 
    } 
    String formatedMsisdn = phoneUtil.format(phoneNumber, PhoneNumberFormat.E164); 


When вы получаете SMS, номер уже отформатирован в формате e164 s o вы получите тот же номер при использовании lib, но когда вы отправляете SMS, вы должны сначала отформатировать его, используя такой код, как указано выше, чтобы получить его в формате E164.
локаль используется, как правило, локаль устройство установлено, вы можете получить его по телефону:

Locale.getDefault() 

затем передавая локали в библиотеку E164.

+0

Мне очень нравится ваш ответ, однако, я всегда получаю сообщение об ошибке: отсутствующие метаданные:/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE. Как вы, кажется, уже работали с lib, вы можете мне помочь? –

+0

Можете ли вы показать пример кода, что вызывает ошибку? –

+0

Locale local = Locale.getDefault(); \t \t \t \t \t \t String swissNumberStr = sms.mNumber; \t \t \t PhoneNumber swissNumberProto = null; \t \t \t \t \t \t \t PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); \t \t \t \t try { \t \t \t \t swissNumberProto = phoneUtil.parse(swissNumberStr, local.getCountry()); \t \t \t \t } catch (NumberParseException e) { \t \t \t \t System.err.println("NumberParseException was thrown: " + e.toString()); \t \t \t \t } \t \t \t \t \t String testing = phoneUtil.format(swissNumberProto, PhoneNumberFormat.E164);

Смежные вопросы