2013-02-27 132 views
0

真的很煩人的部分是,我的代碼工作得很好。而現在,從沒有在那裏,它給我這個錯誤:無法啓動接收器:CLASS CAST EXCEPTION,同時使用短信廣播接收器

02-28 14:49:43.086: E/AndroidRuntime(449): FATAL EXCEPTION: main 
02-28 14:49:43.086: E/AndroidRuntime(449): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.warningalert/com.example.warningalert.WarningAlert}: java.lang.ClassCastException: com.example.warningalert.WarningAlert 
02-28 14:49:43.086: E/AndroidRuntime(449): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1569) 
02-28 14:49:43.086: E/AndroidRuntime(449): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
02-28 14:49:43.086: E/AndroidRuntime(449): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
02-28 14:49:43.086: E/AndroidRuntime(449): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
02-28 14:49:43.086: E/AndroidRuntime(449): at android.os.Handler.dispatchMessage(Handler.java:99) 
02-28 14:49:43.086: E/AndroidRuntime(449): at android.os.Looper.loop(Looper.java:123) 
02-28 14:49:43.086: E/AndroidRuntime(449): at android.app.ActivityThread.main(ActivityThread.java:3683) 
02-28 14:49:43.086: E/AndroidRuntime(449): at java.lang.reflect.Method.invokeNative(Native Method) 
02-28 14:49:43.086: E/AndroidRuntime(449): at java.lang.reflect.Method.invoke(Method.java:507) 
02-28 14:49:43.086: E/AndroidRuntime(449): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
02-28 14:49:43.086: E/AndroidRuntime(449): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
02-28 14:49:43.086: E/AndroidRuntime(449): at dalvik.system.NativeStart.main(Native Method) 
02-28 14:49:43.086: E/AndroidRuntime(449): Caused by: java.lang.ClassCastException: com.example.warningalert.WarningAlert 
02-28 14:49:43.086: E/AndroidRuntime(449): at android.app.Instrumentation.newActivity(Instrumentation.java:1021) 
02-28 14:49:43.086: E/AndroidRuntime(449): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1561) 
02-28 14:49:43.086: E/AndroidRuntime(449): ... 11 more 

我對收到方法如下:

public class WarningAlert extends Activity { 

private SmsReceiver receiver; 

public static class SmsReceiver extends BroadcastReceiver{ 
    final SmsManager sms = SmsManager.getDefault(); 

    String body = null; 
    String no = "1555215556"; 
    String number = null; 
    int i; 


    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO Auto-generated method stub 
     // 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 (i=0; i<msgs.length; i++) 
      { 
       msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]); 

       if(msgs[i].getOriginatingAddress().equals(no)) 
       { 
        body = msgs[i].getMessageBody(); 
        number = msgs[i].getOriginatingAddress(); 
       str += "SMS from " + msgs[i].getOriginatingAddress(); 
       str += " :"; 
       str += msgs[i].getMessageBody().toString(); 
       str += "\n"; 
       Toast.makeText(context, str, Toast.LENGTH_SHORT).show(); 

       } 
      } 

       if(no.equals(number.toString())){ 

       Intent open = new Intent(context, StartAction.class); 
       open.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       open.putExtra("body", body); 
       open.putExtra("number", number); 
       context.startActivity(open); 

       } 
     } 
    } 

} 

,我的清單是: -

<receiver android:name="com.example.warningalert.WarningAlert$SmsReceiver" 
     android:enabled="true" 
     android:exported="true"> 
<intent-filter> 
    <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
</intent-filter> 

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

as this code was working最初罰款,我想清單是好的。

好的..我有這個問題!問題出在嵌套類上。如果我直接在類WarningAlert中擴展BroadcastReceiver並將代碼放在裏面,它就可以工作。但如果我有一個嵌套的類SmsReceiver裏面WarningAlert類,那麼它不會工作!任何想法爲什麼這個髮髻?

+0

什麼是行WarningAlert.java:55? – 2013-02-27 10:23:29

+0

它是我的課程名稱,在這裏面,我有我的SmsReceiver類 – newbee 2013-02-27 10:25:02

+0

我在問這個課程的第55行是什麼?因爲在該行空指針異常 – 2013-02-27 10:25:41

回答

0

我還是不明白是什麼問題。我一起創建了一個新項目,它工作正常。

0

您正在初始化爲number爲空,然後繼續使用它而不檢查它是否仍爲空。問題是,如果沒有任何消息的起始地址等於您指定的地址,則number保持不變。要麼將number初始化爲空字符串,要麼在第55行嘗試引用它之前檢查它是否仍爲空。

+0

我想問題是與onReceive方法。我嘗試了另一個簡單的應用程序使用短信廣播接收器,我得到了同樣的錯誤信息那裏 - '無法啓動接收器' – newbee 2013-02-28 04:51:54

+0

@ newtoandroid錯誤是由於'數字'是空的,當你試圖訪問它,你改變你如何初始化它? – vikki 2013-02-28 05:52:58

+0

是的,我改變了它。它現在是一個空字符串。 'String number;' – newbee 2013-02-28 06:26:29

0

請使用此代碼。

public void sendSMS(String phoneNumber, String message) { 
    mPhoneNumber = phoneNumber; 
    mMessage = message; 
    PendingIntent sentPI = PendingIntent.getBroadcast(mContext, 0, new Intent(SENT), 0); 
    PendingIntent deliveredPI = PendingIntent.getBroadcast(mContext, 0, new Intent(DELIVERED), 0); 
    SmsManager sms = SmsManager.getDefault(); 
    sms.sendTextMessage(mPhoneNumber, null, mMessage, sentPI, deliveredPI); 
    Toast.makeText(mContext, "SMS Sending...", Toast.LENGTH_SHORT).show(); 
    // ---when the SMS has been sent---final String string = "deprecation"; 
    mContext.registerReceiver(new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context arg0, Intent arg1) { 
      switch (getResultCode()) { 
      case Activity.RESULT_OK: 
       Toast.makeText(mContext, "SMS sent", Toast.LENGTH_SHORT).show(); 
       break; 
      case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
       Toast.makeText(mContext, "Generic failure", Toast.LENGTH_SHORT).show(); 
       break; 
      case SmsManager.RESULT_ERROR_NO_SERVICE: 
       Toast.makeText(mContext, "No service", Toast.LENGTH_SHORT).show(); 
       break; 
      case SmsManager.RESULT_ERROR_NULL_PDU: 
       Toast.makeText(mContext, "Null PDU", Toast.LENGTH_SHORT).show(); 
       break; 
      case SmsManager.RESULT_ERROR_RADIO_OFF: 
       Toast.makeText(mContext, "Radio off", Toast.LENGTH_SHORT).show(); 
       break; 
      } 
     } 
    }, new IntentFilter(SENT)); 
    // ---when the SMS has been delivered--- 
    mContext.registerReceiver(new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context arg0, Intent arg1) { 
      switch (getResultCode()) { 
      case Activity.RESULT_OK: 
       Toast.makeText(mContext, "SMS delivered", Toast.LENGTH_SHORT).show(); 
       break; 
      case Activity.RESULT_CANCELED: 
       Toast.makeText(mContext, "SMS not delivered", Toast.LENGTH_SHORT).show(); 
       break; 
      } 
     } 
    }, new IntentFilter(DELIVERED)); 
} 
+0

我沒有在我的應用程序中發送短信部分。我只需要收到短信。如果它來自某個特定的否,則必須執行一些操作 – newbee 2013-02-28 05:47:25