2010-01-25 13 views
6

Estoy desarrollando una aplicación que debería agregar su acceso directo a la pantalla de inicio después de la instalación y eliminarla después de que se desinstala la aplicación. La aplicación estará preinstalada en el dispositivo del usuario final, pero aún debería tener una opción para la desinstalación). La tarea parece muy simple, pero me he enfrentado a muchos problemas para implementarla.¿Cómo eliminar el acceso directo de la aplicación desde la pantalla de inicio al desinstalar automáticamente?

Lo que he hecho:

  • Añadir acceso directo a la pantalla principal con com.android.launcher.action.INSTALL_SHORTCUT en la primera aplicación de lanzamiento o en el dispositivo tritón reinicio.
  • eliminar manualmente el acceso directo usando com.android.launcher.action.UNINSTALL_SHORTCUT.

Lo que no puedo (y casi renunciar a):

  • eliminará automáticamente el acceso directo cuando la aplicación se desinstala.

No hay forma de usar Intent.ACTION_PACKAGE_REMOVED porque la aplicación que se desinstala no recibe esta intención. Realicé algunas pruebas y descubrí que el único tipo de acceso directo que se elimina con la aplicación es el acceso directo que se crea desde el menú 'Añadir a la pantalla de inicio => Accesos directos => Aplicaciones => Actividad de la aplicación'. Los accesos directos que se crean programáticamente o que se declaran en AndroidManifest permanecen en la pantalla de inicio después de desinstalar la aplicación.

Casi no hay documentos ni publicaciones en los foros sobre este tema y estoy un poco confundido por qué una operación tan simple que no contradice la política de seguridad de Android no pudo implementarse de manera directa.

¿Hay alguna manera de pedir al sistema operativo que elimine el atajo correspondiente en la desinstalación de la aplicación? ¿Puedo ver el evento de desinstalación de la aplicación antes de que se elimine?

Respuesta

2

No creo que pueda hacer esto.

En primer lugar porque no puede desinstalar las aplicaciones que están preinstaladas en el firmware del dispositivo — que existen en la partición /system que es un sistema de archivos de solo lectura.

En segundo lugar, como nota, su aplicación receives no notification that it is being uninstalled.

Si los usuarios no quieren utilizar su aplicación, ¿no ignorarán el icono de la aplicación, al igual que yo hago con un par de aplicaciones preinstaladas en mi teléfono?


Editar:
Si usted va a preinstalar aplicaciones (pero no en la versión de firmware commonsware.com notas), usted podría preinstalar dos APK. Uno de los cuales no tiene iniciador y consiste únicamente en un receptor de difusión que maneja el evento ACTION_PACKAGE_REMOVED y llama al UNINSTALL_SHORTCUT.

No creo que exista ninguna comprobación de permiso explícita que requiera que la misma aplicación que lo ha agregado elimine un atajo, pero podría solucionarlo utilizando un sharedUserId para ambos APK.

+0

Tenga en cuenta que "preinstalado" no implica necesariamente "firmware". Es posible tener una aplicación instalada como si fuera una aplicación normal, pero sucede que se envía con anticipación. La tableta Android ARCHOS 5 lo hizo con una docena de aplicaciones, por ejemplo. – CommonsWare

+0

De hecho. Estoy trabajando con dispositivos que * tendrán * aplicaciones instaladas en el firmware, así que me aseguré de mencionar la parte del firmware. Pero creo que el problema se mantendrá de todos modos debido a la falta de difusión PACKAGE_REMOVED. –

+0

Aunque su comentario me motivó a agregar una posible solución para las preinstalaciones que no son de firmware. :) –

1

Lo que está describiendo es una limitación de la pantalla de Inicio. La próxima versión de Launcher2 aborda este problema y elimina automáticamente los widgets y accesos directos asociados con una aplicación. Algunos accesos directos pueden quedar si no se puede encontrar una asociación (si su aplicación crea un acceso directo al reproductor de música, por ejemplo).

+0

Suena genial. ¿Qué versión incluirá el nuevo Launcher? –

2

Parece que no utiliza el intento install_shortcut de manera correcta. Probablemente crees un intento sin ningún parámetro. Debería crear una intención con una acción Intent.ACTION_MAIN param.

Intent shortcutIntent = new Intent(Intent.ACTION_MAIN); 
shortcutIntent.setClassName(this, this.getClass().getName()); 

Intent intent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT"); 
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); 
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name)); 
Parcelable iconResource = Intent.ShortcutIconResource.fromContext(
      this, R.drawable.launcher_icon); 
intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource); 
sendBroadcast(intent); 
Cuestiones relacionadas