2012-07-03 7 views
9

Ich bin mit der Broadcaster Klasse hören Nachrichten auf SMS mit diesem CodeWie verwendet man getApplicationContext in der BroadcastReceiver-Klasse?

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"); 
     } 
    } 
} 

und es im Manifest definiert ist wie

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

Aber das Problem ist, es heißt „Die Methode getApplicationContext() ist undefiniert für den Typ SMSReceiverActivity ".

Weiß jemand, warum das passiert und wie man es beheben kann? Dank

+1

innerhalb 'onReceive()', verwenden Sie einfach 'context.getApplicationContext()' –

Antwort

13

Blick auf die Methodensignatur für OnReceive()

public void onReceive(Context context, Intent intent) { 

Sie werden einen Kontext als Parameter übergeben. Sie sollten diesen Kontext verwenden, wenn Sie einen benötigen.

Pol_ViewActivity appState = ((Pol_ViewActivity)context); 

EDIT: auch ich weiß nicht genau, was es ist, Sie zu tun versuchen. Aber Sie sollten wahrscheinlich nicht versuchen, ein Aktivitätsobjekt zu erhalten und eine Methode aufzurufen, wie Sie es scheinbar tun.

+0

Ich habe eine Aktivität namens Pol_ViewActivity, die die Mapactivity erweitert, und während diese Aktivität ausgeführt wird, muss sie auf SMS-Texte warten. Der Code, der darauf wartet, befindet sich in SMSReceiverActivity (der Code ist oben). Jetzt, wenn die SMS erkannt wird, muss eine Methode von Pol_ViewActivity aufgerufen werden, damit ich die String-Version von smstext an eine Methode in Pol_ViewActivity senden kann, um die Google Map zu aktualisieren. Hilft das? – omega

2

Ich hoffe, das kann Ihnen helfen, meine Frnd.

Versuchen Sie dieses Paket zu importieren (Import android.telephony.gsm.SmsManager;)

// --- sendet eine SMS-Nachricht an ein anderes Gerät --- private void sendSMS (String phonenumber, String Nachricht) {
Zeichenfolge SENT = "SMS_SENT"; Zeichenfolge 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

Ein Grund für den Anwendungskontext bekommen wäre, die die WIFI_SERVICE zu erhalten, wie es auf Geräten auf dem Anwendungskontext oder Speicher nachgeschlagen werden muss < Android N.

Als Someone Somewhere einmal undicht wird gesagt, innerhalb onReceive(), verwenden Sie einfach context.getApplicationContext().

Verwandte Themen