2012-07-03 17 views
9

Estoy utilizando la clase emisora ​​para escuchar a los mensajes SMS utilizando el código¿Cómo se usa getApplicationContext en la clase BroadcastReceiver?

package com.escortme.basic; 

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

public class SMSReceiverActivity extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // Parse the SMS. 
     Bundle bundle = intent.getExtras(); 
     SmsMessage[] msgs = null; 
     String str = ""; 
     if (bundle != null) 
     { 
      // Retrieve the SMS. 
      Object[] pdus = (Object[]) bundle.get("pdus"); 
      msgs = new SmsMessage[pdus.length]; 
      for (int i=0; i<msgs.length; i++) 
      { 
       msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]); 
       // In case of a particular App/Service. 
       //if(msgs[i].getOriginatingAddress().equals("+91XXX")) 
       //{ 
       str += "SMS from " + msgs[i].getOriginatingAddress(); 
       str += " :"; 
       str += msgs[i].getMessageBody().toString(); 
       str += "\n"; 
       //} 
      } 
      // Display the SMS as Toast. 
      Toast.makeText(context, str, Toast.LENGTH_SHORT).show(); 


      Pol_ViewActivity appState = ((Pol_ViewActivity)getApplicationContext()); // ERROR 
      appState.move_map_to("33.786047","-59.187287"); 
     } 
    } 
} 

y se está definido en el manifiesto como tal

<receiver 
     android:name="com.escortme.basic.SMSReceiverActivity" 
     android:enabled="true"> 
     <intent-filter> 
     <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
     </intent-filter> 
    </receiver> 

Pero el problema es que dice "El método getApplicationContext() es indefinido para el tipo SMSReceiverActivity ".

¿Alguien sabe por qué está sucediendo esto y cómo solucionarlo? Gracias

+1

dentro de 'onReceive()', solo use 'context.getApplicationContext()' –

Respuesta

13

vistazo a la firma del método para OnReceive()

public void onReceive(Context context, Intent intent) { 

Usted se están pasando un contexto como parámetro. Deberías usar ese contexto cuando lo necesites.

Pol_ViewActivity appState = ((Pol_ViewActivity)context); 

EDIT: también no sé exactamente qué es lo que está tratando de hacer. Pero probablemente no deberías tratar de obtener un objeto Activity y llamar a un método como parece estar haciendo.

+0

Tengo una actividad llamada Pol_ViewActivity que amplía la actividad de mapa, y mientras se está ejecutando esa actividad, necesita escuchar textos de sms. El código que lo escucha está en SMSReceiverActivity (que el código está arriba). Ahora, cuando se detecta el sms, necesita llamar a un método desde Pol_ViewActivity para que pueda enviar la versión de cadena del smstext a un método en Pol_ViewActivity para que pueda actualizar el mapa de google. ¿Esto ayuda? – omega

2

Espero que esto pueda ayudarlo.

Intente importar este paquete (importación android.telephony.gsm.SmsManager;)

// --- envía un mensaje SMS a un terminal --- sendSMS private void (String phoneNumber, String mensaje) {
String SENT = "SMS_SENT"; Cadena ENTREGADA = "SMS_DELIVERED";

PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, 
     new Intent(SENT), 0); 

    PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, 
     new Intent(DELIVERED), 0); 

    //---when the SMS has been sent--- 
    registerReceiver(new BroadcastReceiver(){ 
     @Override 
     public void onReceive(Context arg0, Intent arg1) { 
      switch (getResultCode()) 
      { 
       case Activity.RESULT_OK: 
        Toast.makeText(getBaseContext(), "SMS sent", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
        Toast.makeText(getBaseContext(), "Generic failure", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_NO_SERVICE: 
        Toast.makeText(getBaseContext(), "No service", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_NULL_PDU: 
        Toast.makeText(getBaseContext(), "Null PDU", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_RADIO_OFF: 
        Toast.makeText(getBaseContext(), "Radio off", 
          Toast.LENGTH_SHORT).show(); 
        break; 
      } 
     } 
    }, new IntentFilter(SENT)); 

    //---when the SMS has been delivered--- 
    registerReceiver(new BroadcastReceiver(){ 
     @Override 
     public void onReceive(Context arg0, Intent arg1) { 
      switch (getResultCode()) 
      { 
       case Activity.RESULT_OK: 
        Toast.makeText(getBaseContext(), "SMS delivered", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case Activity.RESULT_CANCELED: 
        Toast.makeText(getBaseContext(), "SMS not delivered", 
          Toast.LENGTH_SHORT).show(); 
        break;      
      } 
     } 
    }, new IntentFilter(DELIVERED));   

    SmsManager sms = SmsManager.getDefault(); 
    sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);    
}  
1

Una razón para conseguir el contexto de aplicación sería la de obtener el WIFI_SERVICE ya que debe ser buscado en el contexto de la aplicación o la memoria se escape en los dispositivos Android < N.

Como Someone Somewhere dijo una vez, dentro de onReceive(), simplemente use context.getApplicationContext().

Cuestiones relacionadas