124. Recortes para proyecto Portes¶
124.1 Autocompletado de direcciones con Google Maps Places.¶
Autocompletar las direcciones de origen y destino. Para esto se usar google Places
Enaces Principales:
- Documentación Google Place Autocomplete
- Repositorio de ejemplo en Github
https://github.com/googlemaps/android-places-ktx/tree/main/app/src/main/java/com/google/places/android/ktx/demo
Puedes agregar el autocompletado a tu aplicación de las siguientes formas:
- Agrega un widget de autocompletado para ahorrar tiempo de desarrollo y garantizar una experiencia del usuario coherente.
- Obtén predicciones de lugares de manera programática para crear una experiencia del usuario personalizada. Que vemos a continuación
124.2 Autocompletado de manera programática.¶
Tu app puede obtener una lista de nombres de lugares o direcciones previstos de la API de autocompletado llamando a PlacesClient.findAutocompletePredictions() y pasando un objeto FindAutocompletePredictionsRequhttps://developers.google.com/maps/documentation/places/android-sdk/reference/com/google/android/libraries/places/api/net/FindAutocompletePredictionsRequest?hl=es-419est con los siguientes parámetros:
- Obligatorio: Una cadena query que contiene el texto que ingresó el usuario
- Recomendación: Es un objeto AutocompleteSessionToken, que agrupa las fases de consulta y selección de la búsqueda de un usuario en una sesión discreta para fines de facturación. La sesión comienza cuando el usuario comienza a escribir una consulta y finaliza cuando selecciona un lugar.
- Recomendado: Un objeto RectangularBounds, que especifica los límites de latitud y longitud para restringir los resultados a la región especificada.
- Opcional: Uno o más códigos de país de dos letras (ISO 3166-1 alfa-2), que indican el país o los países a los que se deben restringir los resultados.
- Opcional: Es un objeto TypeFilter, que puedes usar para restringir los resultados al tipo de lugar especificado. Se admiten los siguientes tipos de lugares:
- TypeFilter.GEOCODE: Muestra solo resultados de geocodificación, en lugar de empresas. Usa esta solicitud para desambiguar los resultados en los que la ubicación especificada puede ser indeterminada.
- TypeFilter.ADDRESS: muestra solo resultados de autocompletado con una dirección precisa. Usa este tipo cuando sepas que el usuario buscará una dirección especificada por completo.
- TypeFilter.ESTABLISHMENT: Muestra solo lugares correspondientes a empresas.
-
TypeFilter.REGIONS: muestra solo lugares que coinciden con uno de los siguientes tipos:
-
LOCALITY
- SUBLOCALITY
- POSTAL_CODE
- COUNTRY
- ADMINISTRATIVE_AREA_LEVEL_1
- ADMINISTRATIVE_AREA_LEVEL_2
-
TypeFilter.CITIES: muestra solo resultados que coinciden con LOCALITY o ADMINISTRATIVE_AREA_LEVEL_3.
-
Opcional: Un LatLng que especifique la ubicación de origen para la solicitud Cuando llamas a setOrigin(), el servicio muestra la distancia en metros (distanceMeters) desde el origen especificado para cada predicción de autocompletado en la respuesta.
A continuación se describe el
124.3 Configuración Android Place para Kotlin¶
Documentación Places en kotlin
124.3.1 Configuración secretes¶
Para configurar secrects para la api key
En build.gradle.kts
del módulo
import java.util.Properties
defaultConfig {
applicationId = "eu.vikas.cargomap"
minSdk = 26
targetSdk = 34
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary = true
}
val properties = Properties()
file("../secrets.properties").inputStream().use {
properties.load(it)
}
val apiKey = properties.getProperty("MAPS_API_KEY") ?: "No API Key"
buildConfigField("String", "MAPS_API_KEY", "\"$apiKey\"")
}
secrets.properties
con una linea:
MAPS_API_KEY="tu api key"
124.3.2 Configuración del Gradle del Proyecto (build.gradle.kts)¶
Habilitar servicios google
buildscript {
dependencies {
classpath("com.google.gms:google-services:4.4.1")
}
}
124.3.3 Configuración del Gradle del Módulo de la Aplicación (build.gradle.kts)¶
plugins {
id("com.android.application")
kotlin("android")
id("com.google.gms.google-services") version "4.3.10" apply true
}
dependencies {
implementation("com.google.android.gms:play-services-maps:18.2.0")
}
124.3.4 Configuración del Manifest¶
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!-- Remove ACCESS_FINE_LOCATION from the merged manifest since this sample does not use
`PlacesClient.findCurrentPlace()` -->
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION"
tools:node="remove" />
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION"
tools:node="remove" />
<application ...
124.4 Otras dependencias.¶
Navegacion, corrutinas.
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")
implementation("androidx.navigation:navigation-compose:2.7.6")
124.5 Registro de la aplicación en Google Cloud y Api Key maps y Places¶
124.6 API KEY protegida en fichero¶
Usamos el fichero secrets.properties
en el directorio raiz.
Este fichero contiene una línea:
MAPS_API_KEY="api key de maps"
Creamos una clase para la aplicación:
class CargoMapApp : Application() {
override fun onCreate() {
super.onCreate()
// Initialize the Places SDK. Note that the string value of `maps_api_key` will be generated
// at build-time (see app/build.gradle). The technique used here allows you to provide your
// API key such that the key is not checked in source control.
//
// See API Key Best Practices for more information on how to secure your API key:
// https://developers.google.com/maps/api-key-best-practices
Log.d("MIDEBUG", "API-KEY= " + BuildConfig.MAPS_API_KEY)
Places.initialize(this, BuildConfig.MAPS_API_KEY)
}
}
BuildCofig
en el fichero de gradle del módulo añadimos:
android {
namespace = "eu.vikas.cargomap"
compileSdk = 34
.....
val properties = Properties()
file("../secrets.properties").inputStream().use {
properties.load(it)
}
val apiKey = properties.getProperty("MAPS_API_KEY") ?: "No API Key"
buildConfigField("String", "MAPS_API_KEY", "\"$apiKey\"")
....
buildFeatures {
compose = true
buildConfig = true
}
}
124.7 Aplicación y Activity¶
124.8 Pantallas y ViewModel¶
124.9 Google Distance Matrix¶
Servicio para obtener la distancia entre dos direcciones
124.10 Sacar fotos y subirlas al servidor¶
En chatgpt
Usando un Intent de camara obtenermos una miniatura.
Pasos para Tomar una Foto de Alta Resolución
1. Crear un Archivo para la Foto: Primero, debes crear un archivo donde la cámara pueda guardar la imagen.
-
Usar un Intent para Capturar la Foto: Configura un Intent para tomar una foto y especifica el archivo donde debe guardarse la imagen.
-
Obtener la Imagen del Archivo: Después de que la imagen es capturada y guardada por la cámara, puedes acceder al archivo para obtener la foto de alta resolución.
Un ejemplos : * codelab * https://jakurudev.medium.com/camerax-jetpack-compose-ejemplo-usando-cameraprovider-y-cameracontroller-8b0a21fad29f * https://www.youtube.com/watch?v=XB3-bLeL-YQ&t=2s * Incrementar tamaño maximo de fotos subidas
124.10.1 Configuración¶
manifest.xml
Fichero file_path.xml
124.11 Visualizar fotos descargadas¶
Usamos la librería coil
124.12 Como usar fotos en la app transporte:¶
Ejemplo en Vehiculo.
124.13 Componentes Compose Material 3¶
124.13.1 DatePicker¶
Ver este ejemplo
124.14 Instalación con docker¶
124.14.1 Preparación de la imagen y docker-compose¶
. Vamos a crear una con mongodb, mongodb y transporter
En el proyecto hay tres ficheros:
application.yml
application-dev.yml
application-prod.yml
SPRING_PROFILES_ACTIVE=prod
application-prod.yml
esta configurado para producción:
server:
port: 8092
....
mongodb:
...
host: mongodb
file:
upload-dir: /home/asuarez/transporte/imagenes/
Dockerfile
Exportar imagen:
docker build -t nombre-de-tu-imagen:tag .
docker save -o nombre-de-tu-imagen.tar nombre-de-tu-imagen:tag
scp nombre-de-tu-imagen.tar usuario@servidor:/ruta/deseada
ssh usuario@servidor
docker load -i /ruta/deseada/nombre-de-tu-imagen.tar
PROTOTIPO TR.VIKAS.EU
página web anulada.
swagger funciona en : http://tr.vikas.eu/swagger-ui/index.html
mongodb express en : http://tr.vikas.eu:8086
124.14.2 Otras modificaciones para configuracion¶
Nginx tiene por defecto un valor máximo del body en upload. Para cambiarlo:
Abrir el archivo de configuración de Nginx: Normalmente, este archivo se encuentra en /etc/nginx/nginx.conf o en /etc/nginx/sites-available/ si estás utilizando configuraciones específicas para cada sitio.
Agregar o modificar la directiva client_max_body_size: Esta directiva define el tamaño máximo permitido para el cuerpo de una solicitud. Asegúrate de establecer esta directiva dentro del bloque http, server o location, dependiendo de tus necesidades específicas.
server {
...
client_max_body_size 15M;
...
}
124.15 Apendicie¶
Enlaces:
- Camara y guardar fotos: en Requisitos y RequisitosApp (rama utilbox)