2015-02-18 2 views
0

Я создал простое приложение, в котором работает служба. В приложении пользователь вводит адрес, и службе необходимо рассчитать расстояние между местоположением пользователя и адресом, который он ввел. Если расстояние между ними меньше 100 метров, то появляется сообщение с тостом. Когда я впервые запускаю приложение, он правильно устанавливает расстояние, но через пару раз, когда я запускаю свое приложение в разных местах, вычисление расстояния растет. Например: я запускаю eclipse (у себя дома), затем запускаю приложение на своем устройстве. Я ввожу адрес своего дома и после вычисления расстояния, расстояние составляет 5 метров, и появляется сообщение тоста. Затем я иду куда-то и вхожу в адрес места, куда я собираюсь, и когда я добираюсь туда, появляется тост. Но когда я вернусь к себе и снова запустил приложение (с адресом моего дома) с телефоном, подключенным к затмению, расстояние теперь составляет 20 метров вместо 5 метров. В чем может быть проблема? И приложение сокрушает несколько раз ....Мои сбои приложений для Android

MainActivity:

public void startMethod(View v) 
{ 
    Bundle args = new Bundle(); 
    args.putParcelable("from_position", latLngC); 
    args.putParcelable("to_position", latLngD); 


    Intent i = new Intent(this, MainService.class); 
    i.putExtra("bundle", args); 
    startService(i); 
} 

MainService:

Toast.makeText(this, "service started", Toast.LENGTH_LONG).show(); // 
    Bundle bundle = intent.getParcelableExtra("bundle"); 

    latLngC = bundle.getParcelable("from_position");//Getting the latlng of user position 
    latLngD = bundle.getParcelable("to_position");//Getting the latlng of destination position 

    timer = new Timer(); 
    //schedule the timer, after the first 5000ms the TimerTask will run every 10000ms 
    timer.scheduleAtFixedRate(
      timerTask = new TimerTask() { 

       public void run() { 
        //use a handler to run a toast that shows the current timestamp 

        handler.post(new Runnable() { 

         public void run() { 

          latLngC=setMyLocation(); // Getting users current location 
          double r = CalculationByDistance(latLngC, latLngD); 
          if(r<0.1){ 
            Calendar calendar = Calendar.getInstance(); 
           SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd:MMMM:yyyy HH:mm:ss a"); 
           final String strDate = simpleDateFormat.format(calendar.getTime()); 

           //show the toast 
           int duration = Toast.LENGTH_SHORT; 
           Toast toast = Toast.makeText(getApplicationContext(), strDate, duration); 
           toast.show(); 
             timer.cancel(); // stopping the timer 
             stopSelf(); // stopping the service 
          } 

         } 
        }); 
       } 
      } 
      , 10000, 10000); // 

    return super.onStartCommand(intent, flag, startId); 
} 

Также в MainService:

public double CalculationByDistance(LatLng StartP, LatLng EndP) { 
    int Radius=6371;//radius of earth in Km   
    double lat1 = StartP.latitude; 
    double lat2 = EndP.latitude; 
    double lon1 = StartP.longitude; 
    double lon2 = EndP.longitude; 
    double dLat = Math.toRadians(lat2-lat1); 
    double dLon = Math.toRadians(lon2-lon1); 
    double a = 0; 
    a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
    Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * 
    Math.sin(dLon/2) * Math.sin(dLon/2); 
    double c = 0; 
    c = 2 * Math.asin(Math.sqrt(a)); 
    double valueResult= Radius*c; 
    double km=valueResult/1; 
    DecimalFormat newFormat = new DecimalFormat("####"); 
    int kmInDec = Integer.valueOf(newFormat.format(km)); 
    double meter=valueResult%1000; 
    int meterInDec= Integer.valueOf(newFormat.format(meter)); 
    Log.i("Radius Value",""+valueResult+" KM "+kmInDec+" Meter "+meterInDec); 

    return Radius * c; 
} 

LogCat:

02-18 13:49:29.538: E/AndroidRuntime(13037): FATAL EXCEPTION: main 
02-18 13:49:29.538: E/AndroidRuntime(13037): java.lang.NullPointerException 
02-18 13:49:29.538: E/AndroidRuntime(13037): at com.*******drive.***.MainActivity$GeocoderTask.onPostExecute(MainActivity.java:231) 
02-18 13:49:29.538: E/AndroidRuntime(13037): at com.*******drive.***.MainActivity$GeocoderTask.onPostExecute(MainActivity.java:1) 
02-18 13:49:29.538: E/AndroidRuntime(13037): at android.os.AsyncTask.finish(AsyncTask.java:631) 
02-18 13:49:29.538: E/AndroidRuntime(13037): at android.os.AsyncTask.access$600(AsyncTask.java:177) 
02-18 13:49:29.538: E/AndroidRuntime(13037): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
02-18 13:49:29.538: E/AndroidRuntime(13037): at android.os.Handler.dispatchMessage(Handler.java:99) 
02-18 13:49:29.538: E/AndroidRuntime(13037): at android.os.Looper.loop(Looper.java:137) 
02-18 13:49:29.538: E/AndroidRuntime(13037): at android.app.ActivityThread.main(ActivityThread.java:4867) 
02-18 13:49:29.538: E/AndroidRuntime(13037): at java.lang.reflect.Method.invokeNative(Native Method) 
02-18 13:49:29.538: E/AndroidRuntime(13037): at java.lang.reflect.Method.invoke(Method.java:511) 
02-18 13:49:29.538: E/AndroidRuntime(13037): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007) 
02-18 13:49:29.538: E/AndroidRuntime(13037): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774) 
02-18 13:49:29.538: E/AndroidRuntime(13037): at dalvik.system.NativeStart.main(Native Method) 
+1

что такое ошибка ?? – Pavya

+0

поместите свой логарифм – KDeogharkar

ответ

1

Проблема может возникнуть, если вы получаете текущее местоположение (в методе setMyLocation()), используя getLastKnownLocation. Затем вы получаете LAST KNOWN LOCATION, которое не может быть вашим текущим местоположением. Если это проблема, во-первых, вам нужно получить свое фактическое местоположение (есть много способов, например, используя onLocationChanged), а затем рассчитать расстояние и отобразить тосты ...

Также, разместите свой логарифм, когда приложение аварии ...

Смежные вопросы