Saltar a contenido

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:

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\"")

    }
En el directorio base del proyecto incluir el fichero 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"
Este fichero se añade a .gitignore

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)
    }
}
Para poder usar 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.

  1. Usar un Intent para Capturar la Foto: Configura un Intent para tomar una foto y especifica el archivo donde debe guardarse la imagen.

  2. 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
En la version actual application.yml no se usa. en la configuración "bootjar" que luego usaremos para crear la imagen de compose añadimos la variable de entorno:

SPRING_PROFILES_ACTIVE=prod
En 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
Desde portainer se puede exportar e importar Cuando se importa una nueva imagen, con misma etiqueta, se sustituye la vieja imagen

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)