2011-02-03 78 views
0

我正在使用一個簡單的BroadcastReceiver和onReceive方法來攔截文本消息。出於某種原因,每次我發送短信時:應用程序崩潰。當我嘗試調試應用程序時:我發送文本消息,應用程序仍然崩潰,但不是將我帶入Receiver類,而是暫停在「ActivityThreadhandleReceiver(ActivityThread,ActivityThreadReceiverData)」內部。調試窗口只是針對Thread:「(Suspended(exception RuntimeException))」。攔截文本消息:調試問題

我該如何找出爲什麼我的應用崩潰,如果它不允許我通過我的代碼。

這裏是我的接收機類:

public class FinderReciever extends BroadcastReceiver { 


@Override 
public void onReceive(Context context, Intent intent) 
{ 
Bundle bundle = intent.getExtras(); 
SmsMessage[ ] msgs = null; 
String str = ""; 
if (bundle != null) 
{ 
//---retrieve the received message here --- 
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]); 
str += "SMS from " + msgs[i].getOriginatingAddress(); 
str += " :"; 
str += msgs[i].getMessageBody().toString(); 
str += "\n"; 
} 
// ........first show sms here..... 
Toast.makeText(context, str, Toast.LENGTH_SHORT).show(); 
} 

這裏是我的清單:

<?xml version="1.0" encoding="utf-8"?> 

<application android:icon="@drawable/icon" android:label="@string/app_name"> 
    <activity android:name=".PhoneFinder_Activity" 
       android:label="@string/app_name"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <receiver android:name=".SmsReceiver"> 
    <intent-filter> 
    <action android:name= 
     "android.provider.Telephony.SMS_RECEIVED" /> 
    </intent-filter> 
    </receiver> 
</application> 

<uses-permission android:name="android.permission.READ_SMS" /> 
<uses-permission android:name="android.permission.RECEIVE_SMS" /> 

任何幫助將不勝感激。謝謝!

編輯:即使重新格式化運行在我的主要活動內部的方法後,我得到完全相同的結果。這完全一樣的方法適用於文本意向的發送:

 String SENT = "SMS_SENT"; 
    String DELIVERED = "SMS_DELIVERED"; 
    String RECEIVED = "SMS_RECEIVED"; 


    PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, 
     new Intent(SENT), 0); 

    PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, 
     new Intent(DELIVERED), 0); 

    PendingIntent receivedPI = PendingIntent.getBroadcast(this, 0, new Intent(RECEIVED), 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(), "FRIGGEN SMS!", 
          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(RECEIVED)); 
+0

試圖以另一種方式去解決這個問題:我得到了同樣的錯誤。所以,我認爲這是與我的清單權限或類似的東西。我用兩個代碼片段編輯了上面的帖子。多謝你們。 – ninnemannk 2011-02-03 15:47:07

回答

0

你在你的manifest文件中有一個錯誤 - 接收器的名稱必須是類的名稱。因此,對於上述的FinderReciever類,你會想:

<receiver android:name=".FinderReciever"> 
    <intent-filter> 
    <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
    </intent-filter> 
</receiver> 

您也可以驗證這是通過查看logcat的問題。你應該看到類似的東西:

ERROR/AndroidRuntime(1708): FATAL EXCEPTION: main 
ERROR/AndroidRuntime(1708): java.lang.RuntimeException: Unable to instantiate receiver xxx.xxxx.SmsReceiver: java.lang.ClassNotFoundException: .... 
+0

感謝您的迴應!我通過重新創建項目解決了這個問題,我必須更改名稱。雖然我解決了這個問題,但我不知道如何。所以謝謝,我會確保將這一點銘記在將來。 – ninnemannk 2011-02-04 02:43:10