2013-02-03 5 views
1

J'essaie d'envoyer un message texte en utilisant smsManager à partir d'un BroadCast Receiver. J'obtiens cette erreur dit NullPointerException. Je ne sais pas ce qui ne va pas avec ça. Je suis malade de cette erreur. ici est mon segment de codeSmsManager Exception pointeur nul

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); 

String message est non nul. il est affiché dans le pain grillé. Si je remplace un message avec

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

il fonctionne très bien.

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

Comprenez-vous ce qu'est un NullPointerException est? Savez-vous comment lire Logcat? Vous savez comment utiliser le débogueur? S'il vous plaît laissez-nous savoir afin que nous puissions donner le bon niveau d'aide. – Simon

+0

poster le code complet de la classe InCommingSmsReceiver et mettre une vérification de 'smsMessage.getOriginatingAddress()' est nulle ou non –

+0

@ Simon Je connais NullPointerException. Mon message String n'est pas nul. cela fonctionne bien quand je l'imprime sur le journal. –

Répondre

1

Je viens de trouver une raison valable pour ce problème. C'est-à-dire: SmsManager.sendTextMessage() throws NullPointerException lorsque le message SMS dépasse la limite de taille. c'est-à-dire que la limite de caractères maximum est de 159.

+0

bien c'est décevant –

+0

@UsmanRiaz, Yah c'est. :( – Harpreet

+1

J'ai eu le même problème, et j'ai réalisé que c'était aussi mon problème. – gauglerb

0

Peut-être que Harpreet a raison, en fait j'ai rencontré cette situation tout à l'heure.

Vous pouvez simplement utiliser la méthode SmsManager.divideMessage(String text) pour laisser le système gérer la longueur.

0

La méthode SmsManager.sendTextMessage() lance également un NPE dans le cas où un nombre non valide est passé en tant que destination. J'ai découvert cela directement lorsque je transmettais un numéro de téléphone formaté (par exemple "+1 999 999 9999"). La méthode n'a pas lancé de NPE quand j'ai enlevé les caractères vides et j'ai enlevé le "+" avant le code de pays. @harpreet aswer m'a indiqué la source de l'erreur.

0

Notez que la limite de longueur des messages SMS peut varier en fonction de votre opérateur de réseau mobile.

Ensuite, vous avez deux solutions:

1 - Pour envoyer un message plus court.

-ou-

2 - Fendez dans plusieurs messages (Cela peut entraîner des frais supplémentaires)

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