Презентацию к лекции Вы можете скачать здесь.
Современные смартфоны обладают богатым набором коммуникационных возможностей. Среди них можно выделить возможности мобильной связи:
В этой лекции мы рассмотрим некоторые особенности работы с телефонными средствами устройств.
Операционная система смартфона уже содержит набор стандартных средств, предназначенных для совершения звонков и работы с сообщениями. Более того, пользователь может установить альтернативные приложения для совершения тех же действий и назначить их приоритетными, а то и вовсе отказаться от "родных" вариантов. Создание собственного альтернативного приложения в качестве замены базового почти всегда не имеет смысла, поэтому в данной теме мы рассмотрим лишь некоторые аспекты разработки, которые могут пригодиться в реальности. При этом мы будем использовать вызов стандартных активностей смартфона, предназначенных для выполнения нужных действий. Если на устройстве имеется несколько вариантов таких приложений, операционная система сама перехватит вызов и предложит выбрать наиболее подходящий.
Современные планшеты на Android часто имеют разъем для подключения SIM-карт, однако очень редко позволяют использование в качестве телефона. В лучшем случае они позволяют отправлять и получать SMS-сообщения, да и то лишь при наличии специальной программы. Поэтому при разработке приложений, использующих возможности мобильной связи, следует обязательно проверять тип устройства. Если оно является планшетом, то непродуманный вызов некоторых функций может повредить работе приложения в целом. В то же время наличие GSM-модуля связи (или альтернативного телефонного) в планшете однозначно позволяет использовать возможности мобильного интернета.
Если тестировать приложение для мобильной связи на реальных устройствах, можно случайно вызвать номер, звонок на который может мгновенно списать все средства со счета. Поэтому целесообразно использовать для этой цели эмуляторы. Можно имитировать телефонные вызовы между двумя экземплярами Android-эмулятора. Для этого необходимо создать эти эмуляторы и запустить их. Первый созданный эмулятор получит абонентский номер 5554, номера следующих последовательно увеличиваются на 2 (5556, 5558, …). Для каждого эмулятора также открывается второй порт с номером на 1 больше (5555 для первого и т.д.), который позволяет использовать Android Debug Bridge. Нас пока интересует только номер каждого эмулятора.
После запуска эмуляторов на одном из них необходимо открыть панель набора номера, ввести номер второго эмулятора и сделать вызов. При этом на второй эмулятор поступит входящий звонок (см. рис 9.1).
(рис 9.1) Прием входящего звонка на эмуляторе
При одновременном запуске нескольких эмуляторов не забывайте о том, что каждый из них требует много системных ресурсов, и, если на вашем компьютере даже один эмулятор запускается крайней медленно, вряд ли стоит использовать описанный способ.
Приложения Android способны вызывать телефонные номера, однако не напрямую, а посредством запуска окна наборной панели. Иными словами, можно автоматизировать набор номера, но вызвать его может только пользователь. Вызов экрана набора номера осуществляется через специальный интент. При этом можно вызвать стандартную панель набора номера, или же передать в этот экран номер конкретного телефонного абонента. Более подробно это описано в лабораторной работе №5, где предлагается разработать приложение, позволяющее вызывать номера из заранее заданного списка контактов.
Помимо вызова номера можно программно отслеживать исходящие вызовы на мобильном устройстве. Для этого используются объекты BroadcastReceiver.
Приложения могут отправлять SMS и реагировать на входящие сообщения с помощью класса SMSManager. Для создания экземпляра класса SMSManager используется метод getDefault().
Для отправки сообщений используется метод sendTextMessage, которому необходимо передать следующие параметры: номер получателя, номер центра SMS (по умолчанию используется номер оператора, указанный в настройках телефона), текст сообщения, а также два интента для указания статуса отправки и статуса доставки сообщения.
Синтаксис:
public void sendTextMessage (String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent)
Четвертый параметр sentIntent в результате принимает одно из следующих значений:
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-сообщения система генерирует 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. Он позволяет:
Класс 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, если мобильное устройство находится в роуминге относительно данной сети.Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.