2011-06-28 37 views
3

这里是我的源代码和它保持强制关闭,每次我运行它...如何注册广播接收器?

public class MainActivity extends Activity { 
    private static String content; 
    private static String phone; 
    private String number; 
    private String message; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     registerReceiver(new BroadcastReceiver(){ 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       //---get the SMS message passed in--- 
       Bundle bundle = intent.getExtras();   
       SmsMessage[] msgs = null; 

       if (bundle != null) 
       { 
        number = ""; 
        message = ""; 
        //---retrieve the SMS message received--- 
        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]);     
         number = msgs[i].getOriginatingAddress();      
         message = msgs[i].getMessageBody(); 
        } 
        //---display the new SMS message--- 
        Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); 
        SendMe(); 
       } 
      } 
     }, null); 
    } 

    public void SendMe(){ 
     PendingIntent pi = PendingIntent.getActivity(this, 0, 
       new Intent(this, MainActivity.class), 0); 
     SmsManager sms = SmsManager.getDefault(); 
     sms.sendTextMessage(number, null, message, pi, null); 
    } 
} 

这里是logcat的我得到...

06-28 14:39:00.331: ERROR/AndroidRuntime(396): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ftt.autospond/com.ftt.autospond.MainActivity}: java.lang.NullPointerException 
06-28 14:39:00.331: ERROR/AndroidRuntime(396):  at android.app.ActivityManagerProxy.registerReceiver(ActivityManagerNative.java:1504) 
06-28 14:39:00.331: ERROR/AndroidRuntime(396):  at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:807) 
06-28 14:39:00.331: ERROR/AndroidRuntime(396):  at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:318) 
06-28 14:39:00.331: ERROR/AndroidRuntime(396):  at com.ftt.autospond.MainActivity.onCreate(MainActivity.java:29) 
+0

当你问一个力关闭它确实有助于包括与异常堆栈跟踪 – antlersoft

+0

@antlersoft我刚才编辑上面的代码,包括logcat中的logcat的。一探究竟。谢谢 – theITRanger22

回答

4

您需要将您的接收器外的onCreate。类似的东西 -

public class MainActivity extends Activity { 
private static String content; 
private static String phone; 
private String number; 
private String message; 

private BroadcastReceiver receiver = new BroadcastReceiver(){ 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     //---get the SMS message passed in--- 
     Bundle bundle = intent.getExtras();   
     SmsMessage[] msgs = null; 

     if (bundle != null) 
     { 
      number = ""; 
      message = ""; 
      //---retrieve the SMS message received--- 
      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]);     
       number = msgs[i].getOriginatingAddress();      

       message = msgs[i].getMessageBody(); 


      } 
      //---display the new SMS message--- 
      Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); 
      SendMe(); 
    } 
    } 


    }; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    IntentFilter filter = new IntentFilter(); 
    filter.addAction(YOUR_SMS_ACTION); 
    this.registerReceiver(this.receiver, filter); 
    setContentView(R.layout.main); 
    } 


public void SendMe(){ 


    PendingIntent pi = PendingIntent.getActivity(this, 0, 
       new Intent(this, MainActivity.class), 0); 
    SmsManager sms = SmsManager.getDefault(); 
    sms.sendTextMessage(number, null, message, pi, null); 

} 
} 
+0

@Suchi好吧,我认为这样做。我需要在我的onCreate中调用任何东西吗? – theITRanger22

+0

我已经在onCreate中添加了registerReceiver调用。这对我有用。让我知道它是否成功! – Suchi

+1

@Suchi =(IM仍然得到一个强制关闭后,也许它的东西即时通讯做错了 – theITRanger22

0

强制关闭可能发生,因为您是从您的广播接收器内管理UI。无线电通信局的onReceive在被强制关闭之前有10秒的限制。

要解决,请使用一个Activity组件来生成您的Toast。

0

我在这里有点困惑。看起来你想为“SMS_RECEIVED”IntentFilter注册一个BroadcastReceiver,但是就我所见,代码中的任何地方都没有声明该过滤器。

尝试将registerReceiver {}末尾的空值替换为new IntentFilter("SMS_RECEIVED"));以查看它是否有效。也许它是你得到空指针异常的原因。

} } }, null);

} } }, new IntentFilter("SMS_RECEIVED"));