|     Inicio    |   |         |  |   FOROS      |  |      |      
   Elastix - VoIP B4A (Basic4Android) App inventor 2 PHP - MySQL
  Estación meteorológica B4J (Basic4Java) ADB Shell - Android Arduino
  Raspberry Pi Visual Basic Script (VBS) FireBase (BD autoactualizable) NodeMCU como Arduino
  AutoIt (Programación) Visual Basic Cosas de Windows Webs interesantes
Translate:
Búsqueda en este sitio:


.

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

___________________________

 

- Mi correo:
juana1991@yahoo.com
- KIO4.COM - Política de cookies. Textos e imágenes propiedad del autor:
© Juan A. Villalpando
No se permite la copia de información ni imágenes.
Usamos cookies propias y de terceros que entre otras cosas recogen datos sobre sus hábitos de navegación y realizan análisis de uso de nuestro sitio.
Si continúa navegando consideramos que acepta su uso. Acepto    Más información