【问题标题】:avoid same locations while checking location updates in android在android中检查位置更新时避免相同的位置
【发布时间】:2016-06-14 05:06:12
【问题描述】:

我想在一段时间后从我的 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)
        {
        }
    }

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

提前致谢。

【问题讨论】:

    标签: android service geolocation location


    【解决方案1】:

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

    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)
            {
            }
        }
    

    【讨论】:

    • 你能告诉我你为什么检查 if ((loc2_lat == null || loc2_lat == 0.0) && (loc2_long == null || loc2_long == 0.0)) 以及我为什么要检查if(calculated_distance > 15) 再次?我已经通过这个 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 30000, 15, listener) 检查了 15 米的数据。我问是否可以安全地获取任何位置的准确数据?
    猜你喜欢
    • 2018-11-28
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多