2010-11-29 17 views
50

Estoy desarrollando una aplicación de 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, p. mediante el uso de un archivo apk. ¿Cómo puedo habilitar una funcionalidad de actualización automática en esta aplicación?Actualización automática para aplicaciones de Android (privadas)

veo diferentes opciones posibles (no sé si esas son técnicamente difíciles o incluso imposibles de implementar o si hay algún funcionalidades existentes que pueden ser reutilizados):

  • En cada lanzamiento de las pruebas de aplicación, si existe una nueva versión (solicitando un servidor), si es así descarga el nuevo apk y se reemplaza con la nueva versión.
  • Use (o desarrolle?) Una aplicación o servicio separado que se encargue de la actualización y el proceso de reemplazo.
  • Utilice (o desarrolle?) Una aplicación de mercado privado que tiene 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.

+1

'y sustituye a sí mismo con la nueva version' Eso va a requerir privilegios de root. Como probablemente sea cualquier solución para esto. Creo en el firmware Android predeterminado, el usuario debe interactuar para instalar una aplicación. No hay forma de burlarse de eso sin root o un firmware personalizado. – Falmarri

+0

Por supuesto, se requerirá la interacción del usuario para aprobar la actualización, también para todo el mercado. Si realmente desea obligarlos, la versión anterior podría negarse a trabajar después de que se detecte que hay uno nuevo disponible. –

+14

Google debería proporcionar la funcionalidad para actualizar automáticamente una aplicación desde una APK alojada de forma privada, para que no sea necesario reinventar la rueda con los actualizadores personalizados. – Jim

Respuesta

6

Creo que la opción uno es la menor cantidad de trabajo para usted, y la más limpia ya que pasará por el canal apropiado de usar el instalador de paquetes incorporado de Android que incluye notificación al usuario y la opción para el usuario abortar la instalación si lo desea.

Ya lo tienes todo resumido: busca 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, puedes simplemente vincularla al 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 el intento a su archivo local. Usar el enlace HTTP es, técnicamente, menos trabajo y más limpio: cuanto más dejes que el sistema operativo funcione, mejor, a menos que haya una razón para no hacerlo.

+0

Gracias por su respuesta. Voy a probar la opción uno: la aplicación descarga un archivo apk y comienza el proceso de instalación. Como se menciona en los otros comentarios, se requiere una interacción del usuario para confirmar la actualización. Esta pregunta http: // stackoverflow.com/questions/3938926/android-start-intent-to-view-apk muestra cómo iniciar el archivo apk descargado. – janjonas

18

janjonas, en la empresa donde trabajo hemos tenido un problema similar con Windows Mobile 6.x, y utilizar más o menos la misma solución apuntada por EboMike:

enter image description here

La comprobación de la aplicación principal si es actualizado, contra un servicio web. Recibe la versión actual & de la URL desde donde descargar la nueva versión, si es necesario. La aplicación principal inicia la aplicación Updater, pasa la URL y abandona.

The Updater realizan 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.

Como la nueva aplicación se descargó, el programa de actualización ejecuta la nueva aplicación y se cierra.

1

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" /> 

Vamos a explicar un poco ... El último, WRITE_EXTERNAL_STORAGE, se explica por sí. Con ACCESS_SUPERUSER le diremos al sistema que tenemos la intención de usar los privilegios de root. READ_EXTERNAL_STORAGE será necesario en el futuro para que su aplicación pueda leer los archivos en la tarjeta SD.

Suponiendo que haya descargado el archivo y que todos esos dispositivos pueden ser arraigada (número limitado de clientes, no en el juego, etc.), que 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. :-(
} 
+0

Hola Nikola, seguí tu paso pero no se está instalando apk. "installProcess.waitFor()" devuelve el valor de 255 y la instalación falló. ¿Conoces la solución para eso? –

+0

@SantoshSah: No sé qué lo está causando, pero ese código de salida le dice lo que ya sabe: esa instalación no fue exitosa. ¿Está rooteado el dispositivo? –

3

de Habilitación "no instalar aplicación de mercado "todavía se necesita para cualquier aplicación fuera de Google Play. Si no está habilitado, el proceso de instalación lo va a solicitar y redirigir al usuario a la Configuración de la aplicación, y luego de eso, el usuario puede instalar la aplicación.

Dependiendo de sus necesidades, puede delegar en una lib de tercera parte.

0

Aquí podría ser un método muy poco convincente, pero para algunas compañías, si cree que es aplicable, esto podría ser muy fácil de implementar.

  • Crear una pantalla de contraseña (passwordActivity) que solicita una contraseña para acceder a la aplicación.
  • Una vez que se ingresa la contraseña, marque 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 hayan instalado la aplicación y lance una nueva actualización en Google Play Store.

Puesto que el software se va a almacenar en caché el valor del indicador, la pantalla de contraseña ganó el `t aparece incluso cuando la clave es el cambio. Solo se mostrará para instalaciones nuevas, por lo que podría necesitar repetir el proceso.

Nota: Este método podría ajustarse mejor si no hay cientos de usuarios que usan la aplicación. Y no te olvides que este método tampoco es seguro. En resumen, si buscas una manera de mantener la aplicación privada y no tener problemas de seguridad, esto es lo que recomiendo.

0

actualización de la aplicación Asegúrese de que usted ya tiene su nueva descarga del apk de 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); 

} 
Cuestiones relacionadas