2016-06-14 9 views
0

アンドロイドアプリから一定時間後にサーバーに位置情報を送信します。私は、サービスとAlarmManagerを使用して、バックグラウンドでロケーション更新を継続的にチェックしました。アンドロイドで場所の更新を確認しながら同じ場所を避ける

しかし、私の問題は、アプリケーションがサーバーに送信するデータが多すぎることです。地図上にその場所のデータが表示されている間、同じ場所に非常に多くのデータが表示されます。どうすればこの問題を解決できますか?

ここでは、場所の更新を確認するための最小時間と距離を確認したコードの部分を示します。

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

は安全が15 meters30000 millisecondsminDistanceminTimeを使用することですか?

  • OKの場合、同じ の1つのデータのみをどのようにフィルタリングする必要がありますか?
  • 安全でない場合、どのように同じ位置情報を避けるべきですか?

下記の私の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) 
     { 
     } 
    } 

この状況を克服する方法を教えてください。

ありがとうございます。

答えて

0

このコードで何らかのバリデーションを提供することができます。移動距離が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) 
     { 
     } 
    } 
+1

((loc2_lat == nullの|| loc2_lat == 0.0) &&(loc2_long == nullの|| loc2_long == 0.0))場合は、チェックした理由を教えてくださいすることができ、なぜ私がいるかどうかを確認する必要があり(calculated_distance> 15)もう一度?私はすでに、この1つのlocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER、30000、15、listener)によって15メートルのデータをチェックしました。どの場所の正確なデータを取得するのが安全かどうか尋ねました。 – anuradha

関連する問題