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: