Fichero AndroidManifest.xml
1 2 3 4 |
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> |
Código completo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
package com.example.myapplication import android.os.Bundle import android.os.Environment import android.widget.Toast import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import com.example.myapplication.ui.theme.MyApplicationTheme import java.io.File import java.io.FileOutputStream import java.io.OutputStreamWriter import java.time.LocalDateTime import android.annotation.SuppressLint import android.content.pm.PackageManager import androidx.compose.foundation.layout.* import androidx.compose.material3.Button import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.* import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import com.google.android.gms.location.FusedLocationProviderClient import com.google.android.gms.location.LocationServices class MainActivity : ComponentActivity() { private lateinit var fusedLocationClient: FusedLocationProviderClient override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) fusedLocationClient = LocationServices.getFusedLocationProviderClient(this) setContent { MyApplicationTheme { Surface( modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background ) { SaveTextToFile("ejemplo.txt") } } } } @Composable fun SaveTextToFile(nombreArchivo: String) { var locationText by remember { mutableStateOf("Press the button to get location") } Column( modifier = Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { Button( onClick = { if (checkLocationPermission()) { // Obtiene la ubicación si se tienen los permisos getLocation { result -> result?.let { // Actualiza el texto con la latitud y longitud val latitude = it.latitude val longitude = it.longitude val datetime = LocalDateTime.now().toString() locationText = "Fecha: $datetime Latitude: $latitude Longitude: $longitude" guardarTextoEnArchivo(locationText,"cordenadas.txt") } ?: run { locationText = "Unable to fetch location" } } } else { // Solicita permisos de ubicación si no se tienen requestPermission() } } ) { Text("Agregar al archivo") } } } private fun guardarTextoEnArchivo(texto: String, nombreArchivo: String) { val estadoAlmacenamiento = Environment.getExternalStorageState() if (estadoAlmacenamiento == Environment.MEDIA_MOUNTED) { val directorio = getFilesDir() val archivo = File(directorio, nombreArchivo) try { val flujoSalida = FileOutputStream(archivo, true) val writer = OutputStreamWriter(flujoSalida) writer.append(texto) writer.append("\n") writer.close() Toast.makeText(this, "Texto añadido en $directorio $nombreArchivo", Toast.LENGTH_SHORT).show() } catch (e: Exception) { e.printStackTrace() Toast.makeText(this, "Error al guardar el archivo", Toast.LENGTH_SHORT).show() } } else { Toast.makeText(this, "No se pudo acceder al almacenamiento externo", Toast.LENGTH_SHORT).show() } } // Función para obtener la ubicación actual @SuppressLint("MissingPermission") private fun getLocation(callback: (android.location.Location?) -> Unit) { fusedLocationClient.lastLocation .addOnSuccessListener { location -> callback(location) } .addOnFailureListener { callback(null) } } // Función para verificar los permisos de ubicación private fun checkLocationPermission(): Boolean { return ContextCompat.checkSelfPermission( this, android.Manifest.permission.ACCESS_FINE_LOCATION ) == PackageManager.PERMISSION_GRANTED } private val LOCATION_PERMISSION_REQUEST_CODE = 1001 // Función para solicitar permisos de ubicación private fun requestPermission() { ActivityCompat.requestPermissions( this, arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION), LOCATION_PERMISSION_REQUEST_CODE ) } } |