SDK de Android - Opciones avanzadas

Opciones avanzadas

Configura funciones avanzadas del SDK, incluyendo la recopilación del install referrer, la gestión de sesiones, la integración con JavaScript y los identificadores de dispositivo alternativos para casos de uso especializados.

Recopilación del install referrer (dispositivos heredados)

Descripción general

El install referrer proporciona una atribución precisa al identificar qué anuncio hizo clic el usuario antes de instalar tu aplicación desde Google Play Store.

Función obsoleta: Google dejó obsoleta la transmisión del intent INSTALL_REFERRER . Consulta Still Using InstallBroadcast? Switch to the Play Referrer API by March 1, 2020 . Las versiones modernas del Singular SDK utilizan automáticamente la Google Play Referrer API .

Recopilación automática:

En dispositivos con la última versión de Google Play Store, el Singular SDK recopila el install referrer automáticamente mediante la Google Play Referrer API. Solo se necesita configuración manual para soportar dispositivos heredados.


Integrar con un receiver existente

Reenvía los datos del install referrer a Singular cuando tu aplicación ya tiene un BroadcastReceiver para INSTALL_REFERRER .

Implementación:

Agrega una llamada a SingularInstallReceiver dentro del método onReceive del receiver existente.

Kotlin Java
class MyCustomInstallReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        // Forward install referrer to Singular
        SingularInstallReceiver().onReceive(context, intent)

        // Your existing logic
        // ...
    }
}

Registrar el receiver de Singular

Configura el receiver del install referrer de Singular cuando tu aplicación no tiene un manejador existente de INSTALL_REFERRER .

Configuración de AndroidManifest.xml:

AndroidManifest.xml
<application>
    <!-- Other application components -->

    <receiver
        android:name="com.singular.sdk.SingularInstallReceiver"
        android:exported="true">
        <intent-filter>
            <action android:name="com.android.vending.INSTALL_REFERRER" />
        </intent-filter>
    </receiver>
</application>

Recomendación: Esta configuración solo es necesaria para aplicaciones que soporten dispositivos muy antiguos. Las implementaciones modernas deben basarse en la integración automática con la Google Play Referrer API.


Gestión de sesiones

Gestión automática de sesiones

El Singular SDK gestiona las sesiones automáticamente para Android API 14 (Ice Cream Sandwich) y superior, sin configuración adicional.

Comportamiento predeterminado:

Cuando la aplicación pasa a segundo plano durante 60 segundos o más, el SDK registra una nueva sesión al volver al primer plano.


Configurar el tiempo de espera de sesión

Personaliza la duración del tiempo de espera de sesión para que coincida con los patrones de uso de tu aplicación.

Firma del método:

SingularConfig.withSessionTimeoutInSec(int timeoutInSeconds)
Kotlin Java
// Set session timeout to 120 seconds (2 minutes)
val config = SingularConfig("SDK_KEY", "SDK_SECRET")
    .withSessionTimeoutInSec(120)

Singular.init(applicationContext, config)

Valores de tiempo de espera:

  • Predeterminado: 60 segundos
  • Mínimo: 0 segundos (cada transición entre segundo plano y primer plano crea una nueva sesión)
  • Recomendado: 30 a 180 segundos según los patrones de uso de la aplicación

Gestión manual de sesiones (API < 14)

Para aplicaciones con un minSdkVersion inferior a 14, gestiona las sesiones manualmente llamando a los métodos del ciclo de vida en cada activity.

Omite esta sección si tu minSdkVersion es 14 (Ice Cream Sandwich) o superior, lo que es casi seguro. El Singular SDK utiliza ActivityLifecycleCallbacks para rastrear sesiones automáticamente en API 14+, por lo que llamar a onActivityResumed() / onActivityPaused() manualmente es redundante y puede causar eventos de sesión duplicados. Implementa el código siguiente solo si estás apuntando explícitamente a dispositivos anteriores a Android 4.0.

Implementación

Llama a onActivityResumed() y onActivityPaused() en los métodos del ciclo de vida de cada activity, o implementa en una clase base de activity.

Kotlin Java
class MainActivity : AppCompatActivity() {

    override fun onResume() {
        super.onResume()
        Singular.onActivityResumed()
        // Your other code
    }

    override fun onPause() {
        super.onPause()
        Singular.onActivityPaused()
        // Your other code
    }
}

Mejor práctica: Si tienes una clase base común de activity, implementa estas llamadas en los métodos onResume() y onPause() de la clase base, en lugar de duplicar el código en todas las activities.


Interfaz JavaScript para aplicaciones híbridas

Descripción general

Habilita la funcionalidad del Singular SDK desde código JavaScript en aplicaciones híbridas basadas en WebView usando SingularJSInterface .

Métodos soportados:

  • setCustomUserId: Establecer un identificador de usuario personalizado
  • unsetCustomUserId: Eliminar el identificador de usuario personalizado
  • event: Rastrear eventos con o sin atributos
  • revenue: Rastrear ingresos

Configurar la integración del WebView

Configura la interfaz JavaScript en el método onCreate() de tu activity para cada WebView que necesite funcionalidad de Singular.

Kotlin Java
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    // Initialize Singular SDK
    val config = SingularConfig("SDK_KEY", "SDK_SECRET")
    Singular.init(this, config)

    // Configure WebView
    val myWebView = findViewById<WebView>(R.id.webview)
    myWebView.settings.javaScriptEnabled = true
    myWebView.loadUrl("file:///android_asset/index.html")

    // Add Singular JavaScript interface
    val singularJSInterface = SingularJSInterface(this)
    singularJSInterface.setWebViewId(R.id.webview)
    myWebView.addJavascriptInterface(singularJSInterface, "SingularInterface")
}

Múltiples WebViews:

  • Configura la interfaz JavaScript para cada WebView de tu aplicación
  • Usa el mismo nombre de interfaz ("SingularInterface") para mantener la consistencia
  • Establece IDs únicos para cada instancia de WebView

Uso de JavaScript

Llama a los métodos de Singular desde el código JavaScript que se ejecuta en tu WebView.

Rastrear eventos

JavaScript
// Simple event without attributes
SingularInterface.event('level_completed');

// Event with attributes (pass as JSON string)
SingularInterface.event('purchase_attempt',
    JSON.stringify({
        "item_name": "sword",
        "item_category": "weapons",
        "item_price": 9.99
    })
);

Rastrear ingresos

JavaScript
// Track revenue in USD
SingularInterface.revenue('USD', 9.99);

// Track revenue in other currencies
SingularInterface.revenue('EUR', 8.50);

Gestionar el ID de usuario personalizado

JavaScript
// Set custom user ID
SingularInterface.setCustomUserId('user_12345');

// Remove custom user ID
SingularInterface.unsetCustomUserId();

Identificadores de dispositivo alternativos

OAID (Open Advertising ID)

Habilita el tracking en dispositivos Android en regiones sin Google Play usando el Open Advertising Identifier (OAID).

Soporte de OAID:

  • Dispositivos Huawei: Implementación propietaria de OAID de Huawei
  • Dispositivos MSA: Marcas miembros de Mobile Security Alliance (OPPO, Vivo, Xiaomi, etc.)

Requisitos previos

Integra tanto el MSA SDK como el Huawei OAID SDK para recopilar el OAID en todas las plataformas soportadas.

Habilitar la recopilación de OAID

Configura el Singular SDK para recopilar y usar el OAID para tracking.

Kotlin Java
val config = SingularConfig("SDK_KEY", "SDK_SECRET")
    .withOAIDCollection()

Singular.init(applicationContext, config)

Detección automática:

  • El SDK detecta automáticamente si el dispositivo tiene un OAID
  • El SDK selecciona el SDK de OAID apropiado (MSA o Huawei) según el dispositivo
  • El Amazon Advertising ID (AMID) se recopila automáticamente sin dependencias adicionales

IMEI (International Mobile Equipment Identity)

Recopila el número IMEI del dispositivo para realizar tracking en dispositivos ubicados en regiones sin Google Play Services.

Advertencia crítica: Recopilar el IMEI viola el acuerdo de Google Play Services. Usa la recopilación del IMEI únicamente para aplicaciones distribuidas fuera de Google Play Store en regiones sin servicios de Google.

Agregar el permiso requerido

Agrega el permiso READ_PHONE_STATE a tu AndroidManifest.xml.

AndroidManifest.xml
<manifest>
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

    <application>
        <!-- Your application components -->
    </application>
</manifest>

Obtener el número IMEI

Obtén el IMEI del dispositivo usando TelephonyManager con el manejo adecuado del nivel de API.

Kotlin Java
val telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager

val imei: String? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    telephonyManager.imei
} else {
    @Suppress("DEPRECATION")
    telephonyManager.deviceId
}

// Validate IMEI before use
if (imei != null && imei.isNotEmpty()) {
    // Send to Singular
    Log.d("IMEI", "Retrieved: $imei")
} else {
    Log.w("IMEI", "Failed to retrieve IMEI")
}

Enviar el IMEI a Singular

Configura el IMEI durante la inicialización del SDK (recomendado) o establécelo dinámicamente después de la inicialización.

Opción 1: Método de configuración (recomendado)

Kotlin Java
// Set IMEI during initialization
val config = SingularConfig("SDK_KEY", "SDK_SECRET")
    .withIMEI(imei)

Singular.init(applicationContext, config)

Opción 2: Método en tiempo de ejecución

Kotlin Java
// Set IMEI after initialization
Singular.setIMEI(imei)

Mejor práctica: Establece el IMEI en SingularConfig antes de la inicialización del SDK para asegurar que esté disponible desde la primera sesión. Usa setIMEI() solo cuando el IMEI esté disponible después de la inicialización.