2014-05-09 35 views
0

我的应用程序不断崩溃onReceive基本上即时通讯发送GPS坐标到另一个Android设备,我试图从这些组的GPS坐标一段时间(真)循环直到他将得到这条线,使用im while循环,因为我需要等待,直到他将获得的坐标来解决直线的方程我的应用程序不工作(无限循环)

但它总是崩溃

这就是我的onReceive代码:。

package com.example.yeah; 

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

import com.google.android.gms.maps.GoogleMap; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.location.Location; 
import android.os.Bundle; 
import android.telephony.SmsMessage; 
import android.widget.Toast; 



    public class SmsListener extends BroadcastReceiver { 


    GoogleMap googleMap; 


     public void onReceive(Context context, Intent intent) { 

      Bundle bundle = intent.getExtras(); 

      Object messages[] = (Object[]) bundle.get("pdus"); 
      SmsMessage smsMessage[] = new SmsMessage[messages.length]; 
      for (int n = 0; n < messages.length; n++) { 
       smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]); 
      } 

      //show first message 
      Toast toast = Toast.makeText(context, "Received SMS: " +  smsMessage[0].getMessageBody(), Toast.LENGTH_LONG); 
      toast.show(); 
      String s=smsMessage[0].getMessageBody(); 
      Matcher m = Pattern.compile("(?!=\\d\\.\\d\\.)([\\d.]+)").matcher(s); 
      double[] d = new double[1000] ; 
      int p=0; 
      while (m.find()) 
      { 
       double k = Double.parseDouble(m.group(1)); 
       d[p]=k; 
       p++; 


      } 


      int j,i=1,t,success=0; 
      double line; 
      double[] ship = new double[1000] ; 
      double[] b = new double[1000] ; 
      double lat; 
      double lng; 

      ship[0]=SlopeCalc(d[2],d[0],d[3],d[1]); 
      b[0]=d[0]-ship[0]*d[1]; 


      if (p>3) 
      { 

      for(j=2;j<p;j++) 
      { 
       if(j+2<p){ 
       ship[i]=SlopeCalc(d[j+2],d[j-2+2],d[j+1+2],d[j-1+2]); 
       b[i]=d[j]-(ship[i]*d[j+1]); 
       j++; 
       i++; 
       } 
       else{ 
        break; 
       } 


      } 

      } 
      while(true) 
      { 
      Location lm = googleMap.getMyLocation(); 
      lat=lm.getLatitude(); 
      lng=lm.getLongitude(); 
      for (t=0;t<i;t++){ 
      line=ship[t]*lng+b[t]-lat; 
      if (line==0){ 
       success=1; 
       break; 
      } 
      } 
      if (success==1){ 
      break; 
      } 

      } 
      Toast poast = Toast.makeText(context, "I FOUND U", Toast.LENGTH_LONG); 
      poast.show(); 
      abortBroadcast(); 

     } 

     public static double SlopeCalc(double y2,double y1, double x2,double x1){ 

      double sou; 
      sou=(y2-y1)/(x2-x1); 
      return sou; 
     } 
     } 

这就是我的logcat:

05-09 21:44:24.165: E/Gsm/SmsMessage(2483): hasUserDataHeader : false 
05-09 21:44:24.190: E/AndroidRuntime(2483): FATAL EXCEPTION: main 
05-09 21:44:24.190: E/AndroidRuntime(2483): java.lang.RuntimeException: Unable to start receiver com.example.yeah.SmsListener: java.lang.NullPointerException 
05-09 21:44:24.190: E/AndroidRuntime(2483):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:1809) 
05-09 21:44:24.190: E/AndroidRuntime(2483):  at android.app.ActivityThread.access$2400(ActivityThread.java:117) 
05-09 21:44:24.190: E/AndroidRuntime(2483):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:985) 
05-09 21:44:24.190: E/AndroidRuntime(2483):  at android.os.Handler.dispatchMessage(Handler.java:99) 
05-09 21:44:24.190: E/AndroidRuntime(2483):  at android.os.Looper.loop(Looper.java:130) 
05-09 21:44:24.190: E/AndroidRuntime(2483):  at android.app.ActivityThread.main(ActivityThread.java:3691) 
05-09 21:44:24.190: E/AndroidRuntime(2483):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-09 21:44:24.190: E/AndroidRuntime(2483):  at java.lang.reflect.Method.invoke(Method.java:507) 
05-09 21:44:24.190: E/AndroidRuntime(2483):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907) 
05-09 21:44:24.190: E/AndroidRuntime(2483):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665) 
05-09 21:44:24.190: E/AndroidRuntime(2483):  at dalvik.system.NativeStart.main(Native Method) 
05-09 21:44:24.190: E/AndroidRuntime(2483): Caused by: java.lang.NullPointerException 
05-09 21:44:24.190: E/AndroidRuntime(2483):  at com.example.yeah.SmsListener.onReceive(SmsListener.java:90) 
05-09 21:44:24.190: E/AndroidRuntime(2483):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:1798) 
05-09 21:44:24.190: E/AndroidRuntime(2483):  ... 10 more 

我想它的崩溃是因为while循环...需要你的帮助!

+0

90线在哪里? –

+0

第90行是在for循环的后面“for(j = 2; j mynavy

+0

因为堆栈跟踪表明您在第90行有一个空指针异常。您知道如何调试应用程序吗? –

回答

2

您的googleMap对象为null。

你只是宣称它

GoogleMap googleMap; 

,但从来没有实例化。那么当你试图做,

googleMap.getMyLocation(); 

你运行到空指针异常。

+0

感谢您的评论...但是怎么来? – mynavy

+0

也许googleMap.setMyLocationEnabled(真)将帮助? – mynavy

+0

对不起,哥们还没有用过GoogleMaps呢。但这就是我在Android Docs上找到的东西 - 无法直接实例化GoogleMap对象,而是必须从已添加到应用程序的MapFragment或MapView的getMap()方法中获得一个。 –

2

这不是一个无限循环。这是一个NullPointerException异常,在第90行。我猜在这里:

Location lm = googleMap.getMyLocation(); 

确保您分配一个值的GoogleMap您尝试调用其中的一个方法之前。

+0

据我所知,但我应该分配什么值,如果我假设设备在外面从GPS获取坐标...? – mynavy

+0

从谷歌文档(假设在你的布局文件中,你有一个ID为“map”的MapFragment: GoogleMap map =((MapFragment)getFragmentManager() .findFragmentById(R.id.map))。getMap(); – ajpolt