2012-05-16 13 views
12

Debido a this annoying Android limitation Necesito que los usuarios reinstalen mi aplicación para que otras aplicaciones puedan detectar los permisos.Reinstalar la aplicación apk mediante programación sin descargar

Esto ya va a ser frustrante para el usuario, pero además, no veo una manera de volver a instalar mi aplicación desde la apk almacenada en/data/app y, por lo tanto, tendría que descargar la misma versión en el almacenamiento tarjeta antes de disparar el intento de instalación habitual.

¡Espero ansiosamente que alguien me diga que me estoy perdiendo algo obvio! He dibujado un espacio en blanco ...

Gracias de antemano.

¡Por favor, protagonice el problema si desea verlo resuelto! Aclamaciones.


EDITAR: Con los comentarios de @hackbod en mente, usted puede utilizar el código siguiente para iniciar el diálogo de instalación.

Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setDataAndType(Uri.fromFile(new File(this.getApplicationInfo().sourceDir)), 
"application/vnd.android.package-archive"); 
startActivity(intent); 

en mi dispositivo Jelly Bean, este presenta dos opciones: instalador paquete y Verificar e instalar. No sé si éste va a tratar el tema de:

  • instalación de la aplicación de esta manera probablemente eliminará la propiedad de ella desde Play Store

Mi aplicación es gratuita, por lo no puedo probar el tema de pago de: sin embargo

  • Nota si su aplicación está bloqueada hacia adelante (que es inevitable para todas las aplicaciones de pago que comienzan con JB, debido a la aplicación de cifrado), entonces esto no va a funcionar becau SE el ejecutable de aplicación no es legible por otros

Aunque acabados hackbod con 'legible por otros' lo que sugiere que si se está ejecutando esto a través de su propio código, para su propia aplicación, es legible? Por favor corrígeme si puedes probar esto y estoy equivocado.

+1

Puede copiarlo desde/data/app a la tarjeta de almacenamiento. Aunque no puede navegar por ese directorio, los archivos que contiene son generalmente legibles, aunque eso no está garantizado (y esa no siempre es la ubicación de instalación). Una alternativa podría ser no usar el sistema de permisos, pero intente hacer su propia autenticación del paquete solicitante. –

+0

Gracias Chris - Mi aplicación debe estar instalada en el dispositivo, de lo contrario no funcionará correctamente, por lo que tengo preocupaciones mínimas sobre la ubicación de instalación del usuario. ¿Asumo que esa es la única consideración a la que te refieres? Además, como/data/app es legible, pude comprobar que el apk se encontraba allí antes que nada. Desde mi búsqueda, no puedo encontrar una forma de transferir el apk desde esa ubicación a menos que use funciones de raíz ... Me encantaría saber si hay alguna manera ... ¿No estoy seguro de lo que querías decir con mi "propia autenticación"? Aclamaciones. – brandall

+0

Si es legible (como suele ser), no es necesario que el usuario root lo copie en algún lugar donde se le permita escribir (como la tarjeta SD, con el permiso de manifiesto correspondiente). Sin embargo,/data/app no ​​siempre está donde se instala. Y a veces el nombre del archivo apk se cambia durante la instalación. Es posible que pueda determinar la ubicación y el nombre instalado de /data/system/packages.xml, pero en ese punto está bastante metido en la funcionalidad interna privada que puede no ser a prueba en el futuro. Realmente, volver a descargar es probablemente tu mejor opción, al menos, tener eso como una opción alternativa. –

Respuesta

3

Posiblemente podría obtener la ruta a su .apk a través de Context.getApplicationInfo(). SourceDir, y ejecutar el instalador de la aplicación con esa ruta. Sin embargo, si su aplicación se bloquea hacia adelante (lo cual es inevitable para todas las aplicaciones pagas que comiencen con JB, debido al cifrado de la aplicación), entonces esto no funcionará porque el ejecutable de la aplicación no puede ser leído por otros. En ese caso, deberá copiar el archivo .apk en algún lugar legible en todo el mundo (como en el almacenamiento externo) e instalarlo desde allí.

No importa lo que haces aquí, sin embargo, esto tiene algunas inevitables consecuencias muy negativas:

  • La única manera de hacer cualquier tipo de instalación desde su aplicación es ir a través de la interfaz de usuario de carga lateral, que es (a) una experiencia muy aterradora para el usuario, y (b) requerirá que el usuario active la carga lateral para poder continuar.
  • Instalar su aplicación de esta manera probablemente eliminará la propiedad de Play Store (ya que ya no es la que lo ha instalado).Esto puede significar, por ejemplo, que el usuario ya no puede informar bloqueos o ANR a través de Play Store u otras consecuencias negativas. No estoy seguro exactamente qué problemas ocurrirán aquí, pero realmente no asumiría que esto va a estar bien.

En última instancia, simplemente no sugeriría hacer esto. ¿Qué permiso necesitas que te obligue a hacer esto? Por muchas razones, no recomendaría que las aplicaciones de terceros declaren sus propios permisos en la mayoría de los casos, porque hay muchas experiencias de usuario incorrectas con respecto a los permisos que solo se conocen después de que se hayan necesitado.

+0

Gracias por su respuesta. Un buen ejemplo de este problema es la aplicación Tasker, que requiere net.dinglisch.android.tasker.PERMISSION_RUN_TASKS. Como estoy seguro de que sabe, Tasker puede hacer algunos cambios importantes en los dispositivos, por lo que es comprensible por qué el desarrollador querría llamar la atención del usuario que instala mi aplicación. Si sugiero a mis usuarios que instalen Tasker para sus funciones compatibles, entonces se me presenta esta situación, donde no se detectan los permisos en mi Manifiesto. No estoy seguro si puedo marcar su respuesta como "correcta" ya que no parece haber una solución. – brandall

Cuestiones relacionadas