App inventor 2 en español
Cómo programar los teléfonos móviles con Android
mediante App inventor 2 - Juan Antonio Villalpando
-- Tutorial de iniciación de App Inventor 2 en español --
Volver al índice del tutorial
____________________________
146.- Archivos dentro de la extensión. Rush.
- Vamos a crear archivos dentro de la extensión y leerlo.
________________________
1.- Introducir archivos dentro de la extensión.
- Mediante Rush creamos una extensión llamada: com.juan.dentro
- Mediante un Editor de texto creamos un archivo de texto y lo llamamos: interno.txt
interno.txt |
Uno, dos, tres.
One, two, three.
Hola amigo.
Hello friend.
|
- También crearemos este archivo pitagoras.htm, que contiene un código JavaScript.
pitagoras.htm |
<!DOCTYPE html>
<html><head></head><body>
<script>
datos = window.AppInventor.getWebViewString(); // Entrada de datos.
datos = datos + ":";
catetos = datos.split(":");
cateto1 = catetos[0];
cateto2 = catetos[1];
hipotenusa = Math.sqrt(Math.pow(cateto1, 2) + Math.pow(cateto2, 2)) ;
window.AppInventor.setWebViewString("" + hipotenusa); // Salida datos
</script>
</body></html>
|
- Esta imagen también la utilizaremos: perro.png
- Estos tres archivos los copiamos en la carpeta assets de la extensión que estamos creando.
C:\rush\exe\win\dentro\assets
- Vamos al archivo de Rush: rush.yml
C:\rush\exe\win\dentro\rush.yml
rush.yml |
assets:
# Extension icon. This can be a URL or a local image in 'assets' folder.
icon: icon.png
# Extension assets.
other:
- interno.txt
- perro.png
- pitagoras.htm
|
- Vamos a la parte de assets. Observa la línea de other, he añadido:
- interno.txt
- perro.png
- pitagoras.htm
- En ese archivo es muy importante la indentación, es decir el espaciado y los márgenes; no debes cambiar la indentación.
- Si ahora volvemos a compilar la extensión mediante ..\rush build, obtendremos los archivos: interno.txt, perro.png y pitagoras.htm dentro de la extensión.
- Descompilamos la extensión con Java Decompiler
- Fíjate que los archivos están en: com.juan.dentro/assets
________________________
2.- El assets en App Inventor.
- Hasta septiembre de 2021 el directorio assets de App Inventor, para utilizarlo con el emulador MIT Companion, estaba en:
/mnt/sdcard/AppInventor/assets/
es lo mismo que...
/storage/emulated/0/AppInventor/assets/
- Ahora lo han cambiado, si utilizas Android < 10 se encontrará en:
/storage/emulated/0/Android/data/edu.mit.appinventor.aicompanion3/files/AppInventor/assets
- Si utilizas un Android >= 10 se encontrará en:
/storage/emulated/0/Android/data/edu.mit.appinventor.aicompanion3/files/assets
- Podemos comprobarlo mediante estos bloques, ejecutándolo desde el MIT Companion:
- Obtendremos (en Android < 10):
file:///storage/emulated/0/Android/data/edu.mit.appinventor.aicompanion3/files/AppInventor/assets
- Si compilamos la aplicación y la ejecutamos, obtendremos esta dirección de assets:
file:///android_asset
________________________
3.- Lectura del archivo en MIT Companion e Instalado.
cadiz.aia
- Vamos a leer el archivo interno.txt desde MIT Companion e Instalado, con el componenten Archivo.
- Además también ejecutaremos el script que se encuentra en pitagoras.htm.
- Y mostraremos la imagen del perro.png
- He creado una aplicación llamada cadiz.aia con la extensión com.juan.dentro.aix, he guardado el archivo .aia y lo he descomprimido con Winrar.
- Con el descompresor vamos al directorio:
assets\external_comps\com.juan.dentro\assets
- observamos:
- interno.txt
- perro.png
- pitagoras.htm
- Compilo la aplicación y obtengo cadiz.apk, mediante APK Editor Studio, lo descompilo y obtengo:
- Observa los archivos del assets "normal": saludos.txt y gato.png
- y los archivos internos de la extensión que se encuentra dentro del assets "normal" y además en com.juan.dentro
_____________________________
- Diseño.
- He añadido al asset el archivo saludos.txt y la imagen gato.png, para comparar la localización de estos archivos con respecto al interno.txt
_____________________________
- Bloques.
________________________
4.- Código de la extensión.
- Este es el código de la extensión, simplemente tiene un bloque para copiar archivos desde el asset.
- Nota: he añadido una función para copiar archivos desde el asset a otro directorio. Esta función no es necesaria, simplemente la he puesto para comprobar su funcionamiento.
dentro.java |
package com.juan.dentro;
// Juan Antonio Villalpando
// http://kio4.com/appinventor/146_extension_archivo_rush.htm
import com.google.appinventor.components.annotations.SimpleFunction;
import com.google.appinventor.components.annotations.DesignerProperty;
import com.google.appinventor.components.annotations.SimpleProperty;
import com.google.appinventor.components.annotations.PropertyCategory;
import com.google.appinventor.components.common.PropertyTypeConstants;
import com.google.appinventor.components.common.ComponentCategory;
import com.google.appinventor.components.annotations.SimpleEvent;
import com.google.appinventor.components.runtime.AndroidNonvisibleComponent;
import com.google.appinventor.components.runtime.ComponentContainer;
import android.content.Context;
import java.io.*;
public class Dentro extends AndroidNonvisibleComponent {
private Context context;
public Dentro(ComponentContainer container) {
super(container.$form());
context = (Context) container.$context();
}
//////// Copiar archivo desde el Asset a un directorio indicando nombre archivo
@SimpleFunction(description="Copy file from asset (or subfolder asset) to path. " +
"Example with subfolder, fileName: com.juan.dentro/texto.txt " +
"dest: /storage/emulated/../absolute address/../namefile.ext")
public void CopyFileAsset(String fileName, String dest) throws Exception {
InputStream stream = null;
OutputStream output = null;
stream = context.getAssets().open(fileName);
output = new BufferedOutputStream(new FileOutputStream(dest));
byte data[] = new byte[1024];
int count;
while((count = stream.read(data)) != -1)
{ output.write(data, 0, count); }
output.close();
stream.close();
}
} // => Fin
|
________________________
5.- AndroidManifest.xml
AndroidManifest.xml |
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.juan.dentro">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application>
<!-- <activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> -->
</application>
</manifest>
|
________________________
________________________
________________________
________________________
- Archivo JavaScript. Siege de Eratóstenes. Cálculo de números primos.
- Cálculo de números primos menores a uno dado.
https://community.appinventor.mit.edu/t/insert-files-into-the-extension-using-rush-javascript-from-extension/47134/14
primos.java |
package j.f;
import com.google.appinventor.components.annotations.SimpleFunction;
import com.google.appinventor.components.runtime.AndroidNonvisibleComponent;
import com.google.appinventor.components.runtime.ComponentContainer;
public class F extends AndroidNonvisibleComponent {
public F(ComponentContainer container) {
super(container.$form());
}
@SimpleFunction(description="http://localhost/j.f/sieve.htm")
public String Sieve() {
return "http://localhost/j.f/sieve.htm";
}
}
|
rush.yml |
assets:
# Extension icon. This can be a URL or a local image in 'assets' folder.
icon: icon.png
# Extension assets.
other:
- sieve.htm
|
___________________________
|