Está en la página 1de 16

HERRAMIENTAS DE PROGRAMACIÓN MÓVIL

SEMANA 7

Milton López Castro


12 Diciembre del 2022
Programación y análisis de computadoras.
DESARROLLO
Imagina que eres contratado por E-Corp., como desarrollador experto en
aplicaciones móviles en Android, por lo cual se te ha solicitado el desarrollo de
una aplicación que sea capaz de identificar si un RUT es matemáticamente valido.
Para ello, es necesario que consideres los requerimientos descritos a
continuación.

- El nombre de la aplicación debe llevar tu nombre y apellido como nombre del


proyecto.

- La aplicación debe contar con una pantalla inicial que solicite el nombre de
usuario y contraseña (login) cuando se abra la aplicación nuevamente debe
mostrar el nombre de usuario sin solicitar dichos datos nuevamente.

- La validación del RUT debe ser contra la siguiente API


https://api.libreapi.cl/rut/validate?rut={rutavalidar} , ejemplo:

- https://api.libreapi.cl/rut/validate?rut=1k

- Muestra los datos obtenidos en forma de lista o como texto único.

A partir de los requerimientos mencionados anteriormente, completa las


actividades:

1. ¿Qué tipo de API seria la ideal, basada en XML o JSON? Fundamenta tu


elección.

2. Utiliza Async Task o hilos para realizar la llamada a la API, y explica el


funcionamiento en tu aplicación.

3. Utiliza Shared Preferences según requerimiento, y explica el funcionamiento en


tu aplicación.

Para completar y desarrollar las preguntas expuestas bajo el problema demostrado en la


semana siete, mostraremos el código bajo diferentes archivos dando a conocer la
creación de la aplicación móvil para verificar si un rut es válido y el funcionamiento de
esta app se demostrara como a continuación se detalla:
Código archivo activity_main.xml:

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


<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="Login "
android:textSize="20sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<EditText
android:id="@+id/txtUser"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:ems="10"
android:hint="Usuario"
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.502"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />

<EditText
android:id="@+id/txtPassword"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="36dp"
android:ems="10"
android:hint="Pass"
android:inputType="textPassword"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.502"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/txtUser" />

<Button
android:id="@+id/btnGuardar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:onClick="onClick"
android:text="Guardar"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/txtPassword" />

<Button
android:id="@+id/btnCargar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:text="Cargar"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btnGuardar" />

<TextView
android:id="@+id/campUser"
android:layout_width="142dp"
android:layout_height="53dp"
android:layout_marginTop="8dp"
android:textSize="20sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.059"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btnCargar" />

<TextView
android:id="@+id/campPass"
android:layout_width="142dp"
android:layout_height="49dp"
android:layout_marginTop="8dp"
android:textSize="20sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.059"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/campUser" />

<TextView
android:id="@+id/tvRut"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_marginTop="56dp"
android:textSize="24sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.495"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/campPass" />

</androidx.constraintlayout.widget.ConstraintLayout>
Visualización:

Archivo build.gradle:

plugins {
id 'com.android.application'
}

android {
namespace 'com.example.milton_lopez_control7'
compileSdk 32

defaultConfig {
applicationId "com.example.milton_lopez_control7"
minSdk 21
targetSdk 32
versionCode 1
versionName "1.0"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-
optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}

dependencies {

implementation 'androidx.appcompat:appcompat:1.5.1'
implementation 'com.google.android.material:material:1.7.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'com.android.volley:volley:1.2.1'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.4'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0'
}

Archivo 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.INTERNET" />


<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<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.Milton_Lopez_Control7"
tools:targetApi="31">
<activity
android:name=".ConsultaPreferencias"
android:exported="false">
<meta-data
android:name="android.app.lib_name"
android:value="" />
</activity>
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />


</intent-filter>

<meta-data
android:name="android.app.lib_name"
android:value="" />
</activity>
</application>

</manifest>

Archivo MainActivity.java:

package com.example.milton_lopez_control7;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONException;
import org.json.JSONObject;

public class MainActivity extends AppCompatActivity {

private RequestQueue queue;


private TextView miTextView;
EditText campoUsuario, campoPass;
TextView txtUsuario, txtPass;

@SuppressLint("MissingInflatedId")
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

miTextView = findViewById(R.id.tvRut);
queue = Volley.newRequestQueue(this);
obtenerDatosVolley();

campoUsuario= (EditText) findViewById(R.id.txtUser);


campoPass= (EditText) findViewById(R.id.txtPassword);
txtUsuario= (TextView) findViewById(R.id.campUser);
txtPass= (TextView) findViewById(R.id.campPass);

cargarPreferencias();

private void obtenerDatosVolley(){

String url = "https://api.libreapi.cl/rut/validate?rut=18370965-8";


JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET,
url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {

try {
JSONObject mJsonObjects =
response.getJSONObject("data");
String rut =mJsonObjects.getString("rut");

miTextView.setText(rut);
Toast.makeText(MainActivity.this, "Rut:"+ rut,
Toast.LENGTH_SHORT).show();

} catch (JSONException ex) {

ex.printStackTrace();

}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {

}
});

queue.add(request);

public void onClick(View view){


switch (view.getId()){
case R.id.btnGuardar:
guardarPreferencias();
break;
}
}
private void cargarPreferencias() {
SharedPreferences preferences= getSharedPreferences("Credenciales",
Context.MODE_PRIVATE);

String user = preferences.getString("user", "No existe la


información");
String pass = preferences.getString("pass", "No existe la
información");

txtUsuario.setText(user);
txtPass.setText(pass);
}

private void guardarPreferencias() {


SharedPreferences preferences= getSharedPreferences("Credenciales",
Context.MODE_PRIVATE);
String usuario = campoUsuario.getText().toString();
String pass = campoPass.getText().toString();

SharedPreferences.Editor editor=preferences.edit();
editor.putString("user",usuario);
editor.putString("pass",pass);

txtUsuario.setText(usuario);
txtPass.setText(pass);

editor.commit();
}
}

Captura de pantalla del proyecto visualizado completo:


Imágenes funcionamiento completo de la app móvil:

Paso 1:

Ejecutamos la app mostrándonos esta pantalla principal:


,

Paso 2:

Procederemos a agregar nuestro usuario y contraseña presionando el botón guardar


para que nuestros datos se muestren en un archivo XML y queden guardados para que
al momento de cerrar nuestro programa y al volver abrirlo se nos muestre nuestros datos
guardados en la pantalla de login como lo demostraremos con las siguientes capturas de
pantalla:
Paso 3:

Procederemos a cerrar y abrir la app y verificaremos que nuestro login quedo guardado
para volver a ingresarlo demostrándolo en la siguiente captura de pantalla:
Paso 4:

En este paso procederemos a validar nuestro propio rut contra la api expuesta en la
semana mostrando el resultado en la siguiente captura de pantalla:

Como se puede observar lo validamos nuestro rut personal con un Toast y un TextView
mostrándolo en nuestra app como se muestra en la imagen anterior.
Respuestas:

1. Ambos esquemas de api son tremendamente útiles para el intercambio de data


entre aplicaciones, el usar uno o el otro, o cuál de los dos es mejor no es
relevante porque según sea la necesidad del requerimiento, se puede usar el uno
o el otro, pero para escoger en mi opinión sería ideal el XML ya que en términos
de extensibilidad los XML permiten almacenar cualquier tipo de datos en cambio
con JSON está limitado a almacenar datos clásicos como textos y números, otra
característica porque sería ideal XML es debido a que es posible adjuntar
cualquier fichero de cualquier formato en cambio JSON solo soporta los de datos
tradicionales.

2. El AsyncTask el objetivo que tiene para realizar la llamada a la API es liberar al


programador el uso de hilos, la sincronización entre ellos y la presentación de
resultados en el hilo primario. Esta clase unifica los aspectos relacionados que se
realizarán en segundo plano y además gestiona de forma asíncrona la ejecución
de las tareas.

3. El Shared Preferences según el requerimiento tiene como funcionalidad en la


aplicación guardar los datos para posteriormente personalizar la experiencia del
usuario en el caso de nuestra app se proporcionó un método que tenía como
objetivo administrar los tipos de datos guardados almacenándose el sistema login
creado como clave-valor compuesta por un identificador único en este caso
usuario y contraseña, siendo guardado estos datos en un archivo XML como se
demostró en el funcionamiento de nuestra app y mostrados estos datos de login
en el archivo credenciales.xml.

Finalizando nuestro control número 7 este proyecto será enviado en un link de drive para
una mejor visualización del código y del proyecto el cual es el siguiente:

https://drive.google.com/drive/folders/1qTw2VkdTstev0UbsyMGf5pfuc7z9zQlE?
usp=sharing
BIBLIOGRAFÍA

IACC (2022). Componentes para el desarrollo de aplicaciones en Android. Herramientas


de programación móvil. Semana 2.
IACC (2022). Anatomía de una Aplicación Móvil. Herramientas de Programación Móvil.
Semana 3.

IACC (2022). Interfaz de usuario en Android. Herramientas de programación móvil.


Semana 4.

IACC (2022). Animaciones, Gráficos y Multimedia en Android. Herramientas de


programación Móvil. Semana 5.

IACC (2022). Manejo de Datos: Android. Herramientas de Programación Móvil. Semana


6.

IACC (2022). Acceso a Redes de Servicio en Android / Shared Preferences y


SplashScreen. Herramientas de Programación Móvil. Semana 7.

También podría gustarte