2012-07-03 9 views
9

Sto usando la classe emittente televisiva per ascoltare messaggi SMS utilizzando questo codiceCome utilizzare getApplicationContext nella classe 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"); 
     } 
    } 
} 

e 'definito nel manifestare in questo modo

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

ma il problema è che dice "Il metodo getApplicationContext() è non definito per il tipo SMSReceiverActivity ".

Qualcuno sa perché questo sta accadendo e come risolverlo? Grazie

+1

all'interno di 'onReceive()', basta usare 'context.getApplicationContext()' –

risposta

13

sguardo alla firma del metodo per OnReceive()

public void onReceive(Context context, Intent intent) { 

È vengono passati un contesto come parametro. Dovresti usare quel contesto quando ne hai bisogno.

Pol_ViewActivity appState = ((Pol_ViewActivity)context); 

EDIT: anche io non so esattamente che cosa è che si sta cercando di fare. Ma probabilmente non dovresti cercare di ottenere un oggetto Activity e chiamare un metodo su di esso come sembra che tu stia facendo.

+0

Ho un'attività chiamata Pol_ViewActivity che estende la mappa, e mentre quella attività è in esecuzione, ha bisogno di ascoltare i messaggi sms. Il codice che lo ascolta è in SMSReceiverActivity (il cui codice è sopra). Ora, quando viene rilevato l'sms, è necessario chiamare un metodo da Pol_ViewActivity in modo che possa inviare la versione stringa dello smstext a un metodo in Pol_ViewActivity in modo da poter aggiornare la mappa di google. questo aiuta? – omega

2

Spero che questo possa aiutarvi.

Prova a importare questo pacchetto (import android.telephony.gsm.SmsManager;)

// --- invia un messaggio SMS a un altro dispositivo --- SendSMS private void (String phoneNumber, messaggio String) {
Stringa SENT = "SMS_SENT"; String 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);    
}  
1

Uno dei motivi per ottenere il contesto dell'applicazione sarebbe quella di ottenere il la WIFI_SERVICE come deve essere lo sguardo al contesto di applicazione o la memoria colerà su dispositivi Android < N.

Come Someone Somewhere ha detto una volta, entro onReceive(), utilizzare solo context.getApplicationContext().

Problemi correlati