jueves, 20 de marzo de 2025

Proyectos 2024. Desarrollo de Aplicaciones Móviles. UAT-FIC

Profesor: Dr. Juan José Garza Saldaña
 

Facultad de Ingeniería y Ciencias
Universidad Autónoma de Tamaulipas


Los estudiantes de la materia de Desarrollo de Aplicaciones Móviles, dentro del curso son invitados a desarrollar una aplicación móvil para el Sistema Operativo Android como proyecto de medio curso de la materia. Como muestra de las capacidades adquiridas durante este curso, se les indica buscar un problema a resolver a través de una aplicación y que no utilice conexión con un servidor externo, posteriormente esta aplicación desarrollada debe ser colocada en Google Play u otra plataforma similar. De esta manera, el estudiante descubre también el proceso completo para subir una aplicación a esta tienda en línea.

A continuación, se muestran aplicaciones con el alumno autor de la misma, la liga en Google Play o Uptodown, una imagen de la publicación y una breve descripción de la aplicación.

 

Nota: Estas aplicaciones estaban disponibles al 20 de Marzo de 2025

 


miércoles, 20 de noviembre de 2024

¿Cómo eliminar líneas vacías en editor de Android Studio? ( How to remove empty lines in Android Studio editor? )

 

 

1. Seleccionar Ctrl + F

2. Seleccionar el botón de expresiones regulares que tiene el símbolo:   .* 

3. En la caja de búsqueda colocar la siguiente expresión:   ^\s*$\n

4. En el margen izquierdo seleccionar el botón con el símbolo de mayor que:    >

         aparecerá una nueva caja para reemplazar el texto encontrado, dejar vacía la caja

5. Presionar el botón:  Replace All

6. Fin. Las líneas vacías deberán eliminarse del archivo de texto



Basado en: 

How to remove empty line in VSCode?

https://medium.com/@manish90/how-to-remove-empty-line-in-vscode-fd3716958787

jueves, 14 de marzo de 2024

Proyectos 2023. Desarrollo de Aplicaciones Móviles

Materia:  Desarrollo de Aplicaciones Móviles

Profesor: Juan José Garza Saldaña
Facultad de Ingeniería y Ciencias
Universidad Autónoma de Tamaulipas


Descripción

Con el fin de impulsar su creatividad, los estudiantes del curso: Desarrollo de Aplicaciones Móviles, dentro del periodo, son invitados a desarrollar una aplicación móvil para el Sistema Operativo Android como proyecto de medio curso de la materia. Como muestra de las capacidades adquiridas durante este curso, se les indica buscar un problema a resolver a través de una aplicación y que no utilice conexión con un servidor externo, posteriormente esta aplicación desarrollada debe ser colocada en Google Play u otra plataforma similar. 

A continuación se muestran aplicaciones con el nombre del alumno autor de la misma, la liga en Google Play o Uptodown, una imagen de la publicación y  una breve descripción de la aplicación.

Nota: Estas aplicaciones estaban disponibles a Marzo 14 de 2024, su estatus puede cambiar. Son gratuitas. 

   


 

Periodo: 2023-1


  

PriceFinder

 Alumno: Mascorro Hernández Daniel

https://play.google.com/store/apps/details?id=com.New.pricefindernewpacage

 



¿Eres dueño de una PyME? ¿Te es difícil recordar el precio de los productos que vendes?
Escanea el código de barras del artículo y encuentra su información instantáneamente (previamente capturada).
Price Finder es una aplicación que te puede ayudar a ahorrar mucho tiempo al momento de encontrar el precio de los productos de tu pequeña o mediana empresa. Principalmente es dirigida a negocios que venden productos que ya cuentan con código de barras.

 

 

 

DAMLibreria

 Alumno: González Guerrero Alex Alfredo

https://damlibreria.uptodown.com/android

 


La aplicación de librería es una herramienta completa y fácil de usar que te permite gestionar tu colección de libros de una manera organizada y eficiente. Con esta aplicación, podrás dar de alta libros, buscar por nombre, mantener un registro de tus favoritos y libros leídos, explorar diferentes géneros literarios, registrar préstamos y llevar un seguimiento de tus listas de libros y préstamos.




EventControlAdmin

Alumno: JESUS ENRIQUE RODRIGUEZ PEREZ

https://eventcontroladmin.uptodown.com/android

 




Lleva cómodamente la administración de tu negocio de Local de Eventos: alberca, salón de fiestas, etc.

 


ClassControl

 

Alumno: Carlos Eduardo Piña Moreno

https://classcontrol.uptodown.com/android

 



Lleva un control de los pagos en tu empresa.

Esta aplicación fue creada con el fin de llevar un control adecuado de alumnos en un negocio, se hizo con fines generales para que pueda ser usado tanto para gimnasios (como se muestra en el ejemplo) como para que pueda llevar el control de una escuela pequeña, con ella podrás llevar un control de: alumnos información general, pagos, quienes están activos o inactivos, editar cuota de pago mensual, alumnos con adeudo y con pago, fechas en las que hicieron los pagos, etc.

 

 

RegistroDeEjemplaresCAUAT

Alumno: Bocanegra Medina Carlo Alejandro

https://registrodeejemplarescauat.uptodown.com/android

 


RegistroDeEjemplaresCAUAT es una herramienta diseñada para estudiantes de ciencias ambientales, biología y biólogos de campo. Con esta aplicación, puedes realizar un seguimiento detallado de las especies que encuentras durante tus recorridos y expediciones. Registra información clave, como nombre científico, ubicación, fecha, fotografías y notas adicionales para cada ejemplar. Organiza tus registros de manera eficiente y accede fácilmente a ellos en cualquier momento. Ya sea que estés investigando, haciendo estudios de campo o simplemente seas un apasionado por la biodiversidad, esta aplicación te ayudará a mantener un registro completo y preciso de tus hallazgos.

 

Appgenda

 Alumno: Hernandez Campillo Aldo Giovanny

https://appgenda.uptodown.com/android



 

Gestiona tus citas en esta app de tu salón de belleza, alta clientes, citas, productos y su existencia etc.



Periodo:

2023-3 


 

 

DirecMed – Directorio Médico

 

Alumno: Jorge Iván Olazarán Vázquez.

Registro de Recetas médicas y pacientes.

https://play.google.com/store/apps/details?id=com.jiov.mediocursoapp&pcampaignid=web_share

 


 

La app se basa en poder ayudar a los médicos, dentistas, nutriólogos etc., a tener de manera organizada la información de sus pacientes, así como sus consultas y sus fechas.

 

 

BIKE MASTER

 

Alumno: BERRONES MARTINEZ LUIS ALBERTO

https://bike-master.uptodown.com/android

 


Bike Master es una aplicación integral diseñada para gestionar eficientemente un taller de reparación de motocicletas. Ofreciendo una solución completa, desde el seguimiento de la entrada de motos para servicio hasta el registro de clientes, la aplicación facilita la administración diaria y mejora la comunicación con los clientes.

Bike Master simplifica la gestión de talleres de motocicletas, brindando una herramienta eficiente y efectiva para propietarios de talleres y mecánicos. Optimiza tus operaciones diarias y mejora la interacción con los clientes, llevando tu taller al siguiente nivel.



AGENDA PARA ESTÉTICAS


Alumno: BRANDON EMMANUEL OLVERA MATA

 https://play.google.com/store/apps/details?id=com.braolvera.agendapestaas

 


Bienvenido a tu aliado perfecto para gestionar tus servicios, clientes y citas de manera eficiente. La "Agenda Para Estéticas" es la herramienta integral que necesitas para organizar y optimizar tu negocio. Diseñada para profesionales independientes, esta aplicación monousuario te permite organizar tus citas, dar de alta nuevos clientes y administrar servicios de manera rápida y sencilla.

 

TallerAutomotriz

 

Alumno: Adrián Osvaldo De León Berrones

https://tallerautomotriz.uptodown.com/android

 


 

Lleva el control de los autos que ingresan a tu taller, como el servicio que se le realizara, su fecha de entrada y salida, el propietario del auto que se ingresó, así mismo podrás ver las ventas que has generado en una fecha ingresada.

lunes, 20 de diciembre de 2021

Instalación de HBO MAX, Disney+, Clarovideo para GHIA G50DUHDS8-Q y otros con smartTV con sistema Android

Recientemente adquirí un Smart TV GHIA G50DUHDS8-Q y los problemas empezaron para intentar instalar las Aplicaciones de streaming (Apps) para este TV, pues de entrada tiene una tienda Aptoide que aunque es buena no siempre cuenta con las versiones actualizadas. Supongo esto sucede también para otras marcas de televisores no tan reconocidos por lo que estos pasos deben funcionar también, siempre que tengan instalados sistemas Android.

Intente descargar desde Google Play las Apps pero esta bloqueada la página para este televisor, así que buscando en Internet encontré que varias Apps pueden estar disponibles en otros sitios de descarga que tienen convenios para distribuir legalmente las aplicaciones.

Hay que acceder a estos sitios a través del navegador de la TV los que utilice son:

https://www.apkmirror.com

https://www.uptodown.com/


aunque, también hay otros sitios que no he probado.


Ya específicamente, por ejemplo, pude instalar Disney+ versión para mi modelo de TV el día 20/12/2021 desde  :

https://www.apkmirror.com/apk/disney/disney-android-tv/disney-android-tv-2-3-1-rc4-release/


Para HBO MAX en el mes de Noviembre del 2021 funcionó la versión 50.55.0182

https://hbo-now.uptodown.com/android


Para instalar Claro video me funcionó la versión 564v10 en el mes de Noviembre del 2021

https://clarovideo.uptodown.com/android


Con el paso del tiempo estas versiones se van a ir desactualizando pero de la misma manera, supongo que en estos sitios se podrán descargar las versiones nuevas.



martes, 5 de octubre de 2021

MiniBitacora Manual


MiniBitacora V 1.3 (Nov. 25, 2021)


Figura 1. Menú Principal.




Disponible en:

https://play.google.com/store/apps/details?id=com.jjgarsal.minibitacora&hl=es_MX&gl=US 



Introducción. 

MiniBitacora es una aplicación (app.) que ayuda a almacenar y organizar información de sus actividades diarias a través de archivos de texto.

Usted puede escribir tanto como lo desee en cada archivo de Bitácora, en relación al límite esta dado por las capacidades de almacenamiento de su dispositivo.

Cuenta con un botón que lee la hora del sistema y la escribe en el archivo al presionarlo.

Dependiendo de su dispositivo puede usar las opciones de corrección de ortografía, seleccionar texto, copiar y pegar dentro de la misma app.

Puede pegar texto desde otras aplicaciones que así lo permitan a través del portapapeles con Copiar y Pegar, ejemplo: redes sociales, el navegador, la calculadora, editor de texto, etc.

Este programa se ofrece con la esperanza de que sea útil y sin garantía de ningún tipo, y es responsabilidad del usuario el respaldo de la información.

Puede enviar el contenido de una bitácora por Email o Whatsapp. La función de anexar fotos o archivos se puede utilizar únicamente a través de su app de Email preferida.

El programa puede ser utilizado para:

- Llevar un diario de actividades.

- Bitácora de mantenimiento de vehículos

- Bitácora de visitas o cobranza de clientes

- Bitácora de ventas del día

- Bitácora de canciones escuchadas

- Bitácora de actividades con registro de hora y minutos del dispositivo, utilizando el botón con icono de reloj.

- etc.


Inicio rápido. 


Si desea iniciar inmediatamente a usar la App, después de entrar a la configuración obligatoria (4.5), la recomendación es leer:

Crear prefijos, si utilizará bitácoras diferenciadas (4.1).

Crear una nueva bitácora (2).



0. Entrada.

La Entrada es la pantalla que se muestra al iniciar la aplicación (App), en caso de ser la primera vez que entra a la App solicitará que presione el botón de Configuración (Utilerias 4.5).


1. Menú Principal.

La pantalla del Menú Principal permite el acceso, a través de los botones, a las ventanas de la aplicación que se describen a continuación. También, en la esquina superior derecha se muestra un botón con 3 puntos, que muestra otras opciones.

Figura 3. Pantalla principal mostrando menú de utilerías en la parte superior derecha. 


2. Nueva Bitácora.

Crea un archivo nuevo de bitácora.

Figura 4. Muestra bitácora vacía, control para seleccionar fecha de la bitácora y ejemplo de corrección de errores del dispositivo. 


Fecha. Si toca el campo fecha aparecerá una pantalla que permite seleccionar una fecha.

Guardar. La bitácora será almacenada hasta que se presione el botón Guardar con la fecha seleccionada o escrita. Para el nombre del archivo se utiliza la fecha, ejemplo: Si se escribe la fecha 12/05/2021 el archivo almacenado es el nombre 12-05-2021.

Regresar. El botón Regresar devuelve hacia la pantalla anterior.

Prefijo. Sí el control Prefijo es marcado colocará un prefijo al nombre del archivo, que dependerá de la caja de selección frente a ella. Ejemplo: Si el contenido de la caja de seleccion es "casa" el nombre del archivo se conforma con el prefijo concatenado con la fecha "casa12-05-2021", esto permite crear bitácoras diferenciadas. Los Prefijos se capturan o editan como se explica más adelante a través de Utilerías (4.1).

 Figura 5. Bitácora con uso del botón prefijo y menú de prefijos almacenados.


Contenido. El área de contenido es el lugar donde se escribe la bitácora con un formato libre. Dependiendo de su dispositivo podrá utilizar las opciones de corrección de texto, copiar, pegar y cortar información desde otras aplicaciones a través del portapapeles del sistema.

Botón con icono de reloj. Agrega una etiqueta con la hora actual del dispositivo en una línea individual. Ejemplo: <hora>10:25</hora>






Figura 6 . Bitácora con etiquetas de hora en líneas separadas.

    NOTA: La siguiente vez que ingrese a la bitácora se mostraran 2 botones más (ver 3.1): uno  para enviar la bitácora por Email y otro por Whatsapp.


3. Lista de Bitácoras.

La lista de bitácoras muestra todos los archivos almacenados en el dispositivo y tocando el nombre abrirá una pantalla para Ver o Editar la bitácora modificando su información.

Figura 7. Lista de Bitácoras.




3.1. Ver o Editar Bitácora.

Permite visualizar el contenido de la bitácora y  modificar su contenido. La fecha o nombre de la bitácora NO pueden ser modificados.


Figura 8. Pantalla de edición de bitácora y envío de bitácora por Email con imagen anexada.


Guardar. La bitácora se almacena hasta que se presione el botón Guardar con el mismo nombre de archivo.

Regresar. El botón Regresar devuelve hacia la Lista de Bitácoras.

Botón con icono de reloj (Ver Figura arriba). Agrega una etiqueta con la hora actual del dispositivo en una línea individual. Ejemplo: <hora>10:25</hora>.  

Botón con icono de Carta. Envía por Email el contenido de la bitácora, abre una lista de programas y debe elegir su App de correo electrónico, requiere tener una cuenta de email configurada en el dispositivo. Adicionalmente desde su App de correo podrá agregar archivos: imágenes, videos, audio, documentos, etc.
                        Notas: a) Los documentos anexados en el Email no se guardan en MiniBitácora y b) Dependiendo de su dispositivo aparecerá una lista de opciones para enviar la bitácora, la adición de archivos solo funciona cuando selecciona una cuenta de correo configurada en su dispositivo, por Ejemplo: Gmail, Yahoo, Hotmail, etc., las demás opciones no han sido probadas.

      Botón con icono de WhatsApp. Envía por WhatsApp el contenido de la bitácora, abre la lista de grupos y usuarios para elegir el destinatario de la bitácora, requiere tener una cuenta de WhatsApp configurada en el dispositivo.



4. Utilerías.


Abre las opciones de utilería de la aplicación, se accede a ellas a través del botón en la esquina superior derecha de Menú Principal (1).


Figura 9 . Listado de utilerías de la aplicación.



4.1. Ver o Editar Prefijos.

Permite ver o editar la lista de prefijos que se utilizan para una Nueva Bitácora.


Figura 10. Edición de prefijos


Prefijo. Un prefijo corresponde a una palabra o parte de una palabra que se colocará antes de la fecha del nombre del archivo. Se sugiere utilizar una palabra corta de 8 a 10 letras. No debe llevar espacios y no utilizar vocales acentuadas o letras con caracteres especiales, tampoco la "ñ" o "Ñ". Se pueden utilizar guiones bajos "_". Se debe colocar un prefijo por línea. Se utilizan para crear bitácoras diferenciadas. Al inicio la lista de prefijos aparece vacía.

Guardar. La lista de prefijos será almacenada hasta que se presione el botón Guardar. En Nueva Bitácora (2) si el contenido de la caja de selección es "casa" el nombre del archivo se conforma con el prefijo concatenado con la fecha "casa12-05-2021".

Regresar. El botón Regresar devuelve hacia la pantalla anterior.

Un ejemplo de una lista de prefijos (cada prefijo en una línea) puede ser:

casa luz
volcho
perro
Maria
puente1_
dron1



4.2. Respaldar y Enviar.

Estas operaciones permiten enviar la información contenida en la aplicación a un correo electrónico de su elección. En caso de perder su celular o daño en el mismo, con el archivo de su correo podrá recuperar su información de acuerdo con la fecha de su archivo de respaldo.

Figura 11. Respaldo y envío de archivo de respaldo.


NOTA: Es sugerido hacer un respaldo cada día que añada o modifique información en las bitácoras y es responsabilidad del usuario hacer este respaldo y verificar que llego a su correo.

Consiste de 2 pasos:

Crear Respaldo. Crea un archivo con el contenido de todas sus bitácoras. 

Enviar Respaldo. Envía un email a el correo registrado en la caja de texto, sino se llena no se enviará el correo. Requiere tener configurada una cuenta de correo en su celular. Al tocar aparecerá un conjunto de opciones para enviar su archivo, seleccione la de su cuenta de correo.


4.3. Recuperar Respaldo.

    Esta operación recupera la información contenida  en un archivo de respaldo todas las Bitácoras y la coloca nuevamente en la aplicación.


Figura 12. Selección de archivo de respaldo.


Seleccionar el archivo de respaldo a través del botón "Selecciona archivo de respaldo", mostrará una pantalla que le permitirá elegir el archivo que ud. recibió en su email a través de la operación de envío de respaldo (4.2),

sino selecciona el archivo correcto no ejecutará la recuperación.\n


PRECAUCIÓN: Esta operación sustituye toda la información actual de la aplicación, sustituyendola por la del archivo de respaldo. Su uso debe ser únicamente en caso del extravío del celular o daño del mismo con la Reinstalación nuevamente de la App MiniBitacora.


4.4. Eliminar Bitácora (Baja).

Esta operación borra el archivo de bitácora y para evitar cualquier error en la eliminación se consideró colocarla en  utilerías.  


Figura 13. Lista de bitácoras para dar de baja y pantalla de verificación para borrar.


Al presionar el botón en Utilerías (4) presentará una lista con todas las bitácoras almacenadas y al seleccionar la que desea mostrará la información que contiene, sin posibilidad de editarla. Para eliminarla debe tocar el botón "Borrar bitácora" lo cual elimina el archivo definitivamente. El botón Cancelar mantiene el archivo en la aplicación.


4.5. Configuración.

En esta opción se almacena información para el funcionamiento de la aplicación.


Si es la Primera vez que inicia la App. Ingrese los datos que se solicitan es OBLIGATORIO: escribir su Email y confirmar que sea correcto.


Los componentes que se muestran son:

Email. Escriba el email del usuario. Se utiliza al Respaldar y Enviar (4.2) la información del sistema.  Se solicitará confirme o vuelva a escribir el mismo email.


Guardar. Almacena su información  de Configuración.

Regresar. Regresa al Menú Principal o Entrada.


5. Instrucciones y Acerca De.

    Se muestra el instructivo de la App e información de contacto.

Figura 15. Instrucciones e información de la App.



6. Salir.

Termina la aplicación. Deja de mostrarla en la pantalla del dispositivo.



Notas de la Versión 1.3. (Nov 25, 2021) Actualizaciones

- Se deja el control de Acceso a la seguridad del dispositivo (sistema de bloqueo), únicamente se solicita cuenta de Email en Configuración (4.5).

- Se muestra fecha de último respaldo, en Menú Principal (1).


Notas de la Versión 1.2. (Nov 12, 2021) Actualizaciones

- Se ordenan las bitácoras la mas reciente primero y se puede filtrar la lista por Prefijos, en Lista de Bitácoras (3).

- Se modifican datos en Configuración (4.5).

- Se envía Email en Primera vez en App y al cambiar Pregunta y Respuesta, para recuperación, en Configuración (4.5)


Notas de la Versión 1.1. (Oct. 10, 2021) Actualizaciones

- Se añaden botones de Email y WhatsApp para enviar el contenido de la bitácora, en Editar Bitácora (3.1).

- Al enviar por Email puede anexar archivos de: imágenes, videos, .pdf, .doc, xls, etc. desde la App de correo para completar su contenido, los archivos anexados no se guardan en MiniBitacora. Revisar notas en (3.1)




------------------------------------

Autor:

------------------------------------

jjgarsal, 2021

email: jjgarsal@gmail.com

Cd. Victoria, Tamaulipas, México

------------------------------------


P.D. Esta aplicación nace para resolver un problema personal de almacenamiento de información en un dispositivo móvil y debido también a que Google(TM) me iba a cerrar la cuenta de desarrollador sino la utilizaba. :)

Espero la disfrute y sea de utilidad para Ud. como lo ha sido para mi.


Atte. 

Juan José Garza Saldaña


martes, 1 de diciembre de 2020

AndroidNetworking. Consulta programáticamente a servidor Web con PHP desde app Android utilizando librería AndroidNetworking, con resultados en listView

 


El usuario se conectará programaticamente a un servidor Web apache desde una app con Android utilizando la librería de AndroidNetworking




0. Crear Base de datos id15XXXXX_escuela y tabla Alumnos con anterioridad


1. Colocar en el servidor WEB el script indexJson2.php


################

indexJson2.php


Crear Base de datos id15XXXXX_escuela y tabla Alumnos con anterioridad

Colocar en el servidor WEB

################



<?php


// Consulta a la BD de la tabla Alumnos

// Devuelve un String con un arreglo JSON


$servidor="localhost";

$usuario="id15XXXXXX_usrescuela";

$pwdUsuario="C*LJH7XXXXXX";

$nombreBD="id15XXXXX_escuela";



$conexion =  mysqli_connect($servidor, $usuario, $pwdUsuario,$nombreBD);

if (!$conexion) {

    die('No pudo conectarse: ' . mysqli_error($conexion));

}


$consulta = "SELECT * FROM Alumnos";



$result = mysqli_query($conexion, $consulta) or die('No pudo conectarse: ' . mysqli_error($conexion));

$numResults = mysqli_num_rows($result);


        if ($numResults > 0)

        {

    // $data guarda la matriz de los registros consultados

            $data = array();

            while ($row = mysqli_fetch_assoc($result))

            {

                $data[] = $row;

            }

// Crea 3 campos en el arreglo: registros, totRegistros, status

        $result = ['registros' => $data, 'totRegistros' => $numResults, 'status' => 'true'];


// Crea el objeto JSON

        echo json_encode($result);


}else{

    echo "No hay registros";

}



 mysqli_close($conexion);


?> 




######################

Consulta con AndroidNetworking

######################


0. Crear proyecto nuevo en Android Studio



1. Requiere permiso de Internet en el Manifest


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



2. En Gradle Scripts, en build.gradle(Module: app) agregar la librería de AndroidNetworking


implementation 'com.amitshekhar.android:android-networking:1.0.2'


3. Al agregar la línea de volley aparecerá un aviso SyncNow, para descargar las clases de la librería a nuestro proyecto


presionar el link


tardará en descargar algunos segundos o minutos.


4. Crear un nuevo Activity en blanco "Actividad2", en este se muestra el resultado de la consulta



-------------

activity_actividad2.xml

-------------

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

<LinearLayout 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"

    android:orientation="vertical"

    tools:context=".MainActivity" >


    <TextView

        android:id="@+id/tv1"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="TextView"

        android:textSize="24sp" />


    <ListView

        android:id="@+id/listView1"

        android:layout_width="match_parent"

        android:layout_height="match_parent" />

</LinearLayout>

-------------



5. En Actividad2.java pegar



-------------

Actividad2.java

-------------


import androidx.appcompat.app.AppCompatActivity;


import android.os.Bundle;

import android.view.View;

import android.widget.AdapterView;

import android.widget.ArrayAdapter;

import android.widget.ListView;

import android.widget.TextView;

import android.widget.Toast;


import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONObject;


public class Actividad2 extends AppCompatActivity {


    public String[] arregloRegistrosBD;


    private TextView tv1;

    private ListView lv1;


    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_actividad2);


// recibe miArreglo de MainActivity.java

        Bundle bundle = getIntent().getExtras();

        String datos=bundle.getString("miArreglo");


        Toast.makeText(Actividad2.this,datos,Toast.LENGTH_LONG).show();


        parseDataEnArreglo(datos);


        tv1=(TextView)findViewById(R.id.tv1);

        lv1 =(ListView)findViewById(R.id.listView1);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(Actividad2.this, android.R.layout.simple_list_item_1, arregloRegistrosBD);

        lv1.setAdapter(adapter);

        lv1.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override

            public void onItemClick(AdapterView<?> parent, View v, int posicion, long id) {

                tv1.setText("Línea: "+ lv1.getItemAtPosition(posicion));


            }

        });


    }

    public void parseDataEnArreglo(String response) {

        /**

         * 1. Convierte String a JSONObject y separa los campos del JSONarray: registros, totRegistros, status

         * 2. Separa los campos de cada línea del arreglo: registros

         * 3. Los coloca en un arreglo de Strings

         */



        try {

            JSONObject jsonObject = new JSONObject(response);

            if (jsonObject.getString("status").equals("true")) {

                JSONArray dataArray = jsonObject.getJSONArray("registros");

                int cuenta = jsonObject.getInt("totRegistros");

                String temporal[] = new String[cuenta];

                for (int i = 0; i < dataArray.length(); i++) {


                    JSONObject dataobj = dataArray.getJSONObject(i);

                    /** Concatena cada campo de la linea en el Arreglo */

                    temporal[i] = dataobj.getString("nombre") +", " +dataobj.getString("clave") +", "+

                            dataobj.getString("calificacion");


                    //System.out.println("temporal=" + temporal[i]);


                }


                // Copia el arreglo temporal hacia el que se utiliza en el ListView

                arregloRegistrosBD = temporal.clone();

            }


            //System.out.println("paises=" + paises[0]+ " tam="+paises.length);


        } catch (JSONException e) {

            e.printStackTrace();

        }


    }

}


--------------



6. En activity_main.xml crear un boton y un TextView dentro de un scrollview (solo para ver resultados, es opcional)


-------------

activity_main.xml

-------------


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

<LinearLayout

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="match_parent"

    android:layout_height="match_parent">


    <Button

        android:id="@+id/buttonAndNet"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:onClick="consultaAndroidNet"

        android:text="Buscar con AndroidNetworking" />



    <ScrollView

        android:layout_width="match_parent"

        android:layout_height="match_parent">


        <LinearLayout

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:orientation="vertical" >


            <TextView

                android:id="@+id/TextView01"

                android:layout_width="match_parent"

                android:layout_height="match_parent"

                android:textSize="8pt" />

        </LinearLayout>

    </ScrollView>



</LinearLayout>


-------------




7. En MainActivity.java colocar el código para hacer la consulta con Volley


Inicializar cola de peticiones de AndroidNetworking


Conectar al servidor donde esta el script "https://nombreDeServidor/ejemplo/indexJson2.php"



-------------

MainActivity.java

-------------


import androidx.appcompat.app.AppCompatActivity;


import android.app.ProgressDialog;

import android.content.Context;

import android.content.Intent;

import android.os.AsyncTask;

import android.os.Bundle;

import android.os.StrictMode;

import android.util.Log;

import android.view.View;

import android.widget.EditText;

import android.widget.TextView;

import android.widget.Toast;



import com.androidnetworking.AndroidNetworking;

import com.androidnetworking.common.Priority;

import com.androidnetworking.error.ANError;

import com.androidnetworking.interfaces.StringRequestListener;



import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.net.HttpURLConnection;

import java.net.URL;

import java.net.URLEncoder;

import java.util.HashMap;

import java.util.Map;


import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONObject;



public class MainActivity extends AppCompatActivity {

    private TextView salida;

    private RequestQueue colaPeticiones, requestQueue;


    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        salida = (TextView) findViewById(R.id.TextView01);



        //Inicializa para AndroidNetworking

        AndroidNetworking.initialize(getApplicationContext());


    }





    // Android Networking


    //// Codigo modificado

    public void consultaAndroidNet(View v){

        /**

         * Consulta servidor web por POST con librería AndroidNetworking

         * Más ejemplos en:

         * https://guides.codepath.com/android/Networking-with-the-Fast-Android-Networking-Library

         *

         * Hace petición y recibe en un String un JSONarray

         *

         */


        final String URL_DATA="https://nombreDeServidor/ejemplo/indexJson2.php";


        //AndroidNetworking.initialize(context);  Se movió a OnCreate

        AndroidNetworking.post(URL_DATA)

                /** En caso de necesitar pasar parámetros se pasan como las sig 2 lineas*/

                //.addBodyParameter("firstname", "Amit")

                //.addBodyParameter("lastname", "Shekhar")

                .setPriority(Priority.MEDIUM)

                .build()

                .getAsString(new StringRequestListener() {

                    @Override

                    public void onResponse(String response) {

                        Toast.makeText(MainActivity.this,response+"\nAndroidNetworking",Toast.LENGTH_SHORT).show();


                        // Muestra los registros en TextView: salida

                        parseData(response);


                        // Lanza Actividad2 y envia String con JSONarray: mi Arreglo

                        Intent i=new Intent(MainActivity.this, Actividad2.class);

                        i.putExtra("miArreglo", response);

                        startActivity(i);


                    }


                    @Override

                    public void onError(ANError anError) {

                        Toast.makeText(MainActivity.this,"*** ERROR: NO conecta con servidor "+anError.toString(),Toast.LENGTH_SHORT).show();

                        salida.append(anError.toString());


                    }

                });

    }


 


    public void parseData(String response) {

        /**

         * 1. Convierte String a JSONObject y separa los campos del JSONarray: registros, status

         * 2. Separa los campos de cada línea del arreglo: registros

         */

        try {

            JSONObject jsonObject = new JSONObject(response);

            if (jsonObject.getString("status").equals("true")) {

                JSONArray dataArray = jsonObject.getJSONArray("registros");

                for (int i = 0; i < dataArray.length(); i++) {


                    JSONObject dataobj = dataArray.getJSONObject(i);

                    /** Concatena cada linea en el TextView salida */

                    salida.append(dataobj.getString("nombre") +"  ");

                    salida.append(dataobj.getString("clave") +"  ");

                    salida.append(dataobj.getString("calificacion") +"\n");




                }


                //Intent intent = new Intent(MainActivity.this,HobbyActivity.class);

                //startActivity(intent);

            }

        } catch (JSONException e) {

            e.printStackTrace();

        }


    }




}


-------------


REFERENCIA:




lunes, 30 de noviembre de 2020

Android Volley. Consulta programáticamente a servidor Web con PHP desde app Android utilizando librería Volley, con resultados en listView

El usuario se conectará programaticamente a un servidor Web apache desde una app con Android utilizando la librería Volley, los resultados se muestran en Actividad2.java dentro de un listView

Requiere:

- Un Servidor Web con apache, php y mysql instalado.
- Base de Datos con una tabla Alumnos con los siguientes campos: id, nombre, clave, calificacion
- Una PC con Android Studio instalado, con un proyecto en Java creado


################
En el Servidor Web: Apache
################

0. Crear Base de datos id15XXXXX_escuela y tabla Alumnos con anterioridad en el Servidor

1. Colocar en el servidor WEB el script indexJson2.php


------------------------

indexJson2.php

------------------------


<?php


// Consulta a la BD de la tabla Alumnos

// Devuelve un String con un arreglo JSON


//Por seguridad las siguientes 4 variables se recomienda colocarlas en un archivo
//que no se pueda descargar del servidor Apache (usar un #include), por facilidad,
//en esta práctica se colocan dentro del mismo archivo .php 

$servidor="localhost";
$usuario="id15XXXXXX_usrescuela";
$pwdUsuario="C*LJH7XXXXXX";
$nombreBD="id15XXXXX_escuela";



$conexion =  mysqli_connect($servidor, $usuario, $pwdUsuario,$nombreBD);

if (!$conexion) {

    die('No pudo conectarse: ' . mysqli_error($conexion));

}


$consulta = "SELECT * FROM Alumnos";



$result = mysqli_query($conexion, $consulta) or die('No pudo conectarse: ' . mysqli_error($conexion));

$numResults = mysqli_num_rows($result);


        if ($numResults > 0)

        {

    // $data guarda la matriz de los registros consultados

            $data = array();

            while ($row = mysqli_fetch_assoc($result))

            {

                $data[] = $row;

            }

// Crea 3 campos en el arreglo: registros, totRegistros, status

        $result = ['registros' => $data, 'totRegistros' => $numResults, 'status' => 'true'];


// Crea el objeto JSON

        echo json_encode($result);


}else{

    echo "No hay registros";

}



 mysqli_close($conexion);


?> 




######################
En App Android. Crear App  para realizar Consulta con librería Volley
######################


0. Crear proyecto nuevo en Android Studio


1. Requiere permiso de Internet en el Manifest


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



2. En Gradle Scripts en build.gradle(Module: app) agregar la librería de Volley o actualizar la versión, en versiones nuevas de Android Studio ya esta agregada


implementation 'com.android.volley:volley:1.1.1'

 

Corrección a 2024-3

 

         implementation (libs.volley)


3. Al agregar la línea de volley aparecerá un aviso SyncNow, para descargar las clases de la librería a nuestro proyecto


presionar el link


tardará en descargar algunos segundos o minutos.


4. Crear un nuevo Activity en blanco "Actividad2", en este se muestra el resultado de la consulta



-------------

activity_actividad2.xml

-------------

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

<LinearLayout 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"

    android:orientation="vertical"

    tools:context=".MainActivity" >


    <TextView

        android:id="@+id/tv1"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="TextView"

        android:textSize="24sp" />


    <ListView

        android:id="@+id/listView1"

        android:layout_width="match_parent"

        android:layout_height="match_parent" />

</LinearLayout>

-------------




5. En Actividad2.java pegar


-------------

Actividad2.java

-------------

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;

import android.widget.AdapterView;

import android.widget.ArrayAdapter;

import android.widget.ListView;

import android.widget.TextView;

import android.widget.Toast;

import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONObject;


public class Actividad2 extends AppCompatActivity {


    public String[] arregloRegistrosBD;

    private TextView tv1;

    private ListView lv1;



    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_actividad2);


        // recibe miArreglo de MainActivity.java

        Bundle bundle = getIntent().getExtras();

        String datos=bundle.getString("miArreglo");

        // Línea siguiente Toast... muestra datos recibidos en miArreglo

        //Toast.makeText(Actividad2.this,datos,Toast.LENGTH_LONG).show();

        parseDataEnArreglo(datos);


        tv1=(TextView)findViewById(R.id.tv1);

        lv1 =(ListView)findViewById(R.id.listView1);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(Actividad2.this, android.R.layout.simple_list_item_1, arregloRegistrosBD);

        lv1.setAdapter(adapter);


        lv1.setOnItemClickListener(new AdapterView.OnItemClickListener() {


            @Override

            public void onItemClick(AdapterView<?> parent, View v, int posicion, long id) {

                tv1.setText("Línea: "+ lv1.getItemAtPosition(posicion));

            }

        });


    }


    public void parseDataEnArreglo(String response) {

        /**

         * 1. Convierte String a JSONObject y separa los campos del JSONarray: registros, totRegistros, status

         * 2. Separa los campos de cada línea del arreglo: registros

         * 3. Los coloca en un arreglo de Strings

         */


        try {


            JSONObject jsonObject = new JSONObject(response);

            if (jsonObject.getString("status").equals("true")) {

                JSONArray dataArray = jsonObject.getJSONArray("registros");

                int cuenta = jsonObject.getInt("totRegistros");

                String temporal[] = new String[cuenta];


                for (int i = 0; i < dataArray.length(); i++) {

                    JSONObject dataobj = dataArray.getJSONObject(i);

                    /** Concatena cada campo de la linea en el Arreglo */

                    temporal[i] = dataobj.getString("nombre") +", " +dataobj.getString("clave") +", "+

                            dataobj.getString("calificacion");


                }


                // Copia el arreglo temporal hacia el que se utiliza en el ListView

                arregloRegistrosBD = temporal.clone();

            }else{

                Toast.makeText(Actividad2.this,"No devolvió registros el servidor",Toast.LENGTH_LONG).show();

            }


        } catch (JSONException e) {

            e.printStackTrace();

        }




    }


}



--------------



6. En activity_main.xml crear un boton y un TextView dentro de un scrollview (solo para ver resultados, es opcional)


-------------

activity_main.xml

-------------


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

<LinearLayout

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="match_parent"

    android:layout_height="match_parent">


    <Button

        android:id="@+id/buttonVolley"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:onClick="buscaVolley"

        android:text="Buscar con Volley" />



    <ScrollView

        android:layout_width="match_parent"

        android:layout_height="match_parent">


        <LinearLayout

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:orientation="vertical" >


            <TextView

                android:id="@+id/TextView01"

                android:layout_width="match_parent"

                android:layout_height="match_parent"

                android:textSize="8pt" />

        </LinearLayout>

    </ScrollView>



</LinearLayout>


-------------





7. En MainActivity.java colocar el código para hacer la consulta con Volley, en este Activity se hace la conexión con Volley y se pasa el resultado a Actividad2


Inicializar cola de peticiones Volley


Conectar al servidor donde esta el script "https://nombreDeServidor/ejemplo/indexJson2.php"



-------------

MainActivity.java

-------------

import androidx.appcompat.app.AppCompatActivity;



import android.content.Intent;

import android.os.Bundle;

import android.view.View;

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.StringRequest;

import com.android.volley.toolbox.Volley;

import java.util.HashMap;


import java.util.Map;

import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONObject;


public class MainActivity extends AppCompatActivity {

    private TextView salida;

    private RequestQueue requestQueue;


    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        salida = (TextView) findViewById(R.id.TextView01);


        //Inicializa cola de Volley

        requestQueue = Volley.newRequestQueue(this);


    }


    // Volley

    public void buscaVolley(View v){

        /**

         * Conecta al servidor utilizando Volley con POST

         * El servidor devuelve un ObjetoJSON con 3 campos: registros, status

         * Se le pueden pasar parámetros a través de un HashMap

         * Más información de Volley en : https://demonuts.com/android-volley/

         */


        // En la siguiente línea se debe sustituir con el nombreDelServidor

        String URLline = "https://nombreDelServidor.com/ejemplo/indexJson2.php";

        


        /** Para pasar algun parámetro al servidor por POST, se crean propiedades

         *  que obtienen información de los EditText, ejemplo: siguientes 2 lineas

         *  */


        //final String username = etUname.getText().toString().trim();

        //final String password = etPass.getText().toString().trim();


        StringRequest stringRequest = new StringRequest(Request.Method.POST, URLline,

                new Response.Listener<String>() {

                    @Override

                    public void onResponse(String response) {

                        Toast.makeText(MainActivity.this,"Conectando usando Volley",Toast.LENGTH_SHORT).show();


                        // LINEA SIGUIENTE CANCELADA Muestra los registros en TextView: salida

                        //parseData(response);


                        // Lanza Actividad2 y envia String con JSONarray: miArreglo

                        Intent i=new Intent(MainActivity.this, Actividad2.class);

                        i.putExtra("miArreglo", response);

                        startActivity(i);


                    }


                },

                new Response.ErrorListener() {

                    @Override

                    public void onErrorResponse(VolleyError error) {

                        Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_LONG).show();

                        salida.setText("Error de Volley, posible falla en conexión \n"+error.toString());

                    }

                }){


            @Override


            protected Map<String,String> getParams(){

                /**

                 *   Cada parámetro que se pasa al Servidor por POST, se coloca en el HashMap

                 * */


                Map<String,String> params = new HashMap<String, String>();

                // 2 Lineas CANCELADAS, muestran ejemplo de paso de parámetros

                //params.put("username",username);

                //params.put("password",password);


                return params;

            }

        };

        requestQueue.add(stringRequest);

    }


    public void parseData(String response) {

        /**

         * 1. Convierte String a JSONObject y separa los campos del JSONarray: registros, status

         * 2. Separa los campos de cada línea del arreglo: registros

         */


        try {

            JSONObject jsonObject = new JSONObject(response);

            if (jsonObject.getString("status").equals("true")) {

                JSONArray dataArray = jsonObject.getJSONArray("registros");

                for (int i = 0; i < dataArray.length(); i++) {

                    JSONObject dataobj = dataArray.getJSONObject(i);

                    /** Concatena cada linea en el TextView salida */

                    salida.append(dataobj.getString("nombre") +"  ");

                    salida.append(dataobj.getString("clave") +"  ");

                    salida.append(dataobj.getString("calificacion") +"\n");

                }

                //Intent intent = new Intent(MainActivity.this,HobbyActivity.class);

                //startActivity(intent);

            }

        } catch (JSONException e) {

            e.printStackTrace();

        }

    }


}

------------- Termina MainActivity.java

Proyectos 2024. Desarrollo de Aplicaciones Móviles. UAT-FIC

Profesor: Dr. Juan José Garza Saldaña   Facultad de Ingeniería y Ciencias Universidad Autónoma de Tamaulipas Los estudiantes de la materia d...