lunes, 17 de diciembre de 2007

¿CÓMO HACER? - Reaccionar a un mensajes SMS

Documento original: Recognize/React on incoming SMS

En esta nota les explicaré el código documentado de una aplicación Android que reacciona a la recepción de la llegada de un mensaje SMS.

SMSReceiver.java

01 package com.northvortex.sms;
02
03 import android.app.NotificationManager;
04 import android.content.Context;
05 import android.content.Intent;
06 import android.content.IntentReceiver;
07 import android.os.Bundle;
08 import android.provider.Telephony;
09 import android.telephony.gsm.SmsMessage;
10 import android.util.Log;
11
12 /**
13 * android.content.IntentReceiver
14 * Base class for code that will receive intents sent by broadcastIntent()...
15 * http://code.google.com/android/reference/android/content/IntentReceiver.html
16 *
17 */
18 public class SMSReceiver
19 extends IntentReceiver
20 {
21 // Etiqueta usada para la bitacora.
22 private static final String TAG_LOG = "SMSReceiver";
23
24 // Un numero aleatorio utilizado por la notificacion.
25 private static final int ID_NOTIFICACION = 0x1221;
26
27 // Esta es la action que sera gatillada cuando un mensaje SMS es recibido.
28 // Usamos la "Default Package-Visibility".
29 private static final String ACCION = "android.provider.Telephony.SMS_RECEIVED";
30
31 /**
32 * Este metodo es gatillado cuando se recibe el Intent que esperabamos.
33 */
34 @Override
35 public void onReceiveIntent(Context parContext, Intent parIntent)
36 {
37 // As we want to display a Notification, we the NotificationManager.
38 NotificationManager elNotificador = (NotificationManager)parContext.getSystemService(Context.NOTIFICATION_SERVICE);
39
40 // Verifico que la accion recibida es ''
41 if (parIntent.getAction().equals(ACCION) == true)
42 {
43 // if(message starts with SMStretcher recognize BYTE)
44 StringBuilder elContenido = new StringBuilder();
45
46 // La informacion del mensaje SMS vienen dentro del paquete de datos extras del Intent.
47 Bundle losDatosExtras = parIntent.getExtras();
48 if (losDatosExtras != null)
49 {
50 // Recuperamos los mensajes que vienen dentro del Intent.
51 SmsMessage[] losMensajesSMS = Telephony.Sms.Intents.getMessagesFromIntent(parIntent);
52
53 // Creo el mensaje que mostrare en la pantalla.
54 for (SmsMessage unMensaje : losMensajesSMS)
55 {
56 elContenido.append("Mensajes SMS\n");
57 elContenido.append("enviado por:");
58 // Numero de quien envio el mensaje.
59 elContenido.append(unMensaje.getDisplayOriginatingAddress() + "\n");
60 elContenido.append("Mensaje:\n");
61 // Contenido del mensaje.
62 elContenido.append(unMensaje.getDisplayMessageBody());
63 }
64 }
65
66 // Registramos en la bitacora el evento.
67 Log.i(TAG_LOG, "onReceiveIntent: " + elContenido);
68
69 // Mostramos el mensaje utilizando el administrador de notificaciones
70 elNotificador.notifyWithText(ID_NOTIFICACION, elContenido.toString(),
71 NotificationManager.LENGTH_LONG, null);
72
73 // Consumimos este Intent, de esa forma ninguna otra aplicacion lo notara.
74 this.abortBroadcast();
75
76 // Ahora intentamos gatillar una actividad adicional.
77 Intent elIntento = new Intent(parContext, SMSActivity.class);
78 elIntento.setLaunchFlags(Intent.NEW_TASK_LAUNCH);
79 parContext.startActivity(elIntento);
80 }
81 return;
82 }
83 }


SMSActivity.java

01 package com.northvortex.sms;
02
03 import android.app.Activity;
04 import android.os.Bundle;
05
06 /**
07 *
08 * Este es la clase que gatillare despues de mostrar el contenido del mensaje.
09 *
10 */
11 public class SMSActivity
12 extends Activity
13 {
14 /**
15 * Esta clase es llamada la vez que la actividad es creada.
16 */
17 @Override
18 public void onCreate(Bundle parICicle)
19 {
20 super.onCreate(parICicle);
21
22 setContentView(R.layout.main);
23
24 return;
25 }
26 }


AndroidManifest.xml

01 <?xml version="1.0" encoding="utf-8"?>
02 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
03 package="com.northvortex.sms">
04 <uses-permission id="android.permission.RECEIVE_SMS" />
05 <application android:icon="@drawable/icon">
06 <!-- The Main Activity that gets started by the IntentReceiver listed below -->
07 <activity class=".SMSActivity" android:label="@string/app_name">
08 <intent-filter>
09 <action android:value="android.intent.action.MAIN" />
10 <category android:value="android.intent.category.LAUNCHER" />
11 </intent-filter>
12 </activity>
13 <!-- This class will react on the SMS show a notification and start the Main-App afterwards -->
14 <receiver class=".SMSReceiver">
15 <intent-filter>
16 <action android:value="android.provider.Telephony.SMS_RECEIVED" />
17 </intent-filter>
18 </receiver>
19 </application>
20 </manifest>


main.xml

01 <?xml version="1.0" encoding="utf-8"?>
02 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
03 android:orientation="vertical"
04 android:layout_width="fill_parent"
05 android:layout_height="fill_parent"
06 >
07 <TextView
08 android:layout_width="fill_parent"
09 android:layout_height="wrap_content"
10 android:text="SMS Activity"
11 />
12 </LinearLayout>


strings.xml

1 <?xml version="1.0" encoding="utf-8"?>
2 <resources>
3 <string name="app_name">SMS Receptor</string>
4 </resources>

1 comentario:

Anónimo dijo...

Hola, el ejemplo que pones me resulta, pero con el problema que la actividad se ejecuta al momento de ejecutarla, no despues cuando llega el mensaje.. a que se deberá?