PDA

Ver la Versión Completa : Actualizar aplicación Android desde internet.


ciberdrac
08/06/15, 16:31:43
Hola, quería preguntar como podría implementar una opción en un programa para su posible actualización desde un sitio de internet, ( pagina web, dropbox, drive, etc.), me refiero a que cuando el usuario pulse la opción actualizar, la aplicación revise en el sitio predeterminado para ello si hay alguna actualización disponible y la baje si es el caso.

resumiendo, me refiero a la posibilidad de actualizar una aplicación vía internet sin tener que depender del Google Play,. espero haberme explicado bien.

Un saludo.

kriogeN
08/06/15, 16:48:59
Realizando la descarga del APK con el DownloadManager. Luego puedes hacer que el APK se lance al terminar la descarga.

El usuario siempre tendrá que aceptar la actualización, ya que le saldrá como si fuese una instalación nueva del APK sólo que indicando los permisos que realmente son nuevos.

Si buscas una manera de hacerlo automáticamente como hace Google Play, no se puede, al menos sin ser Root. Ni siquiera tiendas alternativas como Amazon Apps pueden hacerlo automáticamente.

TheXicotet
08/06/15, 20:10:22
KriogeN tiene toda la razón, sin embargo, puedes avisar de forma automática que hay una actualización disponible de la siguiente manera:

-Creas una clase de java en tu aplicacion que se conecte a tu servidor cuando haya un evento (por tiempo o cuando le de el usuario a un boton, por ejemplo). La clase java mandará al server la rev. en la que está la aplicación instalada y tú la comparas con la que hay para descargarse.

if(revInstalada!=revDescarga) descargasAplicación();

Una vez descargada puedes hacer (como bien ha dicho kriogeN) que se instale automáticamente (eso si, el usuario debe aceptar los permisos que utiliza la aplicación, etc.). Como la aplicación que se instala tiene el mismo nombre de paquete que la antigua y solo cambia la rev. android te sustituirá la aplicación antigua por la nueva.

Un saludo

ciberdrac
09/06/15, 12:26:46
Gracias, la teoría la he captado, la solución de kriogeN no la veo adecuada, ya que el usuario para comprobar si la aplicación tiene algún cambio debería descargarla, me resulta más interesante la alternativa tuya TheXicotet, lo que no tengo ni idea es como obtener la revisión de la aplicación que tenemos para descargar, agradecería un ejemplo de como averiguar si la versión instalada de la aplicación es anterior a la versión que tenemos para descargar.

Un saludo y gracias.

kriogeN
09/06/15, 16:23:26
Gracias, la teoría la he captado, la solución de kriogeN no la veo adecuada, ya que el usuario para comprobar si la aplicación tiene algún cambio debería descargarla, me resulta más interesante la alternativa tuya TheXicotet, lo que no tengo ni idea es como obtener la revisión de la aplicación que tenemos para descargar, agradecería un ejemplo de como averiguar si la versión instalada de la aplicación es anterior a la versión que tenemos para descargar.

Un saludo y gracias.

Yo no te he dicho que la descargues siempre, lo que quería decir es lo mismo que dice TheXicotet.

Lo que trababa de indicar es que no puedes hacer una actualización automática como hace Google Play, siempre tendrá que descargar el APK nuevo e instalarlo con la autorización del usuario. Una vez comprobado que efectivamente es nuevo.

En cuanto a como comprobar si la versión es nueva, necesitarás un servicio web que te lo indique (por ejemplo)

TheXicotet
10/06/15, 14:21:44
Gracias, la teoría la he captado, la solución de kriogeN no la veo adecuada, ya que el usuario para comprobar si la aplicación tiene algún cambio debería descargarla, me resulta más interesante la alternativa tuya TheXicotet, lo que no tengo ni idea es como obtener la revisión de la aplicación que tenemos para descargar, agradecería un ejemplo de como averiguar si la versión instalada de la aplicación es anterior a la versión que tenemos para descargar.

Un saludo y gracias.

Lo más fácil es que lo hicieras "manualmente", es decir, subes la nueva apk a tu server sabiendo el número de rev que es, y luego cambias en el código php la constante que se va a comparar con la variable que te va a llegar de la clase java. (no se si es eso lo que querías saber).

mocelet
10/06/15, 18:27:53
Más fácil todavía, sin php, creas un fichero de texto que se llame version.txt accesible por internet (servidor web, carpeta public de dropbox...) y dentro tenga el texto de la última versión. La aplicación lo descarga por HTTP, comprueba si es el mismo valor que la instalada (la que está ejecutándose vaya) y en su caso descarga el APK.

Cuando lances una actualización, actualizas el fichero version.txt y el apk.

La periodicidad de comprobación, lo mejor es que se haga al ejecutar la app y solo si ya pasó tiempo desde la última comprobación (no es plan gastar recursos de red del usuario innecesariamente)

TheXicotet
10/06/15, 21:24:34
Más fácil todavía, sin php, creas un fichero de texto que se llame version.txt accesible por internet (servidor web, carpeta public de dropbox...) y dentro tenga el texto de la última versión. La aplicación lo descarga por HTTP, comprueba si es el mismo valor que la instalada (la que está ejecutándose vaya) y en su caso descarga el APK.

Cuando lances una actualización, actualizas el fichero version.txt y el apk.

La periodicidad de comprobación, lo mejor es que se haga al ejecutar la app y solo si ya pasó tiempo desde la última comprobación (no es plan gastar recursos de red del usuario innecesariamente)

¿Y que cada vez que enciendas la aplicación se descargue un .txt? Veo más "limpio" y útil la comprobación con un .php porque la clase java con la que conectas la puedes hasta "reutilizar" para conectarte a una DB por ejemplo. Además consume menos enviar una petición a un server que descargarte un .txt, es como matar una mosca a cañonazos...

p.d: Es mi punto de vista, pero respeto totalmente el tuyo :)

kriogeN
10/06/15, 21:39:23
¿Y que cada vez que enciendas la aplicación se descargue un .txt? Veo más "limpio" y útil la comprobación con un .php porque la clase java con la que conectas la puedes hasta "reutilizar" para conectarte a una DB por ejemplo. Además consume menos enviar una petición a un server que descargarte un .txt, es como matar una mosca a cañonazos...

p.d: Es mi punto de vista, pero respeto totalmente el tuyo :)

¿Por qué consume menos? Es una petición HTTP igualmente. Lo único es que además del cuerpo con el número de versión también lleva información adicional como el nombre del fichero y su tamaño. ¿De cuanto más hablamos en la descarga? ¿40 bytes? Y eso hablando de la descarga, porque la petición web es exactamente igual.

Además, haciéndolo en PHP te supone tener que usar un servidor. Mientras que con el fichero de texto puede ser un simple fichero compartido en DropBox como ha dicho mocelet.

Estoy de acuerdo en la parte de que es más limpio usando un servidor web (yo todo lo hago con ASP.NET, el PHP no me gusta), y te da muchas más opciones. Pero el tamaño de transferencia no es la excusa.

TheXicotet
10/06/15, 22:56:24
¿Por qué consume menos? Es una petición HTTP igualmente. Lo único es que además del cuerpo con el número de versión también lleva información adicional como el nombre del fichero y su tamaño. ¿De cuanto más hablamos en la descarga? ¿40 bytes? Y eso hablando de la descarga, porque la petición web es exactamente igual.

Además, haciéndolo en PHP te supone tener que usar un servidor. Mientras que con el fichero de texto puede ser un simple fichero compartido en DropBox como ha dicho mocelet.

Estoy de acuerdo en la parte de que es más limpio usando un servidor web (yo todo lo hago con ASP.NET, el PHP no me gusta), y te da muchas más opciones. Pero el tamaño de transferencia no es la excusa.

Yo soy de los que dice: "Ya que haces algo, hazlo bien.". Tienes razón con lo de que la transferencia no es una excusa, eso si, siempre hablando de pocas peticiones al server. Cuanto menos caña le des a un servidor mejor, y si encima puedes darle menos caña al user mejor también. Veo una tontería descargarte un .txt para comprobar la aplicación, eso si, es útil si no tienes servidor ya que como has dicho puedes ponerlo en cualquier server de almacenamiento gratuito.

Saludos! ^^

mocelet
10/06/15, 23:21:08
Yo soy de los que dice: "Ya que haces algo, hazlo bien.". Tienes razón con lo de que la transferencia no es una excusa, eso si, siempre hablando de pocas peticiones al server. Cuanto menos caña le des a un servidor mejor, y si encima puedes darle menos caña al user mejor también. Veo una tontería descargarte un .txt para comprobar la aplicación, eso si, es útil si no tienes servidor ya que como has dicho puedes ponerlo en cualquier server de almacenamiento gratuito.

Saludos! ^^

¿Y que cada vez que enciendas la aplicación se descargue un .txt? Veo más "limpio" y útil la comprobación con un .php porque la clase java con la que conectas la puedes hasta "reutilizar" para conectarte a una DB por ejemplo. Además consume menos enviar una petición a un server que descargarte un .txt, es como matar una mosca a cañonazos...

p.d: Es mi punto de vista, pero respeto totalmente el tuyo :)

A ver, descargar un txt no es guardar un fichero en ningún sitio ni molestar al usuario. Supongo que la confusión te vendrá de ahí.

La diferencia entre acceder a http://servidor/version.php y http://servidor/version.txt desde el punto de vista de red es... ninguna. Y ciertamente el consumo es mucho menor el del txt que no tiene que ejecutar ningún script.

Un .php devuelve un contenido generado dinámicamente fruto de la ejecución del intérprete de PHP y del script php. Cada vez que solicitas esa URL estás ejecutando un programa en el servidor.

Un .txt sin embargo devuelve un contenido estático, si su contenido es "1.0" eso es lo que devuelve. No hay que interpretar nada ni ejecutar nada, el servidor simplemente devuelve el contenido. Y lo hace muy rápido.

Para este caso concreto de simplemente saber rápidamente cuál es la versión actual, la solución de matar moscas a cañonazos es precisamente la de php, y más para el compañero que preguntaba. Añadir lógica de servidor para algo que no la necesita son ganas de complicarse la vida.

De hecho (esto ya para nota xD), con un recurso estático como sería el .txt, se pueden hacer uso de las cabeceras de HTTP If-Modified-Since y Last-Modified, de modo que si el fichero no ha cambiado el servidor devuelve un código 304 Not Modified y no se descarga ni las cabeceras de HTTP. Y esa es la mejor forma de no dar caña a un servidor, no haciéndole trabajar más de lo necesario :)

P.D: Para el caso normal de 200 OK las cabeceras son equivalentes, de hecho ni siquiera se transmite el nombre del fichero (eso es la URL de petición, tanto para el txt como para el php) y el tamaño (Content-Length) también suele indicarse (si es del txt el tamaño de su contenido, si es de un script, del contenido de la respuesta).

ciberdrac
12/06/15, 01:41:47
Después de leer el interesante debate que ha propiciado la cuestión planteada creo que me decantaré por la opción que a propuesto mocelet, ya que la idea que tengo es almacenar el apk en un servicio de alojamiento online del tipo Dropbox, Drive, Mega, etc.

Voy a crear una opción con la cual el usuario pueda comprobar mediante la lectura del número de versión que contendrá el txt si existe una nueva actualización del programa, y que el decida si la descarga o no.

Agradecería vuestra ayuda para orientarme sobre las instrucciones que debo de utilizar para el acceso al txt y la comprobación de su contenido, ya que no tengo experiencia en este tipo de tareas.

Un saludo y muchas gracias por vuestra valiosa ayuda.

kaiser75
15/06/15, 09:34:39
Yo use algo parecido hace tiempo para actualizar una aplicacion sin depender de Google Play, hay varias librerias para hacer eso facilmente.

UpdateCkecher (https://github.com/danielemaddaluno/Android-Update-Checker)
WVersionManager (https://github.com/winsontan520/Android-WVersionManager)

ciberdrac
05/01/17, 21:09:46
Cómo puedo ejecutar la aplicación actualizada que descarga el programa ?.

Saludos.

ciberdrac
09/01/17, 20:36:32
Hola, quería ver si alguien puede indicarme cómo abrir una aplicación android desde la propia aplicación android, estoy probando con un ejemplo que he visto pero no lo consigo .Intent launchIntent = getPackageManager().getLaunchIntentForPackage("Ruta_Aplicacion.apk");
startActivity(launchIntent);

c2alvaro
16/01/17, 20:10:39
Saludos compañero, yo también quería hacer una app auto actualizable sin pasar por la google play, puedes ver mi post en este enlace http://www.htcmania.com/showthread.php?t=1238213 pero al final no pude hacer que la app se auto instalara debido a un error de (Error de Análisis Se ha producido un error durante el análisis del paquete) te comento, mi app trabaja con un login, cuando el usuario inicia sección en la app el webservice que se llamaba verificaba si el usuario tenía la última versión de la app si no fuese así de forma automática se descargaba el archivo apk, todo bien pero cuando termina la descarga y android procede a instalar el apk me sale ese error de análisis del paquete, lo más curioso es que si instalaba el archivo de forma manual no me daba error, bueno ahí tienes el código revisa a ver y me cuentas si logras hacerlo funcionar.