0% encontró este documento útil (0 votos)
118 vistas23 páginas

Examen de Progrmacion Mobile

Este documento presenta un examen sobre programación móvil. Instruye a los estudiantes para que desarrollen una aplicación Android que permita planificar vacaciones, incluyendo la visualización de lugares en un mapa, agregar fotos, almacenar datos en una base de datos y mostrar costos en dólares usando un servicio web. También especifica requisitos como soporte para múltiples idiomas e interfaces de usuario. Los estudiantes deben documentar y entregar el código de la aplicación.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
118 vistas23 páginas

Examen de Progrmacion Mobile

Este documento presenta un examen sobre programación móvil. Instruye a los estudiantes para que desarrollen una aplicación Android que permita planificar vacaciones, incluyendo la visualización de lugares en un mapa, agregar fotos, almacenar datos en una base de datos y mostrar costos en dólares usando un servicio web. También especifica requisitos como soporte para múltiples idiomas e interfaces de usuario. Los estudiantes deben documentar y entregar el código de la aplicación.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

ESCUELA DE INFORMÁTICA Y TELECOMUNICACIONES

EXAMEN / Programación Mobile

www.iplacex.cl
1
ESCUELA DE INFORMÁTICA Y TELECOMUNICACIONES

Aprendizaje Esperado
En esta actividad logrará poner en práctica los conocimientos adquiridos durante
toda la asignatura para construir aplicaciones para Android usando Android Studio,
Kotlin, SQLite, Jetpack Compose y/o Vistas XML, la cámara y otros sensores del
teléfono.

INSTRUCCIONES GENERALES

Una vez realizada la lectura comprensiva de los materiales de estudio, es


fundamental la realización de este examen, el que tiene por objetivo medir la
correcta internalización y aplicación de los conceptos abordados.

El desarrollo de este trabajo es individual, no se permitirán entregas de talleres en


duplas o en grupos

CONTENIDOS ASOCIADOS AL EXAMEN:

 Interfaces de usuario usando Compose o Vistas XML


 Listas dinámicas (LazyColumn o RecyclerView)
 Persistencia en SQLite (ROOM o SQLiteOpenHelper)
 Consumo de Servicios Web
 Geolocalización y uso de la Cámara

Esta actividad se
complementa con
una pauta de
autoevaluación al
finalizar, para que
verifiques el logro
de tus aprendizajes

www.iplacex.cl
2
ESCUELA DE INFORMÁTICA Y TELECOMUNICACIONES

INSTRUCCIONES ESPECÍFICAS

1. Cree las interfaces de usuario usando Compose o Vistas XML

2. A través de recursos permita que la aplicación sea multilenguaje. Los textos


estáticos y textos de los botones deben estar traducidos al español y al
inglés

3. Permita que su aplicación persista en SQLite los datos correspondientes del


caso, utilice ROOM o SQLiteOpenHelper

4. Utilice Corrutinas para la programación asincrónica evitando bloquear la UI

5. Asegúrese de solicitar los permisos correspondientes ya sea a nivel de


instalación o en tiempo de ejecución

6. Utilice los Web Services indicados para recuperar información desde


internet

7. Aproveche la cámara y geolocalización para enriquecer las características


de la aplicación solicitada

8. Documente el proceso realizado y suba a la plataforma lo desarrollado


como se indica a continuación

Se solicita:

1. Resolver el caso detallado a continuación

2. Documentar el proceso realizado explicando los pasos realizados y la lógica aplicada


en un documento de Word (Fragmentos de código + Explicaciones)

3. Colocar enlace del código fuente del proyecto realizado ojalá en Github (o si no puede
ser en Dropbox, Onedrive, Google Drive o similar)

4. Subir docx o doc a la plataforma (NO archivo comprimido)

www.iplacex.cl
3
ESCUELA DE INFORMÁTICA Y TELECOMUNICACIONES

Caso: App Vacaciones


Descripción del ejercicio:

En este caso, los alumnos deberán desarrollar una aplicación para dispositivos
Android que permita a los usuarios planificar sus vacaciones de manera eficiente.
La aplicación deberá incluir características como la planificación de lugares a
visitar en orden, la visualización de ubicaciones en un mapa utilizando osmdroid,
la capacidad de agregar imágenes de referencia, tomar fotografías desde la
aplicación, y la persistencia de datos en SQLite. Además, se debe integrar un
servicio web para mostrar los costos en dólares en lugar de moneda local
(originalmente en CLP).

Requisitos Específicos:

1. Planificación de Lugares: Los usuarios deben poder agregar lugares que


desean visitar en su viaje. Cada lugar debe incluir información como el
nombre del lugar, el orden de visita, una URL con una imagen de referencia
del lugar (que se mostrará utilizando Coil), la latitud y longitud del lugar, el
costo de alojamiento y el costo de transporte (si es aplicable), así como
comentarios adicionales.

2. Visualización de Mapa: La aplicación debe utilizar el mapa de osmdroid


para mostrar los lugares planificados y colocar marcadores en el mapa para
cada ubicación.

3. Agregar Fotos desde la Aplicación: Los usuarios deben poder tomar al


menos una fotografía desde la aplicación para cada lugar que visiten. Las
fotos deben estar vinculadas al lugar correspondiente.

4. Persistencia de Datos: Todos los datos relacionados con los lugares, las
imágenes de referencia y las fotografías tomadas deben ser almacenados
en una base de datos SQLite en el dispositivo del usuario (para las
imágenes almacenar sus URIs).

5. Integración de Web Service: La aplicación debe consumir un servicio web


para obtener la tasa de cambio actual entre la moneda local (originalmente
en CLP) y el dólar estadounidense. Esto se utilizará para mostrar los costos
en dólares. Si no conoce ninguna, puede utilizar https://mindicador.cl/api

6. Multilenguaje: La aplicación debe soportar y estar traducida al inglés y al


español (botones y textos estáticos).

www.iplacex.cl
4
ESCUELA DE INFORMÁTICA Y TELECOMUNICACIONES

7. Interfaz de Usuario: Construya a lo menos 3 pantallas: una para el listado


de lugares, una para ver en detalle los datos del lugar y otra para editar los
datos del lugar.

Figura 1 JSON con dólar observado desde API https//mindicador.cl/api

A continuación, imágenes referenciales (no es necesario que sean iguales) de la


solución esperada:

www.iplacex.cl
5
ESCUELA DE INFORMÁTICA Y TELECOMUNICACIONES

Figura 2 Vista con lista ordenada de lugares Figura 3 Vista detalle lugar

www.iplacex.cl
6
ESCUELA DE INFORMÁTICA Y TELECOMUNICACIONES

Figura 4 Ejemplo de formulario

www.iplacex.cl
7
ESCUELA DE INFORMÁTICA Y TELECOMUNICACIONES

Información Importante
Esta actividad será evaluada por el profesor de la asignatura,
por lo que se sugiere, para su realización, considerar los
Criterios de Evaluación detallados al final de este documento.
El puntaje total de este taller es de 100 puntos, y el puntaje
mínimo de aprobación es de 60 puntos.

FORMALIDADES
Tipo de letra: Arial 12
Interlineado: 1,15
 Formato - Entrega del taller en archivo Word, que lleve como nombre:
SuNombre_SuApellido.
 Subir archivo a la plataforma

www.iplacex.cl
8
ESCUELA DE INFORMÁTICA Y TELECOMUNICACIONES

Pauta de Evaluación
Criterios de Evaluación Indicadores de Logro Puntaje

Crea al menos 3 recursos de texto en 5


inglés y español. Posteriormente los
consume
Utiliza correctamente listas dinámicas 5
Diseño de Interfaz de Usuario (RecyclerView o LazyColumn)
Utiliza recursos gráficos como drawables o 5
íconos para hacer la UI más amigable
Crea las pantallas necesarias para 5
solucionar el caso
Crea correctamente una data class para 5
ROOM o clase para DTO si utiliza la API de
SQLite directamente
Utiliza Corrutinas para evitar bloquear la UI 5
Persistencia de datos cuando corresponde
relevantes Crea correctamente un método para 5
conseguir los datos ordenados desde la BD
Crea correctamente un método para 5
eliminar un registro de la BD
Carga imagen externa a través de URL 5
usando librería Coil
Configura correctamente la clase para 10
Consumo de Recursos y
mapear datos y la interfaz del servicio
Servicios Web
(Retrofit)
Consume correctamente los datos desde el 5
web service
Muestra un mapa en base a latitud y 5
longitud entregada por el usuario usando
osmdroid
Solicita los permisos correspondientes para 10
Geolocalización y Cámara hacer funcionar la geolocalización y los
mapas
Captura fotografías usando CameraX o 5
solicitud a app externa
Entrega en los plazos y forma (archivo 5
Documentación y Buenas docx) con enlace a código fuente
Prácticas Documenta el proceso realizado para 10

www.iplacex.cl
9
ESCUELA DE INFORMÁTICA Y TELECOMUNICACIONES

solucionar el problema. Explica los


fragmentos de código más relevantes de
manera clara
El código está ordenado, utiliza 5
comentarios explicativos, utiliza nombres
de variables y funciones significativos.

Puntaje Total 100

www.iplacex.cl
10
ESCUELA DE INFORMÁTICA Y TELECOMUNICACIONES

Pauta de Autoevaluación:
A continuación, te invitamos a responder una pauta de autoevaluación, para
que verifiques lo aprendido en esta actividad y el logro del o los objetivos
planteados inicialmente. Recuerda, en caso de presentar dudas, debes
participar de forma permanente en los foros, donde el docente te
retroalimentará y dará respuesta a tus inquietudes.

Criterios de revisión del Completamente Medianamente Parcialmente No


informe con la información logrado logrado logrado logrado
recopilada: (4) (3) (2) (0)

1. Utilicé correctamente los


recursos de texto para hacer mi
app multilenguaje

2. Utilicé recursos gráficos para


hacer la interfaz más amigable
y entendible

3. Codifiqué todos los métodos


necesarios para recuperar,
crear, editar y eliminar registros
desde la BD

4. Utilicé correctamente Corrutinas


para no bloquear la interfaz del
dispositivo cuando era
necesario
5. Utilicé correctamente las listas
dinámicas para mostrar los
listados de información
6. Capturé fotografías
correctamente hacia un archivo
7. Mostré mapas en base a
coordenadas y coloqué un
marcador en el punto correcto
8. Consumí un servicio web usando
Retrofit para realizar los cálculos
solicitados

Puntaje Total 32 puntos

www.iplacex.cl
11
ESCUELA DE INFORMÁTICA Y TELECOMUNICACIONES

Puntaje Obtenido XX Puntos obtenidos

www.iplacex.cl
12
ESCUELA DE INFORMÁTICA Y TELECOMUNICACIONES

DESARROLLO

Antes de desarrollar el examen debo decir que no me ha corrido el programa


Android studio, lo instalé y desinstalé varias veces dándome como resultado que
no me corre, agrego los comandos que copio y creo pero al final al momento de
ver el resultado final solo me arroja error o queda cargando, le pido disculpas.
También ocupe el mismo desarrollo de la prueba anterior ya que eran similare en
lo pedido.

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera.any"
android:required="true"/>
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION"/>

<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.ExamenPm"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true"
android:label="@string/app_name"
android:theme="@style/Theme.Trabajo22">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

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

www.iplacex.cl
13
ESCUELA DE INFORMÁTICA Y TELECOMUNICACIONES

</manifest>

MainActivity.KT

package com.example.examenpm

import androidx.compose.runtime.Composable
import androidx.lifecycle.viewmodel.compose.viewModel
import android.Manifest
import androidx.lifecycle.viewmodel.compose.viewModel
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.location.Location
import android.net.Uri
import android.os.Bundle
import android.os.Environment
import android.provider.MediaStore
import android.util.Log
import android.widget.Button
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.height
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.*
import androidx.compose.runtime.R
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView
import androidx.core.content.ContextCompat
import androidx.core.content.FileProvider
import com.google.android.gms.location.LocationServices
import com.google.android.gms.location.Priority
import org.osmdroid.config.Configuration
import org.osmdroid.tileprovider.tilesource.TileSourceFactory
import org.osmdroid.util.GeoPoint
import org.osmdroid.views.MapView
import org.osmdroid.views.overlay.Marker
import java.io.File
import java.text.SimpleDateFormat
import java.util.*
import androidx.lifecycle.ViewModel
import kotlinx.coroutines.flow.internal.NoOpContinuation.context
import java.io.IOException
import kotlin.coroutines.jvm.internal.CompletedContinuation.context

class MainActivity : ComponentActivity() {

www.iplacex.cl
14
ESCUELA DE INFORMÁTICA Y TELECOMUNICACIONES

private lateinit var mapView: MapView


private var currentPhotoPath: String? = null

private val takePictureLauncher =


registerForActivityResult(ActivityResultContracts.StartActivityForResult(
)) { result ->
if (result.resultCode == RESULT_OK) {
currentPhotoPath?.let { path ->
Toast.makeText(this, "Foto guardada en: $path",
Toast.LENGTH_SHORT).show()
}
}
}

override fun onCreate(savedInstanceState: Bundle?) {


super.onCreate(savedInstanceState)

val ctx = applicationContext


Configuration.getInstance().load(ctx,
getSharedPreferences("osmdroid", 0))
setContentView(R.layout.activity_main)
mapView = findViewById(R.id.mapView)

mapView.setTileSource(org.osmdroid.tileprovider.tilesource.TileSourceFact
ory.MAPNIK)
setupMapAndMarkers()

val btnTakePhoto = findViewById<Button>(R.id.btnTakePhoto)


btnTakePhoto.setOnClickListener {
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(arrayOf(Manifest.permission.CAMERA),
CAMERA_PERMISSION_REQUEST_CODE)
} else {
dispatchTakePictureIntent()
}
}
}

private fun setupMapAndMarkers() {


val lugarVisitado = obtenerLugarVisitado()
for (lugar in lugarVisitado) {
val geoPoint = GeoPoint(lugar.latitud, lugar.longitud)
val marker = Marker(mapView)
marker.position = geoPoint
marker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM)
marker.title = lugar.nombre
mapView.overlays.add(marker)
}
}

private fun dispatchTakePictureIntent() {


Intent(MediaStore.ACTION_IMAGE_CAPTURE).also { takePictureIntent
->

www.iplacex.cl
15
ESCUELA DE INFORMÁTICA Y TELECOMUNICACIONES

takePictureIntent.resolveActivity(packageManager)?.also {
val photoFile: File? = try {
createImageFile()
} catch (ex: IOException) {
null
}
photoFile?.also {
val photoURI: Uri = FileProvider.getUriForFile(
this,
"$packageName.fileprovider",
it
)
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
photoURI)
takePictureLauncher.launch(takePictureIntent)
}
}
}
}

private fun createImageFile(): File {


val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss",
Locale.getDefault()).format(Date())
val storageDir: File? = getExternalFilesDir(null)
return File.createTempFile(
"JPEG_${timeStamp}_",
".jpg",
storageDir
).apply {
currentPhotoPath = absolutePath
}
}

private fun obtenerLugarVisitado(): List<Lugar> {


return obtenerLugarVisitado()
}

override fun onRequestPermissionsResult(requestCode: Int,


permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions,
grantResults)
if (requestCode == CAMERA_PERMISSION_REQUEST_CODE) {
if (grantResults.isNotEmpty() && grantResults[0] ==
PackageManager.PERMISSION_GRANTED) {
dispatchTakePictureIntent()
} else {
Toast.makeText(this, "Permiso negado",
Toast.LENGTH_SHORT).show()
}
}
}

companion object {
private const val CAMERA_PERMISSION_REQUEST_CODE = 101
}
}

www.iplacex.cl
16
ESCUELA DE INFORMÁTICA Y TELECOMUNICACIONES

ExchangeRateResponse.KT

package com.example.examenpm

import com.google.gson.annotations.SerializedName

data class ExchangeRateResponse(


val fecha: String,
val nombre: String,
@SerializedName("unidad_medida")
val unidadMedida: String,
val codigo: String,
@SerializedName("unidad_medida_cod")
val unidadMedidaCod: String,
val valor: Double
)

Lugaraccesodato.KT

package com.example.examenpm

import androidx.lifecycle.LiveData
import androidx.room.*

@Dao
interface Lugaraccesodatos {
@Query("SELECT * FROM lugares")
fun getAll(): LiveData<List<LugarEntity>>

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(lugar: LugarEntity)

@Update
suspend fun update(lugar: LugarEntity)

@Delete
suspend fun delete(lugar: LugarEntity)

@Query("DELETE FROM lugares")


suspend fun deleteAll()
}

LugarRoomDatabase.KT

package com.example.examenpm
import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase

@Database(entities = [LugarEntity::class], version = 1, exportSchema =


false)
abstract class AppDatabase : RoomDatabase() {
abstract fun lugaraccesodatos(): Lugaraccesodatos

www.iplacex.cl
17
ESCUELA DE INFORMÁTICA Y TELECOMUNICACIONES

companion object {
@Volatile
private var INSTANCE: AppDatabase? = null

fun getDatabase(context: Context): AppDatabase {


return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
"app_database"
).build()
INSTANCE = instance
instance
}
}
}
}

Lugar.KT

package com.example.examenpm

data class Lugar(


val nombre: String,
val ordenVisita: Int,
val urlImagen: String,
val latitud: Double,
val longitud: Double,
val costoAlojamiento: Double,
val costoTransporte: Double,
val comentarios: String
)

LugarEntity.KT

package com.example.examenpm

import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "lugares")
data class LugarEntity(
@PrimaryKey(autoGenerate = true) val id: Long = 0,
val nombre: String,
val ordenVisita: Int,
val urlImagen: String,
val latitud: Double,
val longitud: Double,
val costoAlojamiento: Double,
val costoTransporte: Double,
val comentarios: String
)

www.iplacex.cl
18
ESCUELA DE INFORMÁTICA Y TELECOMUNICACIONES

build.gradle.KTS

import org.jetbrains.kotlin.kapt3.base.Kapt.kapt

plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
}

android {
namespace = "com.example.exmamenpm"
compileSdk = 34

defaultConfig {
applicationId = "com.example.examenpm"
minSdk = 34
targetSdk = 34
versionCode = 1
versionName = "1.0"

testInstrumentationRunner =
"androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary = true
}
}

buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
buildFeatures {
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = "1.4.3"
}
packaging {

www.iplacex.cl
19
ESCUELA DE INFORMÁTICA Y TELECOMUNICACIONES

resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
}
}
}

dependencies {

implementation("androidx.core:core-ktx:1.9.0")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.2")
implementation("androidx.activity:activity-compose:1.8.1")
implementation(platform("androidx.compose:compose-bom:2023.03.00"))
implementation("androidx.compose.ui:ui")
implementation("androidx.compose.ui:ui-graphics")
implementation("androidx.compose.ui:ui-tooling-preview")
implementation("androidx.compose.material3:material3")
implementation("androidx.room:room-common:2.6.0")
implementation("androidx.room:room-ktx:2.6.0")
implementation("androidx.appcompat:appcompat:1.6.1")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-
core:3.5.1")
androidTestImplementation(platform("androidx.compose:compose-
bom:2023.03.00"))
androidTestImplementation("androidx.compose.ui:ui-test-junit4")
debugImplementation("androidx.compose.ui:ui-tooling")
debugImplementation("androidx.compose.ui:ui-test-manifest")

implementation("androidx.lifecycle:lifecycle-viewmodel-
compose:2.6.1")

// CameraX
val camerax_version = "1.2.3"
implementation("androidx.camera:camera-core:${camerax_version}")
implementation("androidx.camera:camera-camera2:${camerax_version}")
implementation("androidx.camera:camera-view:${camerax_version}")
implementation("androidx.camera:camera-lifecycle:${camerax_version}")
implementation ("com.squareup.retrofit2:retrofit:2.9.0")
implementation ("com.squareup.retrofit2:converter-gson:2.9.0")
implementation ("com.google.code.gson:gson:2.8.8")
implementation ("org.jetbrains.kotlinx:kotlinx-coroutines-
android:1.5.2")
implementation("com.google.android.gms:play-services-
location:21.0.1")
implementation("org.osmdroid:osmdroid-android:6.1.16")
implementation ("com.squareup.retrofit2:retrofit:2.9.0")
implementation ("com.squareup.retrofit2:converter-gson:2.9.0")
implementation ("com.google.dagger:hilt-android:2.39.1")

activity_main.xml

www.iplacex.cl
20
ESCUELA DE INFORMÁTICA Y TELECOMUNICACIONES

<?xml version="1.0" encoding="utf-8"?>


<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<!-- MapView mostrar el mapa -->

<!-- Botón activar la cámara -->

<org.osmdroid.views.MapView
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent" />

<Button
android:id="@+id/btnTakePhoto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="34dp"
android:text="Foto" />

</RelativeLa

Activity_main_lugar.xml

<?xml version="1.0" encoding="utf-8"?>


<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="60dp">

<TableRow
android:layout_width="380dp"
android:layout_height="37dp">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingEnd="8dp"
android:text="Nombre:"
android:textStyle="bold" />

<TextView
android:id="@+id/textViewNombre"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</TableRow>

<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView
android:layout_width="wrap_content"

www.iplacex.cl
21
ESCUELA DE INFORMÁTICA Y TELECOMUNICACIONES

android:layout_height="wrap_content"
android:text="Orden de visita:"
android:textStyle="bold"
android:paddingEnd="8dp" />

<TextView
android:id="@+id/textViewOrdenVisita"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</TableRow><TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="URL Imagen:"
android:textStyle="bold"
android:paddingEnd="8dp" />

<TextView
android:id="@+id/textViewUrlImagen"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</TableRow>

<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Latitud:"
android:textStyle="bold"
android:paddingEnd="8dp" />

<TextView
android:id="@+id/textViewLatitud"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</TableRow>

<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Longitud:"
android:textStyle="bold"
android:paddingEnd="8dp" />

<TextView
android:id="@+id/textViewLongitud"
android:layout_width="wrap_content"

www.iplacex.cl
22
ESCUELA DE INFORMÁTICA Y TELECOMUNICACIONES

android:layout_height="wrap_content" />
</TableRow>

<!—Se Repite con : urlImagen, latitud, longitud -->

</TableLayout>

www.iplacex.cl
23

También podría gustarte