我想在我的Android应用程序一段时间后将位置数据发送到服务器。我使用service和AlarmManager在后台连续检查位置更新。
但我的问题是应用程序向服务器发送了太多数据;因此,当我在地图上看到这些位置数据时,它会在同一位置显示如此多的数据。我该如何解决这个问题?
以下是我检查最小时间和距离以检查位置更新的代码部分。
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 30000, 15, listener);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 30000, 15, listener);
使用minTime
到30000 milliseconds
和minDistance
到15 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)
{
}
}
请建议我克服这种情况的可能方法?
提前致谢。
答案 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)
{
}
}