Cómo utilizar getApplicationContext en la clase BroadcastReceiver?
Estoy utilizando la clase broadcaster para escuchar mensajes sms usando este código
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 define en manifiesto así
<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 () no está definido para el tipo SMSReceiverActivity".
¿Alguien sabe por qué sucede esto y cómo solucionarlo? Gracias
Mire la firma del método para onReceive ()
public void onReceive(Context context, Intent intent) {
Se está pasando un contexto como un parámetro. Deberías usar ese contexto cuando lo necesites.
Pol_ViewActivity appState = ((Pol_ViewActivity)context);
EDIT: también no sé exactamente lo que está tratando de hacer. Pero probablemente no debería estar tratando de obtener un objeto de actividad y llamar a un método en él como usted parece estar haciendo.
Espero que esto pueda ayudar a mi frnd.
Intente importar este paquete ( import android.telephony.gsm.SmsManager; )
// — envía un mensaje SMS a otro dispositivo — private void sendSMS (String phoneNumber, String message) {
Cadena SENT = "SMS_SENT"; Cadena DELIVERED = "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); }
Una de las razones para obtener el contexto de la aplicación sería obtener el WIFI_SERVICE
como debe ser buscado en el contexto de la aplicación o la memoria se fugará en los dispositivos <Android N.
Como Someone Somewhere dijo una vez, dentro de onReceive()
, sólo use context.getApplicationContext()
.