pendientes - Actualización automática para aplicaciones de Android(privadas)
actualizar play store 2018 (6)
Actualizar aplicación Asegúrate de que ya tienes tu nueva descarga de apk en la ubicación
void installNewVersion(String location) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(location + "app-debug.apk")),
"application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
Estoy desarrollando una aplicación Android no pública, es decir, la aplicación no estará disponible en el Android Market global. La aplicación se instalará en un número limitado de clientes, por ejemplo, mediante el uso de un archivo apk. ¿Cómo puedo habilitar una funcionalidad de actualización automática en esta aplicación?
Veo diferentes opciones potenciales (no sé si son técnicamente difíciles o incluso imposibles de implementar o si existen funcionalidades que se pueden reutilizar):
- En cada lanzamiento, la aplicación prueba si existe una nueva versión (solicitando un servidor), si es así, descarga la nueva apk y se reemplaza a sí misma con la nueva versión.
- Use (¿o desarrolla?) Una aplicación o servicio separado que lleve a cabo el proceso de actualización y verificación y reemplazo.
- Utilice (¿o desarrolla?) Una aplicación de mercado privado que tenga una opción de actualización automática. Esta opción es similar a la segunda, pero más genérica: la aplicación de mercado estaría conectada a un repositorio, es decir, manejaría un número arbitrario de aplicaciones (privadas).
Preferiría la opción uno, ya que la funcionalidad de actualización automática está incluida en la aplicación que necesita menos esfuerzos de desarrollo.
Algunos de los permisos que usaremos para hacer esto son los siguientes:
<uses-permission android:name="android.permission.ACCESS_SUPERUSER" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Déjame explicarte un poco ... El último, WRITE_EXTERNAL_STORAGE, se explica por sí mismo. Con ACCESS_SUPERUSER le diremos al sistema que pretendemos usar privilegios de root. Se necesitará READ_EXTERNAL_STORAGE en el futuro para que su aplicación lea archivos en la tarjeta SD.
Suponiendo que haya descargado el archivo y que todos esos dispositivos puedan ser rooteados (número limitado de clientes, no en Play, etc.), podría hacer esto:
String filePath = Environment.getExternalStorageDirectory().toString() + "/your_app_directory/your_app_filename.apk";
Process installProcess = null;
int installResult = -1337;
try {
installProcess = Runtime.getRuntime().exec("su -c pm install -r " + filePath);
} catch (IOException e) {
// Handle IOException the way you like.
}
if (installProcess != null) {
try {
installResult = installProcess.waitFor();
} catch(InterruptedException e) {
// Handle InterruptedException the way you like.
}
if (installResult == 0) {
// Success!
} else {
// Failure. :-/
}
} else {
// Failure 2. :-(
}
Creo que la primera opción es la menor cantidad de trabajo para usted, y en realidad la más limpia también, ya que pasará por el canal adecuado de uso del instalador de paquetes integrado de Android, que incluye notificaciones al usuario y la opción para que el usuario aborte la instalación si deseado.
Ya lo tiene todo descrito: busque una nueva versión en un servidor (sería bueno darle al usuario la opción de desactivarla), y si hay una nueva versión, puede enlazar a la URL con el APK (que, IIRC, usará el administrador de descargas del navegador para descargarlo), o puede descargarlo con su aplicación y luego apuntar la intención a su archivo local. El uso del enlace HTTP es técnicamente menos laborioso y más limpio: cuanto más deje que el sistema operativo haga, mejor, a menos que haya una razón para no hacerlo.
Este podría ser un método muy aburrido, pero para algunas empresas, si cree que es aplicable, este podría ser muy fácil de implementar.
- Cree una pantalla de contraseña (passwordActivity) que solicite una contraseña para acceder a la aplicación.
- Una vez que se ingresa la contraseña, levante una bandera (establezca un valor booleano de falso a verdadero usando las preferencias compartidas)
- Coloque el archivo .apk en Google Store.
- Cambie la contraseña una vez que todos instalen la aplicación y lance una nueva actualización en Google Play Store.
Dado que el software va a almacenar en caché el valor del indicador, la pantalla de contraseña no se mostrará, incluso si la contraseña cambia. Solo se mostrará para nuevas instalaciones, por lo que es posible que deba repetir el proceso.
Nota: este método podría encajar mejor si no hay cientos de usuarios que utilizan la aplicación. Y no olvides que este método tampoco es seguro. En resumen, si está buscando una manera de mantener la aplicación privada y no tiene problemas de seguridad, esto es lo que recomiendo.
La habilitación de "Instalar una aplicación que no sea de mercado" aún es necesaria para cualquier aplicación fuera de Google Play. Si no está habilitado, el proceso de instalación lo solicitará y redirigirá al usuario a la Configuración de la aplicación, y después de eso, el usuario puede instalar la aplicación.
Dependiendo de sus necesidades, puede delegar a una tercera parte lib.
janjonas, en la empresa donde trabajo, tuvimos un problema similar con Windows Mobile 6.x, y usamos casi la misma solución señalada por EboMike:
La aplicación principal verifica si está actualizada, contra un servicio web. Recibe la versión actual y la URL desde donde se descarga la nueva versión, si es necesario. La aplicación principal luego inicia la aplicación Updater, pasa la URL y se cierra.
El Actualizador realiza la descarga del nuevo programa, a través de HTTP, mostrando al usuario el% descargado. El usuario puede cancelar la descarga en cualquier momento, de forma controlada, y el Actualizador puede registrar esta cancelación.
Desde que se descargó la nueva aplicación, el Actualizador ejecuta la nueva aplicación y se cierra.