2013-02-03 21 views
1

我想發送短信使用smsManagerBroadCast Receiver。我得到這個錯誤說NullPointerException。我不知道這有什麼問題。我厭倦了這個錯誤。 這裏是我的代碼段SmsManager空指針異常

GPSTracker tracker = new GPSTracker(context); 
      MyLocation temp = tracker.getCurrentLocation(); 
      String message = sp.getString("auto_text", "") + "\n" 
        + "Latitude: "+temp.getLatitude() + "\nLogitude: "+temp.getLongitude(); 
      Toast.makeText(context, message, Toast.LENGTH_LONG).show(); 
      smsManager.sendTextMessage(smsMessage.getOriginatingAddress(), 
        null, message, null, null); 

字符串消息不爲空。它顯示在烤麪包上。 如果我將消息替換爲

sp.getString("auto_text","")+" "+temp.getLatitude()+" "+temp.getLongitude(); 

那麼它工作正常。

MyLocation.java

import android.os.Parcel; 
import android.os.Parcelable; 

public class MyLocation implements Parcelable{ 

    double latitude,longitude; 
    public MyLocation() { 
    } 
    public double getLatitude() { 
     return latitude; 
    } 

    public void setLatitude(double latitude) { 
     this.latitude = latitude; 
    } 

    public double getLongitude() { 
     return longitude; 
    } 
    @Override 
    public String toString() { 
     return getLatitude()+" , "+getLongitude(); 
    } 

    public void setLongitude(double longitude) { 
     this.longitude = longitude; 
    } 

    @Override 
    public int describeContents() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeDouble(latitude); 
     dest.writeDouble(longitude); 

    } 
    public static final Parcelable.Creator<MyLocation> CREATOR = new Parcelable.Creator<MyLocation>() { 
     public MyLocation createFromParcel(Parcel pc) { 
      return new MyLocation(pc); 
     } 

     public MyLocation[] newArray(int size) { 
      return new MyLocation[size]; 
     } 
    }; 
    public MyLocation(Parcel pc){ 
     latitude = pc.readDouble(); 
     longitude = pc.readDouble(); 

    } 

} 

logcat的

FATAL EXCEPTION: main 
02-03 08:54:22.822: E/AndroidRuntime(3124): java.lang.RuntimeException: Unable to start receiver com.blogspot.uappmarket.locationbasedproject.Receiver.InCommingSmsReceiver: java.lang.NullPointerException 
02-03 08:54:22.822: E/AndroidRuntime(3124):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:1805) 
02-03 08:54:22.822: E/AndroidRuntime(3124):  at android.app.ActivityThread.access$2400(ActivityThread.java:117) 
02-03 08:54:22.822: E/AndroidRuntime(3124):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:981) 
02-03 08:54:22.822: E/AndroidRuntime(3124):  at android.os.Handler.dispatchMessage(Handler.java:99) 
02-03 08:54:22.822: E/AndroidRuntime(3124):  at android.os.Looper.loop(Looper.java:130) 
02-03 08:54:22.822: E/AndroidRuntime(3124):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
02-03 08:54:22.822: E/AndroidRuntime(3124):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-03 08:54:22.822: E/AndroidRuntime(3124):  at java.lang.reflect.Method.invoke(Method.java:507) 
02-03 08:54:22.822: E/AndroidRuntime(3124):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
02-03 08:54:22.822: E/AndroidRuntime(3124):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
02-03 08:54:22.822: E/AndroidRuntime(3124):  at dalvik.system.NativeStart.main(Native Method) 
02-03 08:54:22.822: E/AndroidRuntime(3124): Caused by: java.lang.NullPointerException 
02-03 08:54:22.822: E/AndroidRuntime(3124):  at android.os.Parcel.readException(Parcel.java:1328) 
02-03 08:54:22.822: E/AndroidRuntime(3124):  at android.os.Parcel.readException(Parcel.java:1276) 
02-03 08:54:22.822: E/AndroidRuntime(3124):  at com.android.internal.telephony.ISms$Stub$Proxy.sendText(ISms.java:369) 
02-03 08:54:22.822: E/AndroidRuntime(3124):  at android.telephony.SmsManager.sendTextMessage(SmsManager.java:87) 
02-03 08:54:22.822: E/AndroidRuntime(3124):  at com.blogspot.uappmarket.locationbasedproject.Receiver.InCommingSmsReceiver.onReceive(InCommingSmsReceiver.java:33) 
02-03 08:54:22.822: E/AndroidRuntime(3124):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:1794) 
+0

你明白一個NullPointerException是什麼?你知道如何讀取logcat嗎?你知道如何使用調試器嗎?請讓我們知道,以便我們提供適當的幫助。 – Simon

+0

發佈InCommingSmsReceiver類的完整代碼,並將'smsMessage.getOriginatingAddress()'檢查爲空或不爲 –

+0

@Simon我知道NullPointerException。我的消息字符串不爲空。它在日誌中打印時工作正常。 –

回答

1

我剛剛發現了這個問題的正當理由。 即:當短消息超過大小限制時,SmsManager.sendTextMessage() throws NullPointerException。即最大字符數限制爲159.

+0

好吧,這是disapointing –

+0

@UsmanRiaz,是的。 :( – Harpreet

+1

我有同樣的問題,並意識到這也是我的問題,謝謝! – gauglerb

0

SmsManager.sendTextMessage()方法在傳入無效號碼作爲目的地的情況下也會引發NPE。當我傳遞格式化的電話號碼時(例如「+1 999 999 9999」),我發現了這一點。當我清除空字符並在國家代碼前刪除「+」時,該方法沒有拋出NPE。

0

@harpreet aswer指出我錯誤的來源。

請注意,SMS消息長度限制可能因您的移動網絡運營商而異。

然後你有兩個解決方案:

1 - 發送一個較短的消息。

- 或 -

2 - 斯普利特他們幾個的消息(這可能會導致額外費用)

SmsManager sms = SmsManager.getDefault(); 
ArrayList<String> dividedText = sms.divideMessage(message); 
for (String shortMessage : dividedText) { 
    sms.sendTextMessage(phoneNumber,null,shortMessage,null,null); 
    }