Статьи

Android Custom SMS всплывающее окно — Часть первая: BroadcastReceiver

Вот конкретное и слегка полезное приложение для Android, иллюстрирующее использование некоторых основных концепций Android: приемники вещания, поставщики контента, услуг, действий и контента.

Слово о том, какую версию Android SDK использовать. Хотя большинство из нас хотели бы использовать последнюю версию со всеми интересными вещами, мы должны помнить, что наше приложение должно  соответствовать самым распространенным версиям Android SDK на рынке  во время его разработки. Приложение, написанное для более старых версий, работает с более новыми, но, конечно, обратное неверно. На момент написания этой статьи наиболее распространенными версиями являются 2.2 ( Froyo ) и 2.3 ( Gingerbread ).

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

  1. Перехватить входящие SMS
  2. Покажите его на экране как всплывающее окно, возможно, с характерным звуком
  3. Вызовите программу SMS по умолчанию из этого диалогового окна, если мы хотим ответить сразу.

 Перехват SMS с использованием BroadcastReceiver

В общем, мы используем  BroadcastReceiver,  когда мы хотим что-то сделать в передачах системы или других приложений, например, когда экран телефона выключен, фотокамера сделана камерой, загрузка завершена или … SMS-сообщение прибыли. Вот как это сделать:

 

package com.ts.pop.sms;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;

public class SMSReceiver extends BroadcastReceiver {

   @Override
   public void onReceive(Context context, Intent intent) {
     // SMS interception code goes here
   }

 

Несколько кратких объяснений:

  • Контекст  дает нам доступ к приложениям и системных ресурсам.
  • Намерение  представляет собой набор информации , который может быть передан вокруг. Подробнее об этом позже.
  • Bundle  является отображением пар ключ-значение.
  • Я позволю вам сделать дикое предположение о том, что  представляет собой  SmsMessage .
  • Нам нужно переопределить  метод onReceive BroadcasdtReceiver,  если мы хотим обработать фактические события телефонной трансляции.

Это все прекрасно и модно (хорошо, может быть, не тот денди в данный момент), но … как получить SMS в разгар других трансляций? Как я уже сказал, Bundle — это карта, а SMS-сообщения — это значения в этой карте, соответствующие  key = «pdus» . PDU означает  протокольный блок данных , информация, доставляемая через сетевой уровень.

 

// get the Bundle map from the Intent parameter to onReceive()
Bundle bundle = intent.getExtras(); 

// get the SMS received
Object[] pdus = (Object[]) bundle.get("pdus");
SmsMessage[] msgs = new SmsMessage[pdus.length];

 

Теперь мы получаем SMS-информацию, которая нам нужна:

 

/** sms sender phone*/
String smsSender ="";

/** body of received sms*/
String smsBody = "";

/** timerstamp */
long timestamp = 0L;

for (int i=0; i<msgs.length; i++){
      msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
      smsSender += msgs[i].getOriginatingAddress();
      smsBody += msgs[i].getMessageBody().toString();
      timestamp += msgs[i].getTimestampMillis();
}

 

Мы почти закончили с нашим получателем SMS. Теперь мы должны сообщить системе Android, что:

  1. У нас есть широковещательный приемник для смс
  2. Нам нужен пользователь телефона, чтобы наше приложение могло получать и читать эти SMS

Это делается в XML-файле Android под названием  Manifest . В этот файл мы помещаем наш приемник и его цель в жизни:

 

<!-- Incoming SMS messages can be intercepted by the SMSReceiver class --><
<receiver android:name="com.ts.pop.sms.SMSReceiver">
   <intent-filter android:priority="999" android:exported="true">
      <action android:name="android.provider.Telephony.SMS_RECEIVED" />
   </intent-filter>
</receiver>

 

И разрешения, которые пользователь должен предоставить нашему приложению, чтобы оно выполнило свою судьбу:

 

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

 

Мы использовали следующее:

  • Намеренный фильтр  для описания конкретного вещания мы заинтересованы в том , как есть много других.
  • Android: приоритет  набор атрибутов максимума некоторого произвольного числа, чтобы иметь приоритет над другими SMS — приемниками, как один по умолчанию.
  • Андроид: экспортироваться  набор атрибутов истины , поэтому мы можем получать сообщения от источников за пределами нашего приложения.

Теперь у нас есть все, что нам нужно, и мы готовы заняться демонстрацией. Обратите внимание, что весь приведенный выше код происходит внутри  метода onReceive ()  . Как только этот метод возвращается, BroadcastReceiver больше не активен. Мы проделали некоторую фоновую работу, которая на данный момент невидима для пользователя, и нам нужно передать обработку другому механизму, чтобы можно было перейти к части дисплея.

Мы сделаем это во второй части.

 

Источник:   Блог Тони .