2015-10-04 89 views
1

我已經構建了一個讀取傳入短信的應用程序。但是,每當有新短信來臨時它都會得到例外。 logcat給出以下消息:無法啓動接收器com.commlink.smscheck.SmsBroadcastReceiver:java.lang.NullPointerException

10-04 12:18:47.392: E/AndroidRuntime(8225): java.lang.RuntimeException: Unable to start receiver com.commlink.smscheck.SmsBroadcastReceiver: java.lang.NullPointerException 
10-04 12:18:47.392: E/AndroidRuntime(8225):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2616) 
10-04 12:18:47.392: E/AndroidRuntime(8225):  at android.app.ActivityThread.access$1700(ActivityThread.java:151) 
10-04 12:18:47.392: E/AndroidRuntime(8225):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1418) 
10-04 12:18:47.392: E/AndroidRuntime(8225):  at android.os.Handler.dispatchMessage(Handler.java:110) 
10-04 12:18:47.392: E/AndroidRuntime(8225):  at android.os.Looper.loop(Looper.java:193) 
10-04 12:18:47.392: E/AndroidRuntime(8225):  at android.app.ActivityThread.main(ActivityThread.java:5330) 
10-04 12:18:47.392: E/AndroidRuntime(8225):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-04 12:18:47.392: E/AndroidRuntime(8225):  at java.lang.reflect.Method.invoke(Method.java:515) 
10-04 12:18:47.392: E/AndroidRuntime(8225):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:828) 
10-04 12:18:47.392: E/AndroidRuntime(8225):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:644) 
10-04 12:18:47.392: E/AndroidRuntime(8225):  at dalvik.system.NativeStart.main(Native Method) 
10-04 12:18:47.392: E/AndroidRuntime(8225): Caused by: java.lang.NullPointerException 
10-04 12:18:47.392: E/AndroidRuntime(8225):  at com.commlink.smscheck.SmsBroadcastReceiver.onReceive(SmsBroadcastReceiver.java:44) 
10-04 12:18:47.392: E/AndroidRuntime(8225):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2609) 
10-04 12:18:47.392: E/AndroidRuntime(8225):  ... 10 more 

WHere是錯誤嗎?我該如何解決這個問題?

SmsBroadcastReceiver的代碼如下:

public class SmsBroadcastReceiver extends BroadcastReceiver { 

    public static final String SMS_BUNDLE = "pdus"; 
    public String pre_address = "03590000004"; 
    String smsBody; 
    String address; 

    public void onReceive(Context context, Intent intent) { 
     Bundle intentExtras = intent.getExtras(); 
     if (intentExtras != null) { 
      Object[] sms = (Object[]) intentExtras.get(SMS_BUNDLE); 
      String smsMessageStr = ""; 
      for (int i = 0; i < sms.length; ++i) { 
       SmsMessage smsMessage = SmsMessage 
         .createFromPdu((byte[]) sms[i]); 

       smsBody = smsMessage.getMessageBody().toString(); 
       address = smsMessage.getOriginatingAddress(); 
       if (pre_address.equals(address)) { 

        smsMessageStr += "SMS From: " + address + "\n"; 
        smsMessageStr += smsBody + "\n"; 
       } 
      } 

      Toast.makeText(context, smsMessageStr, Toast.LENGTH_SHORT).show(); 

      // this will update the UI with message 
      SmsActivity inst = SmsActivity.instance(); 
      inst.updateList(smsBody); 
      if (pre_address.equals(address)) 
       inst.Notify(inst.getMessageCountUnread() 
         + " unread message", address); 
     } 
    } 

} 

實例方法如下:

private static SmsActivity inst; 

public static SmsActivity instance() { 
    return inst; 
} 
+0

請發佈您的SmsBroadcastReceiver代碼! –

+0

問題已更新。 –

+0

請將您的instance()方法發佈到您的SmsActivity中。問題在那裏,我想。 –

回答

0

NPE的發生是因爲您正在嘗試訪問actvity方法從BroadcastReceiver.It不一個正確的方法。要在短信收到時通知您的活動,您可以從廣播接收機發送廣播。

public class SmsReceiver extends BroadcastReceiver { 

    public static final String ACTION_UNREAD_SMS = "YOUR.PACKAGENAME.ACTION_UNREAD_SMS"; 
    public static final String EXTRA_SMS_BODY = "YOUR.PACKAGENAME.EXTRA_SMS_BODY"; 
    public static final String EXTRA_SMS_ADDRESS = "YOUR.PACKAGENAME.EXTRA_SMS_ADDRESS"; 
    public static final String SMS_BUNDLE = "pdus"; 
    public static final String PRE_ADDRESS = "03590000004"; 
    String smsBody; 
    String address; 

    public void onReceive(Context context, Intent intent) { 
     Bundle intentExtras = intent.getExtras(); 
     if (intentExtras != null) { 
      Object[] sms = (Object[]) intentExtras.get(SMS_BUNDLE); 
      String smsMessageStr = ""; 
      for (int i = 0; i < sms.length; ++i) { 
       SmsMessage smsMessage = SmsMessage 
         .createFromPdu((byte[]) sms[i]); 

       smsBody = smsMessage.getMessageBody().toString(); 
       address = smsMessage.getOriginatingAddress(); 
       if (PRE_ADDRESS.equals(address)) { 

        smsMessageStr += "SMS From: " + address + "\n"; 
        smsMessageStr += smsBody + "\n"; 
       } 
      } 

      Toast.makeText(context, smsMessageStr, Toast.LENGTH_SHORT).show(); 

      Intent smsIntent = new Intent(ACTION_UNREAD_SMS); 
      smsIntent.putExtra(EXTRA_SMS_BODY, smsBody); 
      smsIntent.putExtra(EXTRA_SMS_ADDRESS, address); 
      context.sendBroadcast(smsIntent); 
     } 
    } 
} 

要捕捉廣播,你可以在你的活動中這樣做。

public class MainActivity extends AppCompatActivity { 

    private BroadcastReceiver mUnreadSmsBroadCastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String smsBody = intent.getStringExtra(SmsReceiver.EXTRA_SMS_BODY); 
      String smsAddress = intent.getStringExtra(SmsReceiver.EXTRA_SMS_ADDRESS); 
      updateList(smsBody); 
      if (SmsReceiver.PRE_ADDRESS.equals(smsAddress)) { 
       // notify your unread message 
      } 
     } 
    }; 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     registerReceiver(mUnreadSmsBroadCastReceiver, new IntentFilter(SmsReceiver.ACTION_UNREAD_SMS)); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     unregisterReceiver(mUnreadSmsBroadCastReceiver); 
    } 

} 

希望它對你有用。