SDK do Android - Opções avançadas

Opções avançadas

Configure recursos avançados do SDK, incluindo a coleta do install referrer, gerenciamento de sessões, integração com JavaScript e identificadores de dispositivo alternativos para casos de uso especializados.

Coleta do install referrer (dispositivos legados)

Visão geral

O install referrer fornece atribuição precisa ao identificar qual anúncio o usuário clicou antes de instalar seu aplicativo na Google Play Store.

Recurso obsoleto: O Google tornou obsoleta a transmissão do intent INSTALL_REFERRER . Consulte Still Using InstallBroadcast? Switch to the Play Referrer API by March 1, 2020 . As versões modernas do Singular SDK usam automaticamente a Google Play Referrer API .

Coleta automática:

Em dispositivos com a versão mais recente da Google Play Store, o Singular SDK coleta o install referrer automaticamente usando a Google Play Referrer API. A configuração manual só é necessária para suportar dispositivos legados.


Integrar com um receiver existente

Encaminhe os dados do install referrer para o Singular quando seu aplicativo já tem um BroadcastReceiver para INSTALL_REFERRER .

Implementação:

Adicione uma chamada para SingularInstallReceiver dentro do método onReceive do 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 o receiver do Singular

Configure o receiver do install referrer do Singular quando seu aplicativo não tiver um handler existente de INSTALL_REFERRER .

Configuração do 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>

Recomendação: Esta configuração só é necessária para aplicativos que oferecem suporte a dispositivos muito antigos. As implementações modernas devem se basear na integração automática com a Google Play Referrer API.


Gerenciamento de sessões

Gerenciamento automático de sessões

O Singular SDK gerencia sessões automaticamente para o Android API 14 (Ice Cream Sandwich) e versões superiores, sem configuração adicional.

Comportamento padrão:

Quando o aplicativo vai para segundo plano por 60 segundos ou mais, o SDK registra uma nova sessão ao retornar ao primeiro plano.


Configurar o tempo limite da sessão

Personalize a duração do tempo limite da sessão para corresponder aos padrões de uso do seu aplicativo.

Assinatura do 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 tempo limite:

  • Padrão: 60 segundos
  • Mínimo: 0 segundos (cada transição entre segundo plano e primeiro plano cria uma nova sessão)
  • Recomendado: 30 a 180 segundos, dependendo dos padrões de uso do aplicativo

Gerenciamento manual de sessões (API < 14)

Para aplicativos com minSdkVersion inferior a 14, gerencie sessões manualmente chamando métodos de ciclo de vida em cada activity.

Pule esta seção se seu minSdkVersion for 14 (Ice Cream Sandwich) ou superior, o que é quase certo. O Singular SDK usa ActivityLifecycleCallbacks para rastrear sessões automaticamente em API 14+, portanto chamar onActivityResumed() / onActivityPaused() manualmente é redundante e pode causar eventos de sessão duplicados. Implemente o código abaixo apenas se estiver direcionando explicitamente dispositivos anteriores ao Android 4.0.

Implementação

Chame onActivityResumed() e onActivityPaused() nos métodos de ciclo de vida de cada activity, ou implemente em uma classe 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
    }
}

Melhor prática: Se você tem uma classe base comum de activity, implemente essas chamadas nos métodos onResume() e onPause() da classe base, em vez de duplicar o código em todas as activities.


Interface JavaScript para aplicativos híbridos

Visão geral

Habilite a funcionalidade do Singular SDK a partir de código JavaScript em aplicativos híbridos baseados em WebView usando o SingularJSInterface .

Métodos suportados:

  • setCustomUserId: Define um identificador de usuário personalizado
  • unsetCustomUserId: Remove o identificador de usuário personalizado
  • event: Rastreia eventos com ou sem atributos
  • revenue: Rastreia receita

Configurar a integração do WebView

Configure a interface JavaScript no método onCreate() da sua activity para cada WebView que precisar da funcionalidade do 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últiplas WebViews:

  • Configure a interface JavaScript para cada WebView do seu aplicativo
  • Use o mesmo nome de interface ("SingularInterface") para manter a consistência
  • Defina IDs de WebView únicos para cada instância

Uso do JavaScript

Chame os métodos do Singular a partir do código JavaScript em execução no seu 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 receita

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

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

Gerenciar o ID de usuário personalizado

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

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

Identificadores de dispositivo alternativos

OAID (Open Advertising ID)

Habilite o rastreamento em dispositivos Android em regiões sem Google Play usando o Open Advertising Identifier (OAID).

Suporte ao OAID:

  • Dispositivos Huawei: Implementação proprietária de OAID da Huawei
  • Dispositivos MSA: Marcas membros da Mobile Security Alliance (OPPO, Vivo, Xiaomi etc.)

Pré-requisitos

Integre tanto o MSA SDK quanto o Huawei OAID SDK para coletar o OAID em todas as plataformas suportadas.

Habilitar a coleta do OAID

Configure o Singular SDK para coletar e usar o OAID para rastreamento.

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

Singular.init(applicationContext, config)

Detecção automática:

  • O SDK detecta automaticamente se o dispositivo tem um OAID
  • O SDK seleciona o SDK de OAID apropriado (MSA ou Huawei) com base no dispositivo
  • O Amazon Advertising ID (AMID) é coletado automaticamente sem dependências adicionais

IMEI (International Mobile Equipment Identity)

Colete o número IMEI do dispositivo para rastreamento em dispositivos em regiões sem o Google Play Services.

Aviso crítico: A coleta de IMEI viola o contrato do Google Play Services. Use a coleta de IMEI apenas para aplicativos distribuídos fora da Google Play Store em regiões sem serviços do Google.

Adicionar a permissão necessária

Adicione a permissão READ_PHONE_STATE ao seu AndroidManifest.xml.

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

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

Obter o número IMEI

Obtenha o IMEI do dispositivo usando o TelephonyManager com tratamento adequado do nível 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 o IMEI para o Singular

Configure o IMEI durante a inicialização do SDK (recomendado) ou defina-o dinamicamente após a inicialização.

Opção 1: Método de configuração (recomendado)

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

Singular.init(applicationContext, config)

Opção 2: Método em tempo de execução

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

Melhor prática: Defina o IMEI em SingularConfig antes da inicialização do SDK para garantir que ele esteja disponível desde a primeira sessão. Use setIMEI() somente quando o IMEI estiver disponível após a inicialização.