Главная » Разработка для Android » Проверка SMS на соответствие максимальной допустимой длине

0

Длина текста в SMS, как правило, ограничена 160 символами, поэтому сообщения, которые выходят за эти рамки, должны быть разбиты на несколь- ко более мелких частей. Класс SmsManager содержит метод divideMessage, который принимает в качестве параметра строку и делит ее на массив с со- общениями, каждое из которых имеет допустимый размер.

Затем  вы можете  использовать метод sendMultipartTextMessage из SmsManager,  чтобы отослать полученный массив, как показано  в листин- ге 12.17.

sentIntent и deliveryIntent в методе sendMultipartTextMessage — массив, который может содержать разные Намерения, срабатывающие для конкрет- ных частей сообщения.

Листинг 12.17. Передача длинных сообщений несколькими кусками

ArrayList<String> messageArray = smsManager.divideMessage(myMessage); ArrayList<PendingIntent> sentIntents = new ArrayList<PendingIntent>(); for (int i = 0; i < messageArray.size(); i++)

sentIntents.add(sentPI);

smsManager.sendMultipartTextMessage(sendTo, null, messageArray,

sentIntents, null);

Передача бинарных сообщений

Вы можете отправлять через SMS бинарные  данные, используя метод sendDataMessage из объекта SmsManager.  Работает он по тому же принци- пу, что и sendTextMessage, но включает  дополнительные параметры  для указания порта адресата и массива байтов, который содержит данные для отправки.

В листинге 12.18 показан базовый принцип отправки бинарного со- общения.

Листинг 12.18. Отправка бинарных SMS

Intent sentIntent = new Intent(SENT_SMS_ACTION);

PendingIntent sentPI = PendingIntent.getBroadcast(getApplicationContext(),

0, sentIntent, 0);

short destinationPort = 80;

byte[] data = [ . . . ваши данные . . . ];

smsManager.sendDataMessage(sendTo, null, destinationPort, data, sentPI, null);

Отслеживание входящих SMS

Когда устройство принимает новое SMS, срабатывает Широковещательное намерение с действием android.provider.Telephony.SMS_RECEIVED. Обратите внимание, что в настоящее время SDK не содержит ссылки на этот строковой литерал, поэтому в своих приложениях нужно указывать его явно.

ВНИМАНИЕ

Действие, возникающее при приеме SMS, скрыто (а значит, не под- держивается). В следующих версиях платформы оно может быть из- менено. В любом случае, будьте осторожны при использовании непод- держиваемых возможностей платформы, так как они не застрахованы от изменений в будущем.

Для приложений, которые отслеживают передачу Намерений, связанных с SMS, необходимо  указать  полномочие  RECEIVE_SMS. Сделайте  это с помощью тега <uses-permission> в манифесте  приложения, как по- казано в следующем фрагменте:

<uses-permission android:name="android.permission.RECEIVE_SMS"

/>

Широковещательное намерение с действием  SMS_RECEIVED содер- жит информацию о входящем сообщении. Чтобы извлечь массив объектов SmsMessage, упакованных внутри дополнительного параметра Намерения, используйте ключ pdu. При этом вы получите массив значений  в формате PDU (применяется для инкапсуляции SMS и его метаданных), каждое из ко- торых представляет собой SMS. Преобразовать массив байтов формата PDU в объект SmsMessage можно с помощью метода SmsMessage.createFromPdu, как показано в листинге 12.19.

Листинг 12.19. Извлечение SMS из переданного Намерения

Bundle bundle = intent.getExtras();

if (bundle != null) {

Object[] pdus = (Object[]) bundle.get("pdus"); SmsMessage[] messages = new SmsMessage[pdus.length]; for (int i = 0; i < pdus.length; i++)

messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);

}

Каждый объект SmsMessage содержит оригинальный адрес (номер теле- фона), временную отметку (timestamp) и тело сообщения.

В листинге  12.20 показана  реализация Приемника широковещательных намерений  — обработчик  onReceive  проверяет,  начинается  ли текст SMS строкой @echo, после чего пересылает  этот текст обратно (на номер, с ко- торого сообщение пришло).

Листинг 12.20. Отслеживание входящих SMS

public class IncomingSMSReceiver extends BroadcastReceiver {

private static final String queryString = "@echo";

private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";

public void onReceive(Context _context, Intent _intent) {

if (_intent.getAction().equals(SMS_RECEIVED)) {

SmsManager sms = SmsManager.getDefault();

Bundle bundle = _intent.getExtras();

if (bundle != null) {

Object[] pdus = (Object[]) bundle.get("pdus"); SmsMessage[] messages = new SmsMessage[pdus.length]; for (int i = 0; i < pdus.length; i++)

messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);

for (SmsMessage message : messages) {

String msg = message.getMessageBody();

String to = message.getOriginatingAddress();

if (msg.toLowerCase().startsWith(queryString)) { String out = msg.substring(queryString.length()); sms.sendTextMessage(to, null, out, null, null);

}

}

}

}

}

}

Чтобы отслеживать входящие сообщения, зарегистрируйте Приемник ши- роковещательных намерений из листинга 12.20, используя Фильтр намерений для действия android.provider.Telephony.SMS_RECEIVED, как показано ниже.

Листинг 12.21. Регистрация Приемника широковещательных намерений  для отслеживания входящих SMS

final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED"; IntentFilter filter = new IntentFilter(SMS_RECEIVED);

BroadcastReceiver receiver = new IncomingSMSReceiver();

registerReceiver(receiver, filter);

Источник: Майер P. Android 2 : программирование приложений для планшетных компьютеров и смартфонов : [пер. с англ. ] / Рето Майер. — М. : Эксмо, 2011. — 672 с. — (Мировой компьютерный бестселлер).

По теме:

  • Комментарии