Send GPS coordinates to the Web Service every so often

1

I am trying to send coordinates from my position every so often to the web service, I have a class called " LocationService " that should do this, but at the moment of executing the application, nothing happens ...

LocationService

public class LocationService extends Service implements LocationListener{

public String LOG = "Log";
UserSessionManager session;

private Context mContext = null;

boolean isGPSEnabled = false;
boolean isNetworkEnabled = false;
boolean canGetLocation = false;

Location location; // location
double latitude; // latitude
double longitude; // longitude

// The minimum distance to change Updates in meters
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 0; // 0 meters

// The minimum time between updates in milliseconds
private static final long MIN_TIME_BW_UPDATES = 1000; // 1 second

// Declaring a Location Manager
protected LocationManager locationManager;

public LocationService(Context context) {
    this.mContext = context;
}

public LocationService() {
    super();
    mContext = LocationService.this;
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();
    Log.i(LOG, "Service started");
    Log.i("asd", "This is sparta");

    HashMap<String, String> user = session.obtenerRolyId();
    String usuarioId = user.get(UserSessionManager.KEY_ID);

    new SendToServer().execute(Double.toString(getLocation().getLongitude()), Double.toString(getLocation().getLatitude()),usuarioId);

    return START_STICKY;
}


@Override
public void onCreate() {
    super.onCreate();
    Log.i(LOG, "Service created");
}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.i(LOG, "Service destroyed");
}

class SendToServer extends AsyncTask<String, String, String> {


    @Override
    protected String doInBackground(String... la) {

        try {

            HttpURLConnection urlConnection = null;
            String posicionActual = "";
            BufferedReader reader = null;
            OutputStream os = null;
            InputStream inputStream = null;

            Log.i("string", la[0]);
            String longi = la[0];      // Recibo la longitud.
            String lati = la[1];       // Recibo la latitud.
            String idUsuario = la[2];  // Recibo Id del usuario.

            JSONObject coordenadas = new JSONObject();
            coordenadas.put("Latitud",lati);
            coordenadas.put("Longitud",longi);

            posicionActual = coordenadas.toString();

            URL url = new URL("http://localhost:8081/odata/Usuarios("+idUsuario+")/ActualizarPosicion");
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setDoOutput(true);

            urlConnection.setRequestMethod("POST");
            urlConnection.setRequestProperty("Content-Type", "application/json");
            urlConnection.setRequestProperty("Accept", "application/json");


            urlConnection.connect();

            os = new BufferedOutputStream(urlConnection.getOutputStream());
            os.write(posicionActual.getBytes());


        } catch (Exception e) {
            Log.i("error", e.toString());
        }

        return "call";
    }
}

public Location getLocation() {
    try {
        locationManager = (LocationManager) mContext
                .getSystemService(LOCATION_SERVICE);

        // getting GPS status
        isGPSEnabled = locationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER);

        // getting network status
        isNetworkEnabled = locationManager
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if (!isGPSEnabled && !isNetworkEnabled) {
            // no network provider is enabled
        } else {
            this.canGetLocation = true;
            if (isNetworkEnabled) {
                //updates will be send according to these arguments
                if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

                }
                locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                Log.d("Network", "Network");
                if (locationManager != null) {
                    location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    if (location != null) {
                        latitude = location.getLatitude();
                        longitude = location.getLongitude();
                    }
                }
            }
            // if GPS Enabled get lat/long using GPS Services
            if (isGPSEnabled) {
                if (location == null) {
                    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,MIN_TIME_BW_UPDATES,MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("GPS Enabled", "GPS Enabled");
                    if (locationManager != null) {
                        location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
    return location;
}




@Override
public void onLocationChanged(Location location) {
    //Llamo al servidor cada segundo y le envío mi posición
    HashMap<String, String> user = session.obtenerRolyId();
    String usuarioId = user.get(UserSessionManager.KEY_ID);
    new SendToServer().execute(Double.toString(getLocation().getLongitude()),Double.toString(getLocation().getLatitude()), usuarioId);


}

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

}

@Override
public void onProviderEnabled(String provider) {

}

@Override
public void onProviderDisabled(String provider) {

}}

And I call my service in the following way from the activity:

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_user_map);

    startService(new Intent(UserMapActivity.this, LocationService.class));}
    
asked by Richard Mancilla 30.05.2017 в 08:33
source

1 answer

1

One thing, do you enter the DoInBackground method of the Asynktask? The first thing you have to do is verify that and the following, if you enter the method, verify that you do not "skip" the exception and do not execute the code you want. Anyway, when I declare an Asynchronous class I do it like this:

private class HttpAsyncTask3 extends AsyncTask<String, Void, String> {

    @Override
    protected void onPreExecute() {
        // Showing progress dialog before sending http request

    }

    @Override
    protected String doInBackground(String... urls) { ... }

    @Override
    protected void onPostExecute(String result) {
    }
}

If you notice, the input parameters to the class are different and you also have to declare the onPreExecute method, even if you leave it empty, since it is the first thing that will be executed when calling this class. I hope it helps you

    
answered by 30.05.2017 в 12:47