¿Es posible detectar la desinstalación de la aplicación de Android?

Mi aplicación utiliza el C2DM de Google (notificación de inserción) para notificar a los usuarios sobre nuevas actividades de amigos. Una vez que instalan la aplicación, registro el dispositivo con los servidores C2DM y almaceno el número de teléfono del usuario. Entonces sé que el usuario está usando mi aplicación y puedo enviarle las notificaciones automáticas. Pero, ¿qué sucede si los usuarios desinstalan mi aplicación? ¿Hay alguna forma de detectarla en mi aplicación? ¿O la única forma es detectar un error en mi servidor cuando envío un C2DM y es inalcanzable, y luego marcar a un usuario como inactivo?

Me encantaría notificar a los usuarios cuando sus amigos están usando una aplicación y cuando ya no lo hacen.

¿Cuál es la mejor solución para este escenario?

    Lamentablemente, el bash ACTION_PACKAGE_REMOVED se enviará a todos los receptores, excepto el suyo. Esto se confirma aquí .

    Algunas preguntas para su plan C2DM, ya que no estoy muy familiarizado con él. Si el usuario simplemente deja su dispositivo apagado durante un largo período de tiempo, ¿activará la condición de error que utiliza? ¿Cómo informa realmente C2DM un dispositivo “inalcanzable”? ¿Es una condición que solo ocurre cuando intenta enviar la notificación de inserción y falla o es cuando de alguna manera determina que llega al dispositivo pero no se maneja correctamente? Obviamente en el segundo escenario su plan funcionaría, pero puedo ver algunos “falsos positivos” ocurriendo de otra manera.

    Pregunta anterior de SO para referencia: Android no recibe intención ACTION_PACKAGE_REMOVED en el paquete eliminado

    La documentación de GCM explica esta situación aquí:

    https://developers.google.com/cloud-messaging/registration#how-uninstalled-client-app-unregistration-works

    “Una aplicación puede ser automáticamente no registrada después de que se desinstala del dispositivo. Sin embargo, este proceso no ocurre de inmediato, ya que Android no proporciona una callback de desinstalación”.

    Básicamente, cuando GCM intenta enviar la siguiente notificación de inserción, el dispositivo le indicará a GCM que la aplicación receptora fue desinstalada.

    En cuanto a notificar a sus amigos que sus amigos ya no usan la aplicación, GCM enviará un error No NotRegistered a su servidor de notificaciones cuando ocurra esta falla; no será inmediato, pero ¿podrías usar eso?

    El servicio Google C2DM está funcionando en modo pasivo cuando se trata de detectar aplicaciones desinstaladas.

    La primera notificación de inserción después de desinstalar su aplicación (sin anular el registro de C2DM !!!) NO arrojará ningún error en respuesta. Sin embargo, la segunda notificación de inserción devolverá un “registro no válido” o códigos de error “no registrados” en los que puede darse cuenta de que la aplicación se desinstaló.

    La razón es que los servidores C2DM devuelven el código de respuesta de inmediato y solo luego intentan empujar al cliente. Cuando el cliente responde que se desinstaló una aplicación, se elimina de los servidores C2DM. El próximo bash de envío devolverá un código de error de inmediato.

    Sí, pero es bastante hacky. El método se basa en el hecho de que lo primero que Android hace al desinstalar su aplicación es borrar su archivo de datos. Entonces podrías usar un vigilante de archivos para detectar la eliminación. También necesita escribir esto en código nativo. Si escribe su código en java, su aplicación se desinstalará antes de que pueda ejecutar cualquier código. por favor vea esta demostración: https://github.com/sevenler/Uninstall_Statics

    Solo sé de una manera con la respuesta 200 del servidor con el mensaje “NotRegistered” en el cuerpo.

    NotRegistered: el registration_id ya no es válido, por ejemplo, el usuario ha desinstalado la aplicación o ha desactivado las notificaciones. El remitente debe dejar de enviar mensajes a este dispositivo.

    Tengo algunos puntos que decirte,

    1. La comunidad de Android le recomienda utilizar GCM en lugar de C2DM, ya que ya no está disponible.
    2. En Android, no hay forma de que las aplicaciones reciban una notificación de desinstalación de la aplicación.
    3. en GCM si quiere dejar de enviar mensajes a aplicaciones desinstaladas puede referir esto

    Cuando envíe mensajes a GCM desde su servidor, recibirá una cadena de respuestas. Si recibe un error como “No registrado”, debe eliminar el ID de registro de la base de datos del servidor porque la aplicación se desinstaló del dispositivo o no tiene una receptor de difusión configurado para recibir intenciones com.google.android.c2dm.intent.RECEIVE “.

    Mire en este documento de GCM : Desregistro de GCM

    Nunca deberías anular el registro de tu aplicación. Esto es cuidado desde el lado del servidor.