Android TV
Obtenir le SDK AppConsent TV
Pour intégrer le SDK AppConsent à votre projet Android, suivez les étapes ci-dessous:
Déclaration du repository
Gradle <6.8
Dans le fichier build.gradle
à la racine de votre projet, ajoutez ce qui suit :
repositories {
...
maven {
url "https://artifactory.datalf.chat/artifactory/app-consent-v2-release"
}
// Pour tester TCFv2.2
maven {
url "https://artifactory.datalf.chat/artifactory/appconsent-staging"
}
}
Gradle >=6.8
Dans votre fichier settings.gradle
, à la racine de votre projet, ajoutez ce qui suit :
dependencyResolutionManagement {
...
repositories {
...
maven {
url "https://artifactory.datalf.chat/artifactory/app-consent-v2-release"
}
// Pour tester TCFv2.2
maven {
url "https://artifactory.datalf.chat/artifactory/appconsent-staging"
}
}
}
Intégration de la librairie
Dans le build.gradle
de votre module ajoutez ce qui suit :
dependencies {
implementation 'com.sfbx.appconsent:appconsent-tv:${currentTvVersion}'
}
Où la currentTvVersion = 1.1.48
Pour tester la nouvelle implémentation de TCF2.2, merci d'utiliser cette dépendance
dependencies {
implementation("com.sfbx.appconsent:appconsent-tv-staging:4.0.0")
}
Comment utiliser AppConsent
1. Obtenir votre AppKey depuis AppConsent : https://app.appconsent.io
2. Créez AppConsentTV
import com.sfbx.appconsent.tv.AppConsentTV
class MainActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val appConsent = AppConsentTV(
context = this,
appKey = "YOUR_APP_KEY"
) {
it.presentNotice(false)
}
}
}
Pour tester la nouvelle intégration de TCF2.2, merci d'utiliser cet extrait de code
import com.sfbx.appconsent.tv.listener.OnPresentNoticeListener
class MainActivity : FragmentActivity() {
private lateinit var binding: ActivityMainBinding
private var appConsent: com.sfbx.appconsent.AppConsent? = null
private var appKey: String = "{APP_KEY}"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
/*
Permet de savoir si le SDK a dors et déjà été initialisé
*/
if (!com.sfbx.appconsent.tv.AppConsent.isSdkInitialized()) {
com.sfbx.appconsent.tv.AppConsent.sdkInitialize(
appKey = appKey,
) {
/*
Utilisez l'instance reçue par le callback onReady
Celle-ci a été initialisée avec succès
*/
appConsent = it
/*
S'enregistre au callback de la CMP pour savoir quand l'utilisateur
aura donné son consentement, ou bien si une erreur survînt
*/
it.setOnPresentNoticeListener(object : OnPresentNoticeListener {
override fun presentConsentGiven() {
/*
L'utilisateur a donné son consentement
*/
}
override fun presentConsentError(error: Throwable?) {
/*
Une erreur s'est produite
*/
}
})
/*
Essaye d'afficher la CMP selon certaines règles.
*/
it.tryDisplayNotice(false).takeIf { !it }?.let {
/*
L'utilisateur a déjà donné son consentement;
L'utilisateur ne fait pas partie d'une zone sujet à l'application des RGPD;
etc.
*/
Toast.makeText(
this@MainActivity.applicationContext,
"La CMP ne s'est pas affiché, car elle n'avait pas à le faire (la region de l'utilisateur, pas besoin de faire de mise à jour, etc.)",
Toast.LENGTH_SHORT
).show()
}
}
}else{
if (appConsent == null) {
/*
Permet de récupérer l'instance de AppConsent ou null si elle n'a pas encore été instancié par exemple
*/
appConsent = com.sfbx.appconsent.tv.AppConsent.getInstance()
}
}
}
}
3. Utilisez ensuite l'objet appConsent
- Technical Documentation
- TCF2.2 - Technical Documentation
- Vérifier si l'utilisateur a donné son consentement
appConsent.consentGiven()
Retourne true
si le consentement est donné, false
sinon.
- Consent listener
Ajout d'un Listener
appConsent.addNoticeListener(object : AppConsentNoticeListener {
override fun onConsentGiven() {
// ...
}
override fun onError(error: AppConsentError) {
// ...
}
})
Retirer le Listener
appConsent.removeNoticeListener(listener)
Chaque fois qu'un consentement est mis à jour, un nouvel événement sera déclenché dans AppConsentNoticeListener
- Affichage de la notice de la CMP
appConsent.presentNotice(false) // Affiche la notice de la CMP uniquement si requis
appConsent.presentNotice(true) // Force l'affichage de la notice de la CMP
info
presentNotice(force : Boolean)
est une méthode locale qui ne vérifie que le cache. Voir checkForUpdate()
pour obtenir une mise à jour de notice.
- Consentement autorisé
appConsent.consentableAllowed(1,0)
Renvoie true
si le consentement avec id = 1
et consentableType=0
est autorisé, false
autrement. L'identifiant id
à passer est l'iabId
de votre purpose et consentableType
est le type, par exemple : purpose = 0
.
- Stack autorisée
appConsent.stackAllowed(1)
Retourne true
si le stack avec id = 1
est autorisé, false
sinon.
- Vendor autorisé
appConsent.vendorAllowed(1)
Retourne true
si le vendor avec id = 1
est autorisé, false
sinon.
- Définition du statut du consentement
appConsent.setConsentableConsents(
mapOf(1 to ConsentStatus.ALLOWED, 2 to ConsentStatus.DISALLOWED),
object : AppConsentSetConsentableConsentsCallback {
override fun onSuccess() {
// ...
}
override fun onError(t: Throwable) {
// ...
}
}
)
Définit le statut des consentements, l'enregistre et le renvoie au serveur.
- Vérification des mises à jour
appConsent.checkForUpdate(object : AppConsentUpdateCallback {
override fun onResult(updated: Boolean) {
// ...
}
override fun onError(t: Throwable?) {
// ...
}
})
Vérifie si le consentement doit être mis à jour (nouvelle version gvl, nouveaux consentements...).
- Clear consents
appConsent.clearConsent()
Efface le consentement sur le device, mais pas sur le serveur.
- Définir les données externes
val map = mapOf<String, Any>("externalId" to "abze23", "otherData" to "{\"name\": \"test\"}")
appConsent.setExternalData(map)
Définit les données externes et les envoie au serveur.
- Obtention des données externes
val map: Map<String, Any> = appConsent.getExternalData()
warning
Informations Manifest
Nous avons désactivé la sauvegarde automatique, qui permet d'envoyer des données sensibles sur le Google Drive (celle-ci étant automatiquement activé tant que non redéfini par le développeur).
Si votre application à besoin d'intégrer ce besoin, alors il vous suffit de rajouter ces lignes:
android:allowBackup="true"
android:fullBackupContent="true"
android:dataExtractionRules="{YOUR_XML_RULES}"
tools:replace="android:allowBackup,android:fullBackupContent,android:dataExtractionRules"
Référez vous également à la doc officiel pour couvrir vos besoins: https://developer.android.com/guide/topics/data/autobackup#xml-syntax-android-12
Pour plus de détails, reportez vous à la doc officiel de Google concernant les règles de merge dans le Manifest : https://developer.android.com/build/manage-manifests
- Vérifier si l'utilisateur a donné son consentement
appConsent.consentGiven()
Retourne true
si le consentement est donné, false
sinon.
- Consent listener
Ajout d'un Listener
appConsent.setOnPresentNoticeListener(object : OnPresentNoticeListener {
override fun presentConsentGiven() {
// ...
}
override fun presentConsentError(error: Throwable?) {
// ...
}
})
Retirer le Listener
appConsent.setOnPresentNoticeListener(null)
- Affichage de la notice de la CMP
// @return true si la notice s'affiche, false sinon
appConsent.tryDisplayNotice(false) // Affiche la notice de la CMP uniquement si requis
appConsent.tryDisplayNotice(true) // Force l'affichage de la notice de la CMP
info
tryDisplayNotice(force : Boolean)
est une méthode locale qui ne vérifie que le cache. Voir checkForUpdate()
pour obtenir une mise à jour de notice.
- Consentement autorisé
appConsent.consentableAllowed(1,0)
Renvoie true
si le consentement avec id = 1
et consentableType=0
est autorisé, false
autrement. L'identifiant id
à passer est l'iabId
de votre purpose et consentableType
est le type, par exemple : purpose = 0
.
- Stack autorisée
appConsent.stackAllowed(1)
Retourne true
si le stack avec id = 1
est autorisé, false
sinon.
- Vendor autorisé
appConsent.vendorAllowed(1)
Retourne true
si le vendor avec id = 1
est autorisé, false
sinon.
- Définition du statut du consentement
appConsent.setConsentableConsents(
mapOf(1 to ConsentStatus.ALLOWED, 2 to ConsentStatus.DISALLOWED),
object : AppConsentSetConsentableConsentsCallback {
override fun onSuccess() {
// ...
}
override fun onError(t: Throwable) {
// ...
}
}
)
Définit le statut des consentements, l'enregistre et le renvoie au serveur.
- Vérification des mises à jour
appConsent.checkForUpdate(object : AppConsentUpdateCallback {
override fun onResult(updated: Boolean) {
// ...
}
override fun onError(t: Throwable?) {
// ...
}
})
Vérifie si le consentement doit être mis à jour (nouvelle version gvl, nouveaux consentements...).
- Clear consents
appConsent.clearConsent()
Efface le consentement sur le device, mais pas sur le serveur.
- Définir les données externes
val map = mapOf<String, Any>("externalId" to "abze23", "otherData" to "{\"name\": \"test\"}")
appConsent.setExternalData(map)
Définit les données externes et les envoie au serveur.
- Obtention des données externes
val map: Map<String, Any> = appConsent.getExternalData()
4. Récupération des consentements
Vos consentements sont enregistrés dans SharedPreferences
de votre application TV. Pour en savoir plus sur les clés utilisées pour sauvegarder vos consentements, veuillez vous référer à la documentation IAB.