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
____________________________
144.- Extensiones. Instalar una aplicación. Avisar de una nueva versión.
- Vamos a crear ver una extensión para instalar una aplicación.
- Esta extensión funciona con versiones antiguas de Android 5, 6... pero no funciona con las nuevas versiones 9, 10...
- Suministramos la dirección de la aplicación en la variable pathApp, por ejemplo: /mnt/sdcard/Download/mi_app.apk
com.KIO4_Install.aix Android 5, 6, 7, 8
com.KIO4_Install_v2.aix Android 9
- Para que funcione correctamente esta extensión, debes instalar la aplicación que la ejecuta. No funciona en emulación con el MIT Companion.
---------------------------------------------------------
- Creación de la extensión.
- Nuestra extensión, será el archivo KIO4_Install.java.
- Vamos a un Editor de Texto, te recomiendo el Notepad++, creamos un archivo llamado KIO4_Install.java y pegamos el siguiente código:
Para Android 5, 6
KIO4_Install.java |
package com.KIO4_Install;
// © Juan Antonio Villalpando
// kio4.com
// Instalar una aplicacion. Febrero 2018.
// En Android 9 da este error: exposed beyond app through Intent.getData()
import com.google.appinventor.components.annotations.DesignerComponent;
import com.google.appinventor.components.annotations.DesignerProperty;
import com.google.appinventor.components.annotations.PropertyCategory;
import com.google.appinventor.components.annotations.SimpleEvent;
import com.google.appinventor.components.annotations.SimpleFunction;
import com.google.appinventor.components.annotations.SimpleObject;
import com.google.appinventor.components.annotations.SimpleProperty;
import com.google.appinventor.components.annotations.UsesPermissions; // Permisos
import com.google.appinventor.components.common.ComponentCategory;
import com.google.appinventor.components.common.PropertyTypeConstants;
import com.google.appinventor.components.runtime.util.MediaUtil;
import com.google.appinventor.components.runtime.*;
import android.app.Activity;
import android.content.Intent;
import android.content.Context;
import android.net.Uri;
import java.lang.reflect.Method;
@DesignerComponent(version = KIO4_Install.VERSION,
description = "Install an app. Set path. Example: /mnt/sdcard/My Documents/Downloads/my_app.apk. "
+ "Juan Antonio Villalpando - KIO4.COM ",
category = ComponentCategory.EXTENSION,
nonVisible = true,
iconName = "http://juanant91.byethost3.com/bajar2.png")
@SimpleObject(external = true)
@UsesPermissions(permissionNames = "android.permission.WRITE_EXTERNAL_STORAGE, android.permission.READ_EXTERNAL_STORAGE")
public class KIO4_Install extends AndroidNonvisibleComponent implements Component {
public static final int VERSION = 1;
private ComponentContainer container;
private Context context;
public KIO4_Install(ComponentContainer container) {
super(container.$form());
this.container = container;
context = (Context) container.$context();
}
////////////////////// FUNCION //////////////////////////////////////////////////////////////////////
// Funcion de la instalacion.
@SimpleFunction(description = "Install app. Set app path. Example: /mnt/sdcard/Download/my_app.apk")
public void Install(String pathApp) {
String path = "file://" + pathApp;
// String path = "content://" + pathApp;
try{
Method m = StrictMode.class.getMethod("disableDeathOnFileUriExposure");
m.invoke(null);
}catch(Exception e){
e.printStackTrace();
}
Intent instalacion = new Intent(android.content.Intent.ACTION_VIEW);
instalacion.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Agregado.
instalacion.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
instalacion.setDataAndType(Uri.parse(path), "application/vnd.android.package-archive" );
context.startActivity(instalacion);
}
} // ==> FIN
|
- Ese archivo lo copiamos en:
C:\Users\juan\appinventor-sources\appinventor\components\src\com\google\appinventor\components\runtime
- La extensión se creará en...
C:\Users\juan\appinventor-sources\appinventor\components\build\extensions
- La siguiente versión es para Android 7, 8, 9
KIO4_Install_v2.java |
package com.KIO4_Install_v2;
// © Juan Antonio Villalpando
// kio4.com
// Instalar una aplicacion. Febrero 2018. Marzo 2020
import com.google.appinventor.components.annotations.DesignerComponent;
import com.google.appinventor.components.annotations.DesignerProperty;
import com.google.appinventor.components.annotations.PropertyCategory;
import com.google.appinventor.components.annotations.SimpleEvent;
import com.google.appinventor.components.annotations.SimpleFunction;
import com.google.appinventor.components.annotations.SimpleObject;
import com.google.appinventor.components.annotations.SimpleProperty;
import com.google.appinventor.components.annotations.UsesPermissions; // Permisos
import com.google.appinventor.components.common.ComponentCategory;
import com.google.appinventor.components.common.PropertyTypeConstants;
import com.google.appinventor.components.runtime.util.MediaUtil;
import com.google.appinventor.components.runtime.*;
import android.app.Activity;
import android.content.Intent;
import android.content.Context;
import android.net.Uri;
import android.support.v4.content.FileProvider;
import java.io.File;
@DesignerComponent(version = KIO4_Install_v2.VERSION,
description = "Install an app. Set path. Example: /mnt/sdcard/My Documents/Downloads/my_app.apk. Works with Android 9."
+ "Juan Antonio Villalpando - KIO4.COM ",
category = ComponentCategory.EXTENSION,
nonVisible = true,
iconName = "http://juanant91.byethost3.com/bajar2.png")
@SimpleObject(external = true)
@UsesPermissions(permissionNames = "android.permission.WRITE_EXTERNAL_STORAGE, android.permission.READ_EXTERNAL_STORAGE," +
"android.permission.READ_PHONE_STATE, android.permission.ACCESS_WIFI_STATE, android.permission.ACCESS_NETWORK_STATE," +
"android.permission.INTERNET, android.permission.REQUEST_INSTALL_PACKAGES, android.permission.ACCESS_COARSE_LOCATION")
public class KIO4_Install_v2 extends AndroidNonvisibleComponent implements Component {
public static final int VERSION = 2;
private ComponentContainer container;
private Context context;
public KIO4_Install_v2(ComponentContainer container) {
super(container.$form());
this.container = container;
context = (Context) container.$context();
}
////////////////////// FUNCION //////////////////////////////////////////////////////////////////////
// Funcion de la instalacion.
@SimpleFunction(description = "Install app. Set app path. Example: /mnt/sdcard/Download/my_app.apk")
public void Install(String pathApp) {
// String path = "file://" + pathApp;
// File archivo = new File("/mnt/sdcard/My Documents/Downloads", pathApp);
File archivo = new File(pathApp);
Intent instalacion = new Intent(android.content.Intent.ACTION_VIEW);
instalacion.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
instalacion.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Agnadi esto luego.
Uri pdfURI = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".provider", archivo);
instalacion.setDataAndType(pdfURI, "application/vnd.android.package-archive" );
context.startActivity(instalacion);
}
} // ==> FIN
|
- La siguiente versión es para Android 5, 6, 7, 8 y 9 (en Android 10 no funciona)
KIO4_Install_v3.java |
package com.KIO4_Install_v3;
// © Juan Antonio Villalpando
// kio4.com
// Instalar una aplicacion. Febrero 2018. Marzo 2020
import com.google.appinventor.components.annotations.DesignerComponent;
import com.google.appinventor.components.annotations.DesignerProperty;
import com.google.appinventor.components.annotations.PropertyCategory;
import com.google.appinventor.components.annotations.SimpleEvent;
import com.google.appinventor.components.annotations.SimpleFunction;
import com.google.appinventor.components.annotations.SimpleObject;
import com.google.appinventor.components.annotations.SimpleProperty;
import com.google.appinventor.components.annotations.UsesPermissions; // Permisos
import com.google.appinventor.components.common.ComponentCategory;
import com.google.appinventor.components.common.PropertyTypeConstants;
import com.google.appinventor.components.runtime.util.MediaUtil;
import com.google.appinventor.components.runtime.*;
import android.app.Activity;
import android.content.Intent;
import android.content.Context;
import android.net.Uri;
import android.support.v4.content.FileProvider;
import java.io.File;
import android.os.Build;
@DesignerComponent(version = KIO4_Install_v3.VERSION,
description = "Install an app. Set path. Example: /mnt/sdcard/My Documents/Downloads/my_app.apk."
+ "Juan Antonio Villalpando - KIO4.COM ",
category = ComponentCategory.EXTENSION,
nonVisible = true,
iconName = "http://juanant91.byethost3.com/bajar2.png")
@SimpleObject(external = true)
@UsesPermissions(permissionNames = "android.permission.WRITE_EXTERNAL_STORAGE, android.permission.READ_EXTERNAL_STORAGE," +
"android.permission.READ_PHONE_STATE, android.permission.ACCESS_WIFI_STATE, android.permission.ACCESS_NETWORK_STATE," +
"android.permission.INTERNET, android.permission.REQUEST_INSTALL_PACKAGES, android.permission.ACCESS_COARSE_LOCATION")
public class KIO4_Install_v3 extends AndroidNonvisibleComponent implements Component {
public static final int VERSION = 2;
private ComponentContainer container;
private Context context;
public KIO4_Install_v3(ComponentContainer container) {
super(container.$form());
this.container = container;
context = (Context) container.$context();
}
////////////////////// FUNCION //////////////////////////////////////////////////////////////////////
// Funcion de la instalacion.
@SimpleFunction(description = "Install app. Set app path. Example: /mnt/sdcard/Download/my_app.apk")
public void Install(String pathApp) {
int version_api = Build.VERSION.SDK_INT;
if (version_api < 24){
String path = "file://" + pathApp;
Intent instalacion = new Intent(android.content.Intent.ACTION_VIEW);
instalacion.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
instalacion.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Agnadi esto luego.
instalacion.setDataAndType(Uri.parse(path), "application/vnd.android.package-archive" );
context.startActivity(instalacion); }
else {
File archivo = new File(pathApp);
Intent instalacion = new Intent(android.content.Intent.ACTION_VIEW);
instalacion.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
instalacion.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Agnadi esto luego.
Uri pdfURI = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".provider", archivo);
instalacion.setDataAndType(pdfURI, "application/vnd.android.package-archive" );
context.startActivity(instalacion);
}
}
} // ==> FIN
|
_______________
- Ejemplo.
- Podemos subir un archivo .apk a nuestro servidor web.
- Lo podemos bajar a nuestro móvil mediante en componente web.
- Se baja a:
/mnt/sdcard/My Documents/Downloads/app_inventor_15678912345.tmp
- Mediante el bloque ObtuvoArchivo y nombreDeArchivo podemos indicar al pathApp, dónde tenemos el archivo que queremos instalar.
- Se instalará guiado por el usuario.
- Observa que aunque el archivo termine en .tmp es un archivo de instalación.
________________________
- Otro ejemplo.
- En 129C_actualizar_instalar.htm
___________________________
|