Java tutorial
package com.ajncespedes.puntogpsqr; /** *Copyright (C) 2016 Antonio Jos Navarro Cspedes y Miguel ?ngel Valenzuela Hidalgo *This program is free software: you can redistribute it and/or modify *it under the terms of the GNU General Public License as published by *the Free Software Foundation, either version 3 of the License, or *(at your option) any later version. *This program is distributed in the hope that it will be useful, *but WITHOUT ANY WARRANTY; without even the implied warranty of *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *GNU General Public License for more details. *You should have received a copy of the GNU General Public License *along with this program. If not, see <http://www.gnu.org/licenses/> * * @author Antonio Jos Navarro Cspedes * @author Miguel ?ngel Valenzuela Hidalgo * @version 10.02.2016 * Reconoce un punto GPS codificado como cdigo QR y nos muestra en un mapa la marca de ese objetivo al cual podemos ir * obteniendo nuestra propia localizacin, recibiendo notificaciones de distancia en Android Wear */ import android.app.Notification; import android.content.Intent; import android.location.Location; import android.os.Bundle; import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationManagerCompat; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.Toast; import com.google.android.gms.maps.CameraUpdate; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.MapFragment; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; /** * @class MainActivity * Clase principal de la aplicacin */ public class MapsActivity extends AppCompatActivity implements GoogleMap.OnMyLocationChangeListener { private GoogleMap mMap; private CameraUpdate mCamera; private Button botonQR; private double longitud, latitud; private Location destino; private boolean llegada = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_maps); destino = new Location("Destino"); mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.mapview)).getMap(); //Establecemos el mapa de tipo satlite mMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE); //Declaramos el botn que inicia el lector de QR botonQR = (Button) findViewById(R.id.buttonQR); botonQR.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getCoordenadas(); } }); } /** * Mtodo para obtener las coordenadas mediante el lector de QR */ private void getCoordenadas() { //Lanzamos la app del lector try { Intent intent = new Intent("com.google.zxing.client.android.SCAN"); intent.putExtra("SCAN_MODE", "QR_CODE_MODE"); startActivityForResult(intent, 1); } catch (Exception e) { Toast.makeText(this, "Debes tener instalada una app de lectura de QR!", Toast.LENGTH_SHORT).show(); } } /** * Retorna la lectura del lector QR y la traduce a longitud/latitud * */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 0) { if (resultCode == RESULT_OK) { getCoordenadas(); } if (resultCode == RESULT_CANCELED) { // handle cancel } } else if (requestCode == 1) { if (resultCode == RESULT_OK) { String resultado = data.getStringExtra("SCAN_RESULT"); Toast.makeText(this, resultado, Toast.LENGTH_SHORT).show(); String[] palabras = resultado.split("_"); latitud = Double.parseDouble(palabras[1]); longitud = Double.parseDouble(palabras[3]); onMapReady(); } if (resultCode == RESULT_CANCELED) { // handle cancel } } } /** * Si el mapa est listo, creamos el destino del cdigo QR y nos movemos hacia l */ public void onMapReady() { try { mMap.setMyLocationEnabled(true); } catch (SecurityException e) { } mMap.setOnMyLocationChangeListener(this); //Aadimos el lugar obtenido LatLng lugar = new LatLng(latitud, longitud); //Convertimos el lugar a tipo Location destino.setLatitude(latitud); destino.setLongitude(longitud); //Aadimos la marca del lugar y acercamos/movemos la cmara hacia l mMap.addMarker(new MarkerOptions().position(lugar).title("Destino")); mMap.moveCamera(CameraUpdateFactory.newLatLng(lugar)); mCamera = CameraUpdateFactory.newLatLngZoom(lugar, 15); mMap.animateCamera(mCamera); } /** * Mtodo que detecta cambios en nuestra posicin actual y enva notificaciones que recibe android wear para obtener la distancia * hasta el objetivo y para avisarnos si hemos llegado. */ @Override public void onMyLocationChange(Location loc) { //Obtenemos la distancia desde nuestra posicin hasta el objetivo double distancia = Math.rint(loc.distanceTo(destino) * 10) / 10; //Mandamos el aviso de la distancia cada 10 metros if (distancia > 5 && distancia % 10 < 1) { String aviso = "Distancia " + distancia + " m"; Notification notificacion = new NotificationCompat.Builder(getApplication()) .setSmallIcon(R.mipmap.ic_launcher).setContentTitle("Aviso de Distancia").setContentText(aviso) .extend(new NotificationCompat.WearableExtender().setHintShowBackgroundOnly(true)) .setVibrate(new long[] { 0, 500 }).setSubText("Distancia hasta el objetivo").build(); NotificationManagerCompat notificationManager = NotificationManagerCompat.from(getApplication()); int notificacionId = 1; notificationManager.notify(notificacionId, notificacion); } else if (distancia < 5) { //Si la distancia es menor que 5, consideramos que ya hemos llegado if (!llegada) { String aviso = "Ya hemos llegado al destino!"; Notification notificacion = new NotificationCompat.Builder(getApplication()) .setSmallIcon(R.mipmap.ic_launcher).setContentTitle("Aviso de llegada") .setContentText(aviso) .extend(new NotificationCompat.WearableExtender().setHintShowBackgroundOnly(true)) .setVibrate(new long[] { 0, 1000, 1000 }).setSubText("Distancia hasta el objetivo").build(); NotificationManagerCompat notificationManager = NotificationManagerCompat.from(getApplication()); int notificacionId = 1; notificationManager.notify(notificacionId, notificacion); llegada = true; } } } }