Разработка приложений для смартфонов на ОС Аndroid

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

Показывать лекцию целиком

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

Презентацию к лекции Вы можете скачать здесь.

Коммуникационные возможности смартфонов

Современные смартфоны обладают богатым набором коммуникационных возможностей. Среди них можно выделить возможности мобильной связи:

  • Возможность совершения телефонных звонков.
  • Возможность получения и отправки SMS.
  • Возможность выхода в Интернет через мобильную сеть.
  • В этой лекции мы рассмотрим некоторые особенности работы с телефонными средствами устройств.

    Операционная система смартфона уже содержит набор стандартных средств, предназначенных для совершения звонков и работы с сообщениями. Более того, пользователь может установить альтернативные приложения для совершения тех же действий и назначить их приоритетными, а то и вовсе отказаться от "родных" вариантов. Создание собственного альтернативного приложения в качестве замены базового почти всегда не имеет смысла, поэтому в данной теме мы рассмотрим лишь некоторые аспекты разработки, которые могут пригодиться в реальности. При этом мы будем использовать вызов стандартных активностей смартфона, предназначенных для выполнения нужных действий. Если на устройстве имеется несколько вариантов таких приложений, операционная система сама перехватит вызов и предложит выбрать наиболее подходящий.

    Особенности использования мобильной связи на планшетах

    Современные планшеты на Android часто имеют разъем для подключения SIM-карт, однако очень редко позволяют использование в качестве телефона. В лучшем случае они позволяют отправлять и получать SMS-сообщения, да и то лишь при наличии специальной программы. Поэтому при разработке приложений, использующих возможности мобильной связи, следует обязательно проверять тип устройства. Если оно является планшетом, то непродуманный вызов некоторых функций может повредить работе приложения в целом. В то же время наличие GSM-модуля связи (или альтернативного телефонного) в планшете однозначно позволяет использовать возможности мобильного интернета.

    Телефонная связь

    Использование эмуляторов для тестирования обработки звонков

    Если тестировать приложение для мобильной связи на реальных устройствах, можно случайно вызвать номер, звонок на который может мгновенно списать все средства со счета. Поэтому целесообразно использовать для этой цели эмуляторы. Можно имитировать телефонные вызовы между двумя экземплярами Android-эмулятора. Для этого необходимо создать эти эмуляторы и запустить их. Первый созданный эмулятор получит абонентский номер 5554, номера следующих последовательно увеличиваются на 2 (5556, 5558, …). Для каждого эмулятора также открывается второй порт с номером на 1 больше (5555 для первого и т.д.), который позволяет использовать Android Debug Bridge. Нас пока интересует только номер каждого эмулятора.

    После запуска эмуляторов на одном из них необходимо открыть панель набора номера, ввести номер второго эмулятора и сделать вызов. При этом на второй эмулятор поступит входящий звонок (см. рис 9.1).

    (рис 9.1) Прием входящего звонка на эмуляторе

    При одновременном запуске нескольких эмуляторов не забывайте о том, что каждый из них требует много системных ресурсов, и, если на вашем компьютере даже один эмулятор запускается крайней медленно, вряд ли стоит использовать описанный способ.

    Вызов абонента из приложения и перехват исходящих звонков

    Приложения Android способны вызывать телефонные номера, однако не напрямую, а посредством запуска окна наборной панели. Иными словами, можно автоматизировать набор номера, но вызвать его может только пользователь. Вызов экрана набора номера осуществляется через специальный интент. При этом можно вызвать стандартную панель набора номера, или же передать в этот экран номер конкретного телефонного абонента. Более подробно это описано в лабораторной работе №5, где предлагается разработать приложение, позволяющее вызывать номера из заранее заданного списка контактов.

    Помимо вызова номера можно программно отслеживать исходящие вызовы на мобильном устройстве. Для этого используются объекты BroadcastReceiver.

    Работа с 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. Он позволяет:

  • Мониторить сетевые соединения (Wi-Fi, GPRS, UMTS и т.д.)
  • Рассылать широковещательные интенты при изменении статуса сетевых соединений
  • Подключаться к альтернативной сети, если соединение было потеряно
  • Предоставляет 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, если мобильное устройство находится в роуминге относительно данной сети.
  • Вернуться к учебному плану