SDK de Android - Privacidad de datos

Documento

Cumplimiento de las leyes de privacidad de datos

Implemente la recopilación de datos que cumpla con la privacidad notificando a Singular las opciones de consentimiento del usuario para GDPR, CCPA y otras regulaciones de privacidad del consumidor.

Cuando los usuarios consientan o rechacen compartir su información con terceros, utilice los métodos de privacidad de Singular para comunicar su elección. Esto garantiza el cumplimiento de normativas como la Ley de Privacidad del Consumidor de California (CCPA)y permite a los socios respetar las preferencias de privacidad del usuario.

Más información: Consulte Privacidad del usuario y Limitar el uso compartido dedatos para obtener información detallada sobre cómo Singular procesa el consentimiento de privacidad.


Limitar el uso compartido de datos

Control del intercambio de datos con terceros

Notifique a Singular si los usuarios han dado su consentimiento para compartir sus datos personales con socios terceros utilizando el método limitDataSharing.

Firma del método:

Singular.limitDataSharing(boolean shouldLimitDataSharing)

Parámetros:

  • false: El usuario ha optado y consentido compartir sus datos
  • true: El usuario ha optado por no participar y no consiente compartir sus datos

Importante: Aunque es opcional, este método afecta a la compartición de datos de atribución. Algunos socios sólo comparten información de atribución completa cuando se notifica explícitamente que los usuarios han optado por ello.

Ejemplos de uso

KotlinJava
// User has opted in to share their data
Singular.limitDataSharing(false)

// User has opted out and declined to share their data
Singular.limitDataSharing(true)

// Example: Set based on user preference
fun handlePrivacyConsent(userConsented: Boolean) {
    // Pass inverse: false = opted in, true = opted out
    Singular.limitDataSharing(!userConsented)
    
    Log.d("Privacy", "Data sharing: ${if (userConsented) "Enabled" else "Limited"}")
}

Cómo funciona:

Singular utiliza esta configuración en Postbacks de Privacidad de Usuarioy la pasa a los socios que la requieren para el cumplimiento normativo.


Métodos de cumplimiento de GDPR

Gestione el consentimiento de seguimiento del usuario y controle la funcionalidad del SDK para cumplir con el GDPR (Reglamento General de Protección de Datos) y otras normativas de privacidad.

Gestión del consentimiento de seguimiento

trackingOptIn

Registre el consentimiento explícito del usuario para el seguimiento mediante el envío de un evento GDPR opt-in a los servidores de Singular.

Firma del método:

Singular.trackingOptIn()

Cuándo Usar:

  • Cumplimiento GDPR: Llamada cuando los usuarios consienten explícitamente el seguimiento en regiones reguladas por GDPR.
  • Registro de consentimiento: Marca a los usuarios como que han dado su consentimiento GDPR en los sistemas de Singular
  • Comportamiento por defecto: Sin esta llamada, el SDK continúa el seguimiento pero no registra específicamente el consentimiento
KotlinJava
// User accepted tracking consent
Singular.trackingOptIn()

// Example: Call after consent dialog
fun onUserAcceptedTracking() {
    Singular.trackingOptIn()
    Log.d("GDPR", "User opted in to tracking")
}

Métodos de control de seguimiento

stopAllTracking

Desactiva completamente todas las actividades de seguimiento del SDK para el usuario actual en este dispositivo.

Firma del método:

Singular.stopAllTracking()

Crítico Advertencia: Este método desactiva permanentemente el SDK hasta que se llame a resumeAllTracking(). El estado deshabilitado persiste durante los reinicios de la aplicación y sólo puede revertirse mediante programación.

Comportamiento:

  • Efecto inmediato: Detiene todo el seguimiento, la notificación de eventos y la recopilación de datos al instante.
  • Estado persistente: Permanece desactivado incluso después de cerrar y volver a abrir la aplicación.
  • Sin restablecimiento automático: Debe llamar explícitamente a resumeAllTracking() para volver a habilitarlo
KotlinJava
// User declined all tracking
Singular.stopAllTracking()

// Example: Handle user opt-out
fun onUserDeclinedTracking() {
    Singular.stopAllTracking()
    Log.d("Privacy", "All tracking stopped")
    
    // Optionally store preference
    saveUserTrackingPreference(false)
}

reanudarTodoElSeguimiento

Volver a activar el seguimiento después de haberlo detenido con stopAllTracking().

Firma del método:

Singular.resumeAllTracking()

Casos de uso:

  • Cambio de consentimiento: El usuario cambia sus preferencias de privacidad y vuelve a activar el seguimiento
  • Ajustes de privacidad: El usuario actualiza su consentimiento a través del menú de configuración de la aplicación
  • Cumplimiento regional: Volver a activar el seguimiento cuando el usuario se traslada a regiones no reguladas
KotlinJava
// User opted back in to tracking
Singular.resumeAllTracking()

// Example: Handle consent update
fun onUserResumedTracking() {
    Singular.resumeAllTracking()
    Log.d("Privacy", "Tracking resumed")
    
    // Optionally update stored preference
    saveUserTrackingPreference(true)
}

isAllTrackingStopped

Comprueba si se ha desactivado el seguimiento para el usuario actual.

Firma del método:

boolean Singular.isAllTrackingStopped()

Devuelve:

  • true: El seguimiento se ha detenido actualmente a través de stopAllTracking()
  • false: El seguimiento está activo (no se ha detenido nunca o se ha reanudado)
KotlinJava
// Check current tracking status
val isTrackingStopped = Singular.isAllTrackingStopped()

// Example: Display privacy status in settings
fun getPrivacyStatusText(): String {
    return if (Singular.isAllTrackingStopped()) {
        "Tracking: Disabled"
    } else {
        "Tracking: Enabled"
    }
}

// Example: Sync UI with tracking state
fun updatePrivacyToggle() {
    val isStopped = Singular.isAllTrackingStopped()
    privacyToggle.isChecked = !isStopped
    Log.d("Privacy", "Current tracking state: ${if (isStopped) "Stopped" else "Active"}")
}

Protección de la intimidad de los niños

trackingUnder13

Notifica a Singular que el usuario es menor de 13 años para cumplir con la ley COPPA (Children's Online Privacy Protection Act) y otras normativas sobre privacidad infantil.

Firma del método:

Singular.trackingUnder13()

Requisitos de cumplimiento:

  • Cumplimiento de COPPA: Obligatorio para apps que recopilen datos de menores de 13 años en Estados Unidos.
  • Contenido restringido por edad: Se utiliza cuando los usuarios se identifican como menores de 13 años durante el registro o la verificación de la edad
  • Seguimiento restringido: Limita la recopilación de datos para cumplir con las leyes de protección de la privacidad infantil
KotlinJava
// User identified as under 13
Singular.trackingUnder13()

// Example: Call after age verification
fun onAgeVerified(userAge: Int) {
    if (userAge < 13) {
        Singular.trackingUnder13()
        Log.d("Privacy", "COPPA mode enabled for user under 13")
    }
}

Importante: Llame a este método lo antes posible después de determinar que el usuario es menor de 13 años, idealmente durante la inicialización de la aplicación o inmediatamente después de la verificación de la edad. Esto garantiza que todo el seguimiento posterior respete la normativa de protección de la intimidad de los niños.


setLimitAdvertisingIdentifiers

Restringe la recopilación y el uso de identificadores de publicidad (GAID en Android) tras la inicialización del SDK para aplicaciones de audiencia mixta.

Firma del método:

Singular.setLimitAdvertisingIdentifiers()

Casos de uso:

  • Aplicaciones de público mixto: Aplicaciones para adultos y niños en las que la edad se determina tras el lanzamiento de la aplicación.
  • Controles de privacidad dinámicos: Ajustar el seguimiento en función de las acciones del usuario o del contenido al que se accede
  • Restricciones de tiempo de ejecución: Aplicar limitaciones de identificadores publicitarios tras la configuración inicial del SDK
KotlinJava
// Limit advertising identifiers after initialization
Singular.setLimitAdvertisingIdentifiers()

// Example: Mixed audience app with age gate
fun onKidsModeSwitched(isKidsMode: Boolean) {
    if (isKidsMode) {
        Singular.setLimitAdvertisingIdentifiers()
        Log.d("Privacy", "Advertising identifiers limited for kids mode")
    }
}

// Example: Content-based restrictions
fun onViewingChildrensContent() {
    Singular.setLimitAdvertisingIdentifiers()
    Log.d("Privacy", "Ad identifiers restricted for children's content")
}

Alternativa de configuración: También puede limitar los identificadores de publicidad durante la inicialización del SDK mediante SingularConfig.withLimitAdvertisingIdentifiers() si conoce los requisitos de privacidad antes de que se inicie el SDK.

Método de configuración

Establezca limitaciones de identificadores publicitarios durante la inicialización del SDK para aplicaciones que conozcan los requisitos de privacidad de antemano.

KotlinJava
// Limit advertising identifiers at initialization
val config = SingularConfig("SDK_KEY", "SDK_SECRET")
    .withLimitAdvertisingIdentifiers()

Singular.init(applicationContext, config)

Mejores prácticas de implementación

Ejemplo de gestión completa de la privacidad

Implemente controles de privacidad completos que respeten las preferencias del usuario y cumplan la normativa.

KotlinJava
class PrivacyManager(private val context: Context) {
    
    private val prefs = context.getSharedPreferences("privacy_prefs", Context.MODE_PRIVATE)
    
    // Initialize privacy settings on app start
    fun initializePrivacy() {
        val hasUserConsent = getUserConsent()
        val allowDataSharing = getDataSharingPreference()
        val userAge = getUserAge()
        
        // Apply stored preferences
        if (hasUserConsent) {
            Singular.trackingOptIn()
            Singular.resumeAllTracking()
        } else {
            Singular.stopAllTracking()
        }
        
        // Set data sharing preference
        Singular.limitDataSharing(!allowDataSharing)
        
        // Handle children's privacy
        if (userAge > 0 && userAge < 13) {
            Singular.trackingUnder13()
            Singular.setLimitAdvertisingIdentifiers()
        }
        
        Log.d("Privacy", "Initialized: consent=$hasUserConsent, sharing=$allowDataSharing, age=$userAge")
    }
    
    // User accepts tracking via consent dialog
    fun userAcceptedTracking() {
        saveUserConsent(true)
        Singular.trackingOptIn()
        Singular.resumeAllTracking()
        Log.d("Privacy", "User accepted tracking")
    }
    
    // User declines tracking
    fun userDeclinedTracking() {
        saveUserConsent(false)
        Singular.stopAllTracking()
        Log.d("Privacy", "User declined tracking")
    }
    
    // User updates data sharing preference
    fun setDataSharingEnabled(enabled: Boolean) {
        saveDataSharingPreference(enabled)
        // Note: limitDataSharing uses inverse logic
        Singular.limitDataSharing(!enabled)
        Log.d("Privacy", "Data sharing: ${if (enabled) "Enabled" else "Limited"}")
    }
    
    // Handle age verification result
    fun onAgeVerified(age: Int) {
        saveUserAge(age)
        if (age < 13) {
            Singular.trackingUnder13()
            Singular.setLimitAdvertisingIdentifiers()
            Log.d("Privacy", "COPPA restrictions applied for user under 13")
        }
    }
    
    // Get current tracking status
    fun isTrackingEnabled(): Boolean {
        return !Singular.isAllTrackingStopped()
    }
    
    // Private helper methods
    private fun getUserConsent(): Boolean {
        return prefs.getBoolean("user_consent", false)
    }
    
    private fun saveUserConsent(consent: Boolean) {
        prefs.edit().putBoolean("user_consent", consent).apply()
    }
    
    private fun getDataSharingPreference(): Boolean {
        return prefs.getBoolean("data_sharing", false)
    }
    
    private fun saveDataSharingPreference(enabled: Boolean) {
        prefs.edit().putBoolean("data_sharing", enabled).apply()
    }
    
    private fun getUserAge(): Int {
        return prefs.getInt("user_age", 0)
    }
    
    private fun saveUserAge(age: Int) {
        prefs.edit().putInt("user_age", age).apply()
    }
}

Mejores prácticas:

  • Almacenamiento persistente: Guardar las preferencias del usuario en SharedPreferences o en un almacenamiento seguro.
  • Inicialización temprana: Aplique la configuración de privacidad antes de la inicialización del SDK cuando sea posible.
  • Sincronización de la interfaz de usuario: Mantenga la interfaz de usuario sincronizada con el estado real del SDK utilizando isAllTrackingStopped()
  • Comunicación clara: Proporcione controles de privacidad claros y accesibles en la configuración de la aplicación
  • Verificación de edad: Implemente una sólida verificación de edad para las aplicaciones dirigidas a niños.
  • Controles combinados: Para usuarios menores de 13 años, aplique tanto trackingUnder13() como setLimitAdvertisingIdentifiers()