Мобильная связь в приложениях для смартфона
Работа с 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, если мобильное устройство находится в роуминге относительно данной сети.