Android: Guardar coordenadas en mysql con volley

Hoy veremos como guardar las coordenadas en mysql usando la librería volley. Ya hace buen tiempo hicimos un tutorial de como guardar las coordenadas en mysql con la librería apache, pero como sabrán esta librería ya esta en desuso, entonces hoy decidimos actualizar este pequeño curso en android. Si eres nuevo con esta librería y tienes mas dudas o simplemente quieres dominarla te aconsejo que ingreses a este enlace: curso intensivo de volley este curso consta de tres partes, donde veras temas como listar, agregar, iniciar sesión de un usuario etc. En pocas horas puedes dominarla, inclusive los enlaces cuentas con vídeos que ayudaran a la comprensión, sin mas que decir empezamos de una vez con el curso.

Android: Guardar coordenadas en mysql con volley

 

BASE DE DATOS

Empezamos  creando una base de datos en mi caso le llamare gpsbd y luego crearemos una tabla llamada gps donde tendremos cuatro campos como se ven en el código que le estoy dejando lineas mas abajo:

CREATE TABLE `gps` (
  `id` int(11) NOT NULL,
  `direccion` varchar(100) NOT NULL,
  `lat` float NOT NULL,
  `lon` float NOT NULL
)

 

WEBSERVICES

En este caso ya saben que siempre utilizo el modelo por capas, osea diferente parte de código dentro de carpetas diferentes para mejorar el orden de la programación, en este sentido creare tres carpetas y deben ser las siguientes como se muestra en la imagen:

  3.1 Carpeta datos

En esta carpeta ingresaremos un archivo php llamado Conexión.clase.php que nos servirá para hacer la conexión entre nuestra base de datos y la webservices. Recuerda cambiar tus datos en la linea 8,9 y 10 con los de tu servidor o hosting.

Conexion.clase.php

<?php

    class Conexion {

        protected $dblink;
                
        function __construct() {
            $servidor = "mysql:host=localhost;port=3306;dbname=gpsbd";
            $usuario = "root";
            $clave = "12345";          
            $this->dblink = new PDO($servidor, $usuario, $clave);
            $this->dblink->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->dblink->exec("SET NAMES utf8");
        }
        

}

?>

 

  3.2 Carpeta negocio

En esta carpeta ingresaremos nuestra clase php llamada Gps.clase.php que nos servirá para utilizar los atributos que emplearemos en este caso las coordenadas como se ve en las lineas 4,5,6,7 y también la función agregar en la linea 53 que nos permitirá agregar las coordenadas en nuestra tabla gps:

Gps.clase.php

<?php
    require_once '../datos/Conexion.clase.php';
    class Gps extends Conexion{
        private $codigo;
        private $direccion;
        private $lat;
        private $lon;

        public function getCodigo()
        {
            return $this->codigo;
        }
        
        public function setCodigo($codigo)
        {
            $this->codigo = $codigo;
            return $this;
        }

  public function getDireccion()
  {
      return $this->direccion;
  }
  
  public function setDireccion($direccion)
  {
      $this->direccion = $direccion;
      return $this;
  }

  public function getLat()
  {
      return $this->lat;
  }
  
  public function setLat($lat)
  {
      $this->lat = $lat;
      return $this;
  }

  public function getLon()
  {
      return $this->lon;
  }
  
  public function setLon($lon)
  {
      $this->lon = $lon;
      return $this;
  }

  public function agregar() {
            $sql = "insert into gps( direccion, lat, lon) values(:dir, :lat, :lon);";
            
            $sentencia = $this->dblink->prepare($sql);
            $direccion = $this->getDireccion();
            $lat = $this->getLat();
            $lon = $this->getLon();

            $sentencia->bindParam(":dir",  $direccion);
            $sentencia->bindParam(":lat", $lat);
            $sentencia->bindParam(":lon", $lon );
            $resultado = $sentencia->execute();
            

            if ($resultado != 1){
                //ocurrio un error al insertar
                return FALSE;
            }
            
            //Insertó correctamente
            return TRUE;
            
        }

    }

 

  3.3 Carpeta web-services

En esta carpeta tendremos un archivo php llamado registrar-gps.php este archivo nos servirá para consumir nuestra api webservices y podremos registrar los datos que son enviados desde la app hacia la base de datos:

registrar-gps.php

<?php
    if  (
            ( !isset(  $_POST["direccion"]        ) )     ||
            ( !isset(  $_POST["lat"]              ) )     ||
            ( !isset(  $_POST["lon"]              ) )      
        )
        {
            $respuesta = array(
                "estado"=>"error"
            );
            
            echo json_encode($respuesta);
            exit();
        }
        
        
        $direccion    	 = $_POST["direccion"];
        $lat   			 = $_POST["lat"];
        $lon       		 = $_POST["lon"];
        
        require_once '../negocio/Gps.clase.php';
        $objGps = new Gps();
        $objGps->setDireccion($direccion);
        $objGps->setLat($lat);
        $objGps->setLon($lon);
        

        if ($objGps->agregar()==TRUE){
            $respuesta = array(
                "estado"=>"exito"
            );
        }else{
            $respuesta = array(
                "estado"=>"error"
            );
        }
        
        //echo json_encode($respuesta);
        echo json_encode($respuesta);
        
?>

 

CONSTRUYENDO LA APP

 

  4.1 Damos permisos en el AndroidManifest

Aquí debemos dar permiso tanto para el gps como para el acceso del internet, como se observa en las lineas 4,5,6.

AndroidManifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.androfast.server.appgpsbdvolley">
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

  4.2 Agregando librería volley

Debemos agregar la librería volley dentro de nuestro archivo build.gradle, para ser mas exacto dentro de dependencies como se muestra a continuación en la linea 8:

build.gradle

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
    compile 'com.android.volley:volley:1.0.0'
}

 

4.3 Agregando el modo gráfico

Para este ejemplo solo usaremos tres textview y un botón como se muestra en la siguiente imagen

 

4.4 Agregando las clases

Trabajaremos con dos clases una llamada Http que nos servirá para conectarnos a la webservices y la otra sera nuestra clase por defecto MainActivity donde obtendremos y guardaremos las coordenadas:

Http

recuerda cambiar la dirección de tu webservices

public class Http {
 
 public static final String URL_WEB_SERVICE = "http://192.168.8.156/gpsbd/web-services/";

}

MainActivity

public class MainActivity extends AppCompatActivity {

    TextView direccion, lat,lon;
    Button guardar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        direccion=(TextView)findViewById(R.id.txtDireccion);
        lat=(TextView)findViewById(R.id.txtLat);
        lon=(TextView)findViewById(R.id.txtLon);
        guardar=(Button)findViewById(R.id.btnGuardar);

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION,}, 1000);
        } else {
            locationStart();
        }
       guardar.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               guardarGps();
           }
       });

    }
    private void locationStart() {
        LocationManager mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        Localizacion Local = new Localizacion();
        Local.setMainActivity(this);
        final boolean gpsEnabled = mlocManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        if (!gpsEnabled) {
            Intent settingsIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(settingsIntent);
        }
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION,}, 1000);
            return;
        }
        mlocManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, (LocationListener) Local);
        mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, (LocationListener) Local);

        lat.setText("Localización agregada");
        direccion.setText("");
    }

    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode == 1000) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                locationStart();
                return;
            }
        }
    }

    public void setLocation(Location loc) {
        //Obtener la direccion de la calle a partir de la latitud y la longitud
        if (loc.getLatitude() != 0.0 && loc.getLongitude() != 0.0) {
            try {
                Geocoder geocoder = new Geocoder(this, Locale.getDefault());
                List<Address> list = geocoder.getFromLocation(
                        loc.getLatitude(), loc.getLongitude(), 1);
                if (!list.isEmpty()) {
                    Address DirCalle = list.get(0);
                    direccion.setText(DirCalle.getAddressLine(0));
                }

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    /* Aqui empieza la Clase Localizacion */
    public class Localizacion implements LocationListener {
        MainActivity mainActivity;

        public MainActivity getMainActivity() {
            return mainActivity;
        }

        public void setMainActivity(MainActivity mainActivity) {
            this.mainActivity = mainActivity;
        }

        @Override
        public void onLocationChanged(Location loc) {
            // Este metodo se ejecuta cada vez que el GPS recibe nuevas coordenadas
            // debido a la deteccion de un cambio de ubicacion

            loc.getLatitude();
            loc.getLongitude();

            String Text1 = String.valueOf(loc.getLatitude());
            String Text2 = String.valueOf(loc.getLongitude());
            lat.setText(Text1);
            lon.setText(Text2);
            this.mainActivity.setLocation(loc);
        }

        @Override
        public void onProviderDisabled(String provider) {
            // Este metodo se ejecuta cuando el GPS es desactivado
            lat.setText("GPS Desactivado");
        }

        @Override
        public void onProviderEnabled(String provider) {
            // Este metodo se ejecuta cuando el GPS es activado
            lat.setText("GPS Activado");
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            switch (status) {
                case LocationProvider.AVAILABLE:
                    Log.d("debug", "LocationProvider.AVAILABLE");
                    break;
                case LocationProvider.OUT_OF_SERVICE:
                    Log.d("debug", "LocationProvider.OUT_OF_SERVICE");
                    break;
                case LocationProvider.TEMPORARILY_UNAVAILABLE:
                    Log.d("debug", "LocationProvider.TEMPORARILY_UNAVAILABLE");
                    break;
            }
        }
    }

    public void guardarGps(){
        RequestQueue queue = Volley.newRequestQueue(MainActivity.this);

        
        StringRequest stringRequest = new StringRequest(Request.Method.POST, Http.URL_WEB_SERVICE + "registrar-gps.php",
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try {
                            JSONObject objResultado = new JSONObject(response);

                            String estadox = objResultado.get("estado").toString();
                            if(!estadox.contains("exito")){
                                //  if(!response.equalsIgnoreCase("exito")){
                                Toast.makeText(MainActivity.this, "Hubo un error", Toast.LENGTH_LONG).show();

                            }else{
                                Toast.makeText(MainActivity.this, "Coordenadas Registradas", Toast.LENGTH_LONG).show();

                            }

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError  error) {
                Toast.makeText(MainActivity.this, "Invalid conexion", Toast.LENGTH_LONG).show();
            }
        }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> params = new HashMap<>();
                params.put("direccion", direccion.getText().toString().trim());
                params.put("lat",lat.getText().toString().trim());
                params.put("lon",lon.getText().toString().trim());
                return params;
            }
        };

        queue.add(stringRequest);
    }


}

De todas formas te dejo la aplicación si requieres descargarla:

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

WhatsApp chat