2012-07-03 23 views
9

Bu koduBroadcastReceiver sınıfında getApplicationContext nasıl kullanılır?

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

kullanarak mesaj sms dinlemek için yayıncı sınıfını kullanıyorum ve o kadar

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

gibi bildirim tanımlanan oluyor Ama sorun o yöntem getApplicationContext() 'dir" diyor olduğunu SMSReceiverActivity türü için undefined ".

Bunun neden olduğunu ve nasıl düzeltileceğini bilen var mı? Teşekkür

+1

'onReceive()' içinde, 'context.getApplicationContext()' işlevini kullanın. –

cevap

13

OnReceive için yöntem imzası bak()

public void onReceive(Context context, Intent intent) { 

Bir parametre olarak bir bağlam geçirilen ediliyor. İhtiyacınız olduğunda bu bağlamı kullanmalısınız.

Pol_ViewActivity appState = ((Pol_ViewActivity)context); 

DÜZENLEME: da ben bunu yapmaya çalışıyorsun tam olarak ne olduğunu bilmiyorum. Ama muhtemelen bir Aktivite nesnesi elde etmeye çalışmamalı ve yaptığınız gibi bir yöntemi çağırmalısınız.

+0

Harita etkinliğini genişleten Pol_ViewActivity adlı bir etkinliğim var ve bu etkinlik çalışırken sms metinlerini dinlemesi gerekiyor. Bunu dinleyen kod SMSReceiverActivity (kodun üstünde). Şimdi sms algılandığında, Pol_ViewActivity'den bir yöntemi çağırmak gerekir, böylece smstext'in dize sürümünü Pol_ViewActivity'de google haritasını güncelleyebilmem için bir yönteme gönderebilirim. Bu yardımcı olur mu? – omega

2

Umarım bu size yardımcı olabilir.

bu paketi (ithalat android.telephony.gsm.SmsManager;) ithal deneyin

// --- başka bir cihaz --- özel geçersiz SendSMS (Dize phoneNumber, dize mesajı bir SMS mesajı gönderir {
Dize SENT = "SMS_SENT"; String DELIVERED = "SMS_DELIVERED"; Uygulama bağlamı almak için

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

bir nedeni de Someone Somewhere kez söylediği gibi < Android N. cihazlarda

sızacaktır Uygulama bağlamıyla veya hafıza üzerinde bakılmalıdır olarak WIFI_SERVICE almak olacaktır, onReceive() içinde, sadece context.getApplicationContext() kullanın.

İlgili konular