Опубликован: 06.05.2014 | Доступ: свободный | Студентов: 2619 / 601 | Длительность: 10:33:00
Лекция 5:

Мобильная связь в приложениях для смартфона

Работа с SMS

Отправка SMS

Приложения могут отправлять SMS и реагировать на входящие сообщения с помощью класса SMSManager. Для создания экземпляра класса SMSManager используется метод getDefault().

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

Синтаксис:

public void sendTextMessage (String destinationAddress, 
String scAddress, String text, PendingIntent sentIntent, 
PendingIntent deliveryIntent)
 

Четвертый параметр sentIntent в результате принимает одно из следующих значений:

  • Activity.RESULT_OK, если сообщение было отправлено успешно.
  • RESULT_ERROR_GENERIC_FAILURE, RESULT_ERROR_RADIO_OFF или RESULT_ERROR_NULL_PDU, если сообщение отправить не удалось.

Последний параметр указывает, нужно ли пользователю показывать сообщение о доставке SMS.

Пример позволяет отправить сообщение с текстом message по указанному в переменной phoneNo номеру:

SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(phoneNo, null, message, null, null);
 

Кроме того, для отправки сообщения приложение должно иметь разрешение на отправку SMS, которое нужно настроить в файле манифеста:

<uses-permission android:name="android.permission.SEND_SMS" /> 

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

При получении мобильным устройством SMS-сообщения система генерирует Broadcast Intent. Для перехвата входящих сообщений используется BroadcastReceiver.

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

<receiver android:name="com.androidexample.broadcastreceiver.IncomingSms"> 
   <intent-filter>
   <action android:name="android.provider.Telephony.SMS_RECEIVED" />
   </intent-filter>
</receiver>
 

Также в файле манифеста нужно прописать требуемые разрешения (на получение, чтение и отправку сообщений):

<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS"></uses-permission>
 

Далее в проект необходимо добавить новый класс IncomingSms:

public class IncomingSms extends BroadcastReceiver 

Создать SmsManager для работы с сообщениями:

final SmsManager sms = SmsManager.getDefault(); 

Создать в этом классе метод onReceive, обрабатывающий полученные сообщения:

public void onReceive(Context context, Intent intent) 

И написать внутри метода следующий код:

final Bundle bundle = intent.getExtras();
try {
     
    if (bundle != null) {
         
        final Object[] pdusObj = (Object[]) bundle.get("pdus");
         
        for (int i = 0; i < pdusObj.length; i++) {
             
            SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
            String phoneNumber = currentMessage.getDisplayOriginatingAddress();
             
            String senderNum = phoneNumber;
            String message = currentMessage.getDisplayMessageBody();
            Log.i("SmsReceiver", "senderNum: "+ senderNum + "; message: " + message);
           // Show alert
            int duration = Toast.LENGTH_LONG;
            Toast toast = Toast.makeText(context, "senderNum: "+ senderNum + ", message: " + message, duration);
            toast.show();
             
        } // end for loop
      } // bundle is null
 
} catch (Exception e) {
    Log.e("SmsReceiver", "Exception smsReceiver" +e);
     
}
 

Этот код позволяет перехватывать входящие сообщения, разделять их на составные части и выдает всплывающие сообщения (тосты) в случае получения SMS.

Сетевые соединения

Для работы с сетевыми соединениями предназначен класс ConnectivityManager. Он позволяет:

  1. Мониторить сетевые соединения (Wi-Fi, GPRS, UMTS и т.д.)
  2. Рассылать широковещательные интенты при изменении статуса сетевых соединений
  3. Подключаться к альтернативной сети, если соединение было потеряно
  4. Предоставляет API, который позволяет приложениям отправлять запросы на получение статуса сетевых соединений.

Класс ConnectivityManager содержит набор методов:

  • getActiveNetworkInfo () – получение информации об активном сетевом соединении.
  • getAllNetworkInfo () – получение информации о всех сетевых соединениях, поддерживаемых устройством.
  • getNetworkInfo (int networkType) – возвращает информацию о статусе текущего сетевого соединения.
  • Некоторые другие.

Большинство этих методов возвращает объект типа NetworkInfo. Класс NetworkInfo инкапсулирует параметры мобильной сети Интернет и содержит набор методов для определения параметров сети:

  • getType() – возвращает целочисленное значение, определяющее тип сети. Это может быть одна из констант TYPE_MOBILE, TYPE_WIFI, TYPE_WIMAX, TYPE_ETHERNET, TYPE_BLUETOOTH или какое-то другое выражение, определенное в классе ConnectivityManager.
  • getSubtype () – возвращает значение, определяющее тип подсети.
  • getSubtypeName () – возвращает описательное имя типа подсети.
  • isAvailable () – проверяет доступность сети, в случае положительного ответа возвращает true.
  • isConnected () – возвращает true, если сетевое соединение установлено и через него можно передавать данные.
  • isConnectedOrConnecting ()– возвращает true в случае обнаружения установленного или устанавливаемого сетевого соединения.
  • isRoaming () – возвращает true, если мобильное устройство находится в роуминге относительно данной сети.