在android中检查位置更新时避免相同的位置

时间:2016-06-14 05:06:13

标签: android service geolocation location

我想在我的Android应用程序一段时间后将位置数据发送到服务器。我使用service和AlarmManager在后台连续检查位置更新。

但我的问题是应用程序向服务器发送了太多数据;因此,当我在地图上看到这些位置数据时,它会在同一位置显示如此多的数据。我该如何解决这个问题?

以下是我检查最小时间和距离以检查位置更新的代码部分。

locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 30000, 15, listener);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 30000, 15, listener);

使用minTime30000 millisecondsminDistance15 meters是否安全?

  • 如果没问题,那么我应该如何只过滤同一个数据 地点?
  • 如果不安全,我应该如何避免相同的位置数据?

我在下面添加了我的LocationListener代码。在这里,我正在检查最佳位置并将数据发送到服务器。

public class MyLocationListener implements LocationListener
    {

        public void onLocationChanged(final Location loc)
        {
            Log.i("**************************************", "Location changed");
            if(isBetterLocation(loc, previousBestLocation)) {
                loc.getLatitude();
                loc.getLongitude();

                intent.putExtra("Latitude", loc.getLatitude());
                intent.putExtra("Longitude", loc.getLongitude());
                intent.putExtra("Provider", loc.getProvider());
                sendBroadcast(intent);

                mySpeed = loc.getSpeed() * 1.94384449;
                myKmph = loc.getSpeed() * 3.6;
                myBearing = loc.getBearing();


                double flat = loc.getLatitude(); //-32.827141
                double flon = loc.getLongitude(); //139.667476
                int inlat = (int) flat; //-32
                int inlon = (int) flon; //139

                float minlat = (float) (flat % 1) * 60; //10.371540000000152
                float minlon = (float) (flon % 1) * 60; //

                minlat = (minlat < 0) ? -minlat : minlat;
                minlon = (minlon < 0) ? -minlon : minlon;

                String norther = "N";
                String souther = "S";
                String easter = "E";
                String wester = "W";
                String northsouther = "";
                String eastwester = "";
                if(flat>=0.0) {
                    northsouther = norther;
                }
                else {
                    northsouther = souther;
                }
                if(flon>=0.0) {
                    eastwester = easter;
                }
                else {
                    eastwester = wester;
                }

                String text = "...my formate to send data...";

                try {
                    String ip = "XX.XXX.XXX.XXX";
                    int port = XXXX;

                    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

                    StrictMode.setThreadPolicy(policy);

                    Socket clientSocket = new Socket(ip, port);

                    DataOutputStream outToServer = new DataOutputStream(
                            clientSocket.getOutputStream());
                    outToServer.writeBytes(text);

                    clientSocket.close();
                    Log.d("LocationService", "Data sent successfully");

                } catch (Exception e) {
                    Log.e("LocationService", "[Error] Either in Sending Data or the callback" + e.toString());
                }
            }
        }

        public void onProviderDisabled(String provider)
        {
            Toast.makeText( getApplicationContext(), "Gps Disabled", Toast.LENGTH_SHORT ).show();
        }


        public void onProviderEnabled(String provider)
        {
            Toast.makeText( getApplicationContext(), "Gps Enabled", Toast.LENGTH_SHORT).show();
        }


        public void onStatusChanged(String provider, int status, Bundle extras)
        {
        }
    }

请建议我克服这种情况的可能方法?

提前致谢。

1 个答案:

答案 0 :(得分:0)

您可以在此代码中提供某种验证。我们可以提供一个验证,如果移动的距离超过15米,我们会将纬度和经度发送到服务器。您可以像这样编写代码:< / p>

public class MyLocationListener implements LocationListener
    {

        public void onLocationChanged(final Location loc)
        {
            Log.i("**************************************", "Location changed");
            if(isBetterLocation(loc, previousBestLocation)) {
                loc1_lat =loc.getLatitude();
                loc1_long = loc.getLongitude();
// define double loc2_lat==0 and loc2_long=0 so we initially enter this condition;
 if ((loc2_lat == null || loc2_lat == 0.0)
                            && (loc2_long == null || loc2_long == 0.0)) 
{
                        double loc2_lat = loc1_lat;
                        double loc2_long = loc1_long;

                    }
//new piece of code goes here.
        Location locationA = new Location("point A");
        locationA.setLatitude(loc1_lat);
        locationA.setLongitude(loc1_long);
        Location locationB = new Location("point B");
        locationB.setLatitude(loc2_lat);
        locationB.setLongitude(loc2_lat);
//calculate distance between current lat long and future lat long
        float calculated_distance = locationA.distanceTo(locationB);
//calculated_distance in meter.
        calculated_distance = distance_U_driver / 1000;

//put this validation by yourself in meters.If you want your device to move 15 meter and then send the next coordinate
if(calculated_distance > 15){
                intent.putExtra("Latitude", loc.getLatitude());
                intent.putExtra("Longitude", loc.getLongitude());
                intent.putExtra("Provider", loc.getProvider());
                sendBroadcast(intent);
}
                mySpeed = loc.getSpeed() * 1.94384449;
                myKmph = loc.getSpeed() * 3.6;
                myBearing = loc.getBearing();


                double flat = loc.getLatitude(); //-32.827141
                double flon = loc.getLongitude(); //139.667476
                int inlat = (int) flat; //-32
                int inlon = (int) flon; //139

                float minlat = (float) (flat % 1) * 60; //10.371540000000152
                float minlon = (float) (flon % 1) * 60; //

                minlat = (minlat < 0) ? -minlat : minlat;
                minlon = (minlon < 0) ? -minlon : minlon;

                String norther = "N";
                String souther = "S";
                String easter = "E";
                String wester = "W";
                String northsouther = "";
                String eastwester = "";
                if(flat>=0.0) {
                    northsouther = norther;
                }
                else {
                    northsouther = souther;
                }
                if(flon>=0.0) {
                    eastwester = easter;
                }
                else {
                    eastwester = wester;
                }

                String text = "...my formate to send data...";

                try {
                    String ip = "XX.XXX.XXX.XXX";
                    int port = XXXX;

                    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

                    StrictMode.setThreadPolicy(policy);

                    Socket clientSocket = new Socket(ip, port);

                    DataOutputStream outToServer = new DataOutputStream(
                            clientSocket.getOutputStream());
                    outToServer.writeBytes(text);

                    clientSocket.close();
                    Log.d("LocationService", "Data sent successfully");

                } catch (Exception e) {
                    Log.e("LocationService", "[Error] Either in Sending Data or the callback" + e.toString());
                }
            }
        }

        public void onProviderDisabled(String provider)
        {
            Toast.makeText( getApplicationContext(), "Gps Disabled", Toast.LENGTH_SHORT ).show();
        }


        public void onProviderEnabled(String provider)
        {
            Toast.makeText( getApplicationContext(), "Gps Enabled", Toast.LENGTH_SHORT).show();
        }


        public void onStatusChanged(String provider, int status, Bundle extras)
        {
        }
    }