<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://engineeringportal.nielsen.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=VenkataDodla</id>
	<title>Engineering Client Portal - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://engineeringportal.nielsen.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=VenkataDodla"/>
	<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/wiki/Special:Contributions/VenkataDodla"/>
	<updated>2026-10-25T03:11:59Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.5</generator>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=Android_SDK_Release_Notes&amp;diff=7760</id>
		<title>Android SDK Release Notes</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=Android_SDK_Release_Notes&amp;diff=7760"/>
		<updated>2026-10-16T18:16:43Z</updated>

		<summary type="html">&lt;p&gt;VenkataDodla: Added release notes for Android AppSDK 11.0.0&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Digital]]&lt;br /&gt;
 __NOTOC__&lt;br /&gt;
&lt;br /&gt;
{{Breadcrumb|}} {{Breadcrumb|Digital Downloads}} {{CurrentBreadcrumb}}&lt;br /&gt;
&lt;br /&gt;
== Release 11.0.0.0 (10-16-2026) ==&lt;br /&gt;
*Updated SDK with compileSdk - 37, targetSdkVersion - 37, Java 17 and Kotlin 2.1.10.&lt;br /&gt;
*Added FL/PFL (Flush/previous flush) events to the DCR event data in timer pings.&lt;br /&gt;
*Updated the timestamps of DCR event data from milliseconds to seconds.&lt;br /&gt;
*Standardized the error ping format across app and browser SDK(s).&lt;br /&gt;
*Fixed the issues within the existing DCR event reporting scenarios.&lt;br /&gt;
*Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 10.2.1.0 (07-24-2026) ==&lt;br /&gt;
*Address the exception due to setExpedited() in WorkManager in AndroidOS &amp;lt; 12.&lt;br /&gt;
&lt;br /&gt;
== Release 10.2.0.0 (03-24-2026) ==&lt;br /&gt;
&lt;br /&gt;
* [[Mitigation of Android 15 background]] network access restrictions.&lt;br /&gt;
* Fixed Viewabiity defects.&lt;br /&gt;
* Ad length warning - Fixed the ad tracking logic so now, the 300-second warning will only fire if the current ad actually plays for more than 5 minutes, and that error state will no longer bleed over into the next ad.&lt;br /&gt;
&lt;br /&gt;
== Release 10.1.0.0 (10-17-2025) ==&lt;br /&gt;
*Support for FPID multi-instance integrations.&lt;br /&gt;
*Support for Flutter cross-platform plugin.&lt;br /&gt;
*Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 10.0.0.0 (04-04-2025) ==&lt;br /&gt;
*Support for DTVR Subminute product.&lt;br /&gt;
*Support for DCR video playhead bridging.&lt;br /&gt;
*Support for Ethernet network connection for TV platforms.&lt;br /&gt;
*Change in DemographicID behavior for Chromecast.&lt;br /&gt;
*Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 9.4.0.0 (07-09-2024) ==&lt;br /&gt;
*Support for content tracking and no-tracking domains across sdk flavors and products.&lt;br /&gt;
*Upgraded SDK to use Java 11 and Kotlin 1.8.0.                                  &lt;br /&gt;
*Other bug fixes and enhancements.&lt;br /&gt;
== Release 9.3.0.0 (05-10-2024) ==&lt;br /&gt;
*Support for capturing user opt-out during initialization.&lt;br /&gt;
== Release 9.2.0.0 (9-27-2023) ==&lt;br /&gt;
*DCR Static recognizing metadata with changed assetID for new impressions. &lt;br /&gt;
*Limiting ping retries during https failures. &lt;br /&gt;
*Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 9.1.0.0 (3-31-2023) ==&lt;br /&gt;
*DCR Static duration measurement for AppSDK (currently only AGF)&lt;br /&gt;
*Viewability: allow enabling by product (DCR, DTVR)&lt;br /&gt;
*Other bug fixes and enhancements&lt;br /&gt;
&lt;br /&gt;
== Release 9.0.0.0 (10-07-2022) ==&lt;br /&gt;
* Viewability measurement for DTVR, DCR Content and DCR Ad products. &lt;br /&gt;
* Audibility measurement for DTVR, DCR Content and DCR Ad products.&lt;br /&gt;
* Kotlin-Java interoperability implementation in SDK.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 8.2.0.0 (03-21-2022) ==&lt;br /&gt;
* Support for EMM AGF AdID-less solution.&lt;br /&gt;
* Enabled SDK to capture network availability changes.&lt;br /&gt;
* Removed the usage of deprecated network classes.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 8.1.0.0 (06-28-2021) ==&lt;br /&gt;
* Support for SDK build variants - AD/NoAD/NoID.&lt;br /&gt;
* Support to indicate ID used for AD build variant - AD ID vs Android ID.&lt;br /&gt;
* Support to capture Hashed email and UID.&lt;br /&gt;
* Support to collect SDK diagnostic data.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 8.0.0.0 (10-05-2020) ==&lt;br /&gt;
* FPID and VendorID support.&lt;br /&gt;
* Support for Android apps running on ChromeOS.&lt;br /&gt;
* Support for Xamarin cross platform framework.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 7.2.0.0 (05-18-2020) ==&lt;br /&gt;
* DTVR AQH and IVD requirements for End and pause timeout.&lt;br /&gt;
* Support for Hybrid app webview measurement. &lt;br /&gt;
* Support for Hybrid app react native webview measurement. &lt;br /&gt;
* Support for React Native measurement.&lt;br /&gt;
* Other bug fixes and enhancements&lt;br /&gt;
&lt;br /&gt;
== Release 7.1.0.0 (12-09-2019) ==&lt;br /&gt;
&lt;br /&gt;
* Application background/foreground state auto-detection (AndroidX)&lt;br /&gt;
* Fixed forward rewind evdata containing negative values&lt;br /&gt;
* Offline viewing measurement enhancements&lt;br /&gt;
* Revisited precedence logic for sfcode parameter&lt;br /&gt;
* Using default value for incorrect adModel parameter&lt;br /&gt;
* Defaulting isLive parameter value on channel change&lt;br /&gt;
* Other fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 7.0.0.0 (09-06-2019) ==&lt;br /&gt;
&lt;br /&gt;
* Support for CDN based config.&lt;br /&gt;
* Support for Market based EMM UAID pings.&lt;br /&gt;
* Changes required for proper DCR Static measurement in multi-instance/multiple appid's case.&lt;br /&gt;
* Fixes for OTT synchronization issues between iOS and Android platforms.&lt;br /&gt;
* Fixes for EV data parameters in few scenarios.&lt;br /&gt;
* Fixes for DCR Static product behaviour in background app refresh and background fetch scenarios.&lt;br /&gt;
* DCR Ad reporting improvements.&lt;br /&gt;
* Fixes and improvements for the SDK console log messages.&lt;br /&gt;
* Other enhancements and fixes.&lt;br /&gt;
&lt;br /&gt;
== Release 6.2.0.0  (02-04-2019) ==&lt;br /&gt;
* Removal of Location Module from SDK Code.&lt;br /&gt;
* Fixed the getOptoutStatus() api, so that client can call it in main thread.&lt;br /&gt;
* Fixed the parsing error happening when clientid/vcid provided as empty in metadata.&lt;br /&gt;
* Align AppSDK for FW detection with BSDK for DCR measurement.&lt;br /&gt;
* Other enhancements and fixes.&lt;br /&gt;
&lt;br /&gt;
== Release 6.1.0.1 (9-13-2018) ==&lt;br /&gt;
*Support added for Video On Demand in TV Ratings&lt;br /&gt;
*Bug fixes and improvements&lt;br /&gt;
&lt;br /&gt;
== Release 6.0.0.4 (5-24-2018) ==&lt;br /&gt;
*If the SDK build target is set to AGF then SDK will send the hello ping to “eu” and “eu-uat” for debug builds. No changes to the non AGF build the default sfcode will continue to be &amp;quot;sdk&amp;quot; and &amp;quot;cert&amp;quot; for debug build.&lt;br /&gt;
*The C1 parameter (NUID) will now be sent as encrypted DeviceID.&lt;br /&gt;
*New SessionID changes. The sessionID will contain 29 length random characters appended by timestamp.&lt;br /&gt;
*Support for multiple SDK instance without any limit.&lt;br /&gt;
*New log feature for CAT tool to retrieve the API level information from client apps. This ping will contain the eventType, parameters, SDK version, appid etc.&lt;br /&gt;
*Removed Viewability for this release.&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.26 (7-31-2017) ==&lt;br /&gt;
*Genre parameter will be a part of DCR pings and the value is reflected as part of c44 parameter.&lt;br /&gt;
*Merged adModel and adLoadType flags&lt;br /&gt;
*Fix for stop event data carried to next session’s duration ping&lt;br /&gt;
*Fix for last playhead call that is not processed (when there is no time-gap between the last playhead and end call)&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.24 (6-2-2017) ==&lt;br /&gt;
*Enhanced support for Digital Audio&lt;br /&gt;
*Ability to pass adloadtype as “linear” or “dynamic”&lt;br /&gt;
*Ability to detect end of content and static material through duration pings&lt;br /&gt;
*Acceptance of empty parameters with a warning message triggered, if a required parameter is missing&lt;br /&gt;
*Acceptance of case-insensitive JSON key values&lt;br /&gt;
*Configurable feature to show Ad view counts in the duration pings&lt;br /&gt;
*Automatic Pause Detection and Debug build detection&lt;br /&gt;
*Change of default ‘type’ from “ad” to “content”&lt;br /&gt;
*Removal of “Static” Launch Ping for Non-Static product implementations&lt;br /&gt;
*Fix for metadata carry over between channels after a channel change&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.18 (1-24-2017) ==&lt;br /&gt;
*Ability to opt-out using “Limit Ad Tracking” feature&lt;br /&gt;
*Improved CPU Performance through encryption process change&lt;br /&gt;
*Opt-Out pages can be served based on user’s language and locale from device&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.14 (12-10-2016) ==&lt;br /&gt;
*Support for Nielsen TV Brand Effect&lt;br /&gt;
*Ability to set CMS parameters at a more global level&lt;br /&gt;
*Collection of additional device information&lt;br /&gt;
*Opt-out pages based on locale and country&lt;br /&gt;
*Opt-out based on the ‘Limit Ad Tracking’ flag&lt;br /&gt;
*Issue a warning in client developer’s console when an ad is being played for more than 5 minutes&lt;br /&gt;
*Reduced load time of Android SDK, caused due to encryption.&lt;br /&gt;
*Limit the duration reported for App launch&lt;br /&gt;
*Modification to accept non-JSON strings&lt;br /&gt;
*Fixed&lt;br /&gt;
**Incorrect DRM placement ID&lt;br /&gt;
**DRM pings sent in bursts in case of time change&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.10 (10-19-2016) ==&lt;br /&gt;
*Fixed an issue where SDK will send a burst of data pings in Android.&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.7 (9-1-2016) ==&lt;br /&gt;
*Support for Android N&lt;br /&gt;
*Usage of stop API call is made optional when switching between content or advertising occurs.&lt;br /&gt;
*General bug fix and performance improvements&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.4 (8-1-2016) ==&lt;br /&gt;
*Support for Pause timeout (from 30 minutes to 5 minutes)&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.3 (7-7-2016) ==&lt;br /&gt;
*Sending event level (button press data) data to census collections.&lt;br /&gt;
*Changes in OTT when switching from mobile to Chromecast&lt;br /&gt;
*General bug fix and performance improvements&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.0.4 (4-25-2016) ==&lt;br /&gt;
*Combined SDK for DCR US and International (Germany)&lt;br /&gt;
*API to signal end of content (end API)&lt;br /&gt;
*Changes to use of stop API&lt;br /&gt;
*Support for OTT measurement&lt;br /&gt;
*Support for Pause timeout&lt;br /&gt;
*Offline viewing&lt;br /&gt;
*Updated API to support JSON object instead of string.&lt;br /&gt;
*Reporting of media URL and bundle ID&lt;br /&gt;
*Updated ping retry logic&lt;br /&gt;
*Changes in OptOut process behavioral&lt;br /&gt;
*Enhanced Debugging and SDK logging&lt;br /&gt;
*Changes to API signature&lt;br /&gt;
*Introduced new API updateOTT to report current OTT status.&lt;br /&gt;
&lt;br /&gt;
== Release 4.0.0.8 (6-9-2015) ==&lt;br /&gt;
*Support for Nielsen DCR product (Digital Content Ratings)&lt;br /&gt;
*All the products should be migrated to the latest SDK.&lt;br /&gt;
*This SDK distribution does not have a native library component or shared object.&lt;br /&gt;
*Support for Nielsen App static measurement&lt;br /&gt;
*Support for Ad measurement&lt;br /&gt;
*Removal of Native C++ code&lt;br /&gt;
*Removed singleton restriction&lt;br /&gt;
*Support for Android 6.0 Marshmallow&lt;br /&gt;
*General bug fix and performance improvements&lt;br /&gt;
&lt;br /&gt;
== Release 1.2.3.8 (1-10-2015) ==&lt;/div&gt;</summary>
		<author><name>VenkataDodla</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=Digital_Measurement_Video_AndroidTV&amp;diff=7688</id>
		<title>Digital Measurement Video AndroidTV</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=Digital_Measurement_Video_AndroidTV&amp;diff=7688"/>
		<updated>2026-06-22T07:47:23Z</updated>

		<summary type="html">&lt;p&gt;VenkataDodla: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}}{{Breadcrumb|DCR &amp;amp; DTVR}}{{CurrentBreadcrumb}}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
This guide provides step-by-step instructions for integrating the Nielsen Android AppSDK into Android TV application.&lt;br /&gt;
&lt;br /&gt;
The SDK supports three measurement types: DCR  (Digital Content Ratings) Video for measuring VOD and live streaming video content by tracking playhead positions during playback, DCR Static for measuring non-video content such as web views, articles, and informational screens, and DTVR (Digital TV Ratings) for measuring live streams by processing Nielsen ID3  tags watermarks embedded in the broadcast signal.&lt;br /&gt;
===Android AppSDK Integration into Android TV App===&lt;br /&gt;
The below steps cover the complete integration process including AppSDK initialization, metadata ingestion, playhead tracking, ID3 tag processing and user opt-out/opt-in implementation.&lt;br /&gt;
====Step 1: Adding Nielsen AppSDK Dependency====&lt;br /&gt;
Add the Nielsen Android AppSDK Jar maven dependency to the Application module within the build.gradle file.&lt;br /&gt;
&lt;br /&gt;
In the app-level configuration file (build.gradle), add the below dependencies.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;kotlin&amp;quot;&amp;gt;&lt;br /&gt;
dependencies {&lt;br /&gt;
    implementation 'com.nielsenappsdk.global:ad:10.2.0.0'&lt;br /&gt;
    implementation 'com.google.android.gms:play-services-ads-identifier:18.2.0'&lt;br /&gt;
    implementation &amp;quot;androidx.work:work-runtime:2.11.2&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
====Step 2: Configuring AppSDK Initialization Parameters====&lt;br /&gt;
Build the JSON object by providing required values (App ID and Debug level).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;kotlin&amp;quot;&amp;gt;&lt;br /&gt;
val config = JSONObject()&lt;br /&gt;
    .put(&amp;quot;appid&amp;quot;, &amp;quot;NIELSEN_APP_ID&amp;quot;)         // Nielsen-provided App ID  [required]&lt;br /&gt;
    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;DEBUG&amp;quot;)           // only for debug builds    &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
====Step 3: Initializing AppSDK====&lt;br /&gt;
The following example code is for creating a singleton manager (Refer NielsenSdkManager.kt from the sample app source) and initializing the Android AppSDK when the app starts.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;kotlin&amp;quot;&amp;gt;&lt;br /&gt;
private var mAppSdk: AppSdk? = null&lt;br /&gt;
&lt;br /&gt;
fun initializeAppSdk(context: Context, config: JSONObject) {&lt;br /&gt;
    mAppSdk = AppSdk(context, config, object : IAppNotifier {&lt;br /&gt;
        override fun onAppSdkEvent(timestamp: Long, code: Int, description: String?) {&lt;br /&gt;
            if (code == AppSdk.EVENT_STARTUP) {&lt;br /&gt;
                Log.d(&amp;quot;Nielsen&amp;quot;, &amp;quot;AppSdk initialized successfully&amp;quot;)&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
    &lt;br /&gt;
    if (mAppSdk?.isValid != true) {&lt;br /&gt;
        Log.e(&amp;quot;Nielsen&amp;quot;, &amp;quot;Failed to initialize AppSdk&amp;quot;)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===='''Step 4: Starting the AppSDK Measurement (DCR/DTVR)'''====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''4.1:''' The following example code demonstrates the invocation of play() and loadMetadata() api calls whenever video playback begins.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;kotlin&amp;quot;&amp;gt;&lt;br /&gt;
fun appStartMeteringVideo(video: Video) {&lt;br /&gt;
    // Build content metadata&lt;br /&gt;
    val metaData = JSONObject()&lt;br /&gt;
        .put(&amp;quot;type&amp;quot;, &amp;quot;content&amp;quot;)               // type of content [required]&lt;br /&gt;
        .put(&amp;quot;assetid&amp;quot;, &amp;quot;uniqueassetid&amp;quot;)      // unique ID for each asset [required]&lt;br /&gt;
        .put(&amp;quot;program&amp;quot;, &amp;quot;Program Name&amp;quot;)       // name of program [required]&lt;br /&gt;
        .put(&amp;quot;title&amp;quot;, &amp;quot;Episode Title&amp;quot;)        // name of the episode [required]&lt;br /&gt;
        .put(&amp;quot;length&amp;quot;, &amp;quot;3600&amp;quot;)                // length of content [required]&lt;br /&gt;
        .put(&amp;quot;adloadtype&amp;quot;, &amp;quot;2&amp;quot;)               // type of ad load i.e 1=linear, 2=dynamic [required for DCR Video]&lt;br /&gt;
        .put(&amp;quot;adModel&amp;quot;, &amp;quot;2&amp;quot;)                  // type of ad load i.e 1=linear, 2=dynamic [required for DTVR]&lt;br /&gt;
    &lt;br /&gt;
    // Build channel information&lt;br /&gt;
    val channelInfo = JSONObject()&lt;br /&gt;
        .put(&amp;quot;channelName&amp;quot;, &amp;quot;channelName&amp;quot;)  // pass descriptive stream information through this parameter&lt;br /&gt;
        .put(&amp;quot;mediaURL&amp;quot;, &amp;quot;videoUrl&amp;quot;)        // Video URL value for the content that is being played&lt;br /&gt;
    &lt;br /&gt;
    // Start measurement&lt;br /&gt;
    mAppSdk?.play(channelInfo)&lt;br /&gt;
    mAppSdk?.loadMetadata(metaData)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A comprehensive list of parameters which can be passed to AppSDK are listed here - [https://engineeringportal.nielsen.com/wiki/play() play()] and [https://engineeringportal.nielsen.com/wiki/loadMetadata() loadMetadata()]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''4.2:''' The following example demonstrates the passing of playhead positions to AppSDK every one second during the playback of content. This is needed for DCR Video measurement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;kotlin&amp;quot;&amp;gt;&lt;br /&gt;
fun monitorPlayhead(exoPlayer: ExoPlayer) {&lt;br /&gt;
    monitorJob = lifecycle.coroutineScope.launch(Dispatchers.Main) {&lt;br /&gt;
      var ticks = 0&lt;br /&gt;
        while (isActive) {&lt;br /&gt;
            if (exoPlayer.isPlaying) {&lt;br /&gt;
                val positionMs = exoPlayer.currentPosition&lt;br /&gt;
                val durationMs = exoPlayer.duration&lt;br /&gt;
                &lt;br /&gt;
                ticks++&lt;br /&gt;
               // Report every 1 second (since loop runs every 500ms)&lt;br /&gt;
                if (ticks % 2 == 0) {&lt;br /&gt;
                val playheadToReport: Long = if (videoDuration &amp;lt;= 0) {&lt;br /&gt;
                     System.currentTimeMillis() / 1000  // Live: UTC time&lt;br /&gt;
                  } else {&lt;br /&gt;
                     videoPosition.toLong()  // VOD: Position from start&lt;br /&gt;
                   }&lt;br /&gt;
              &lt;br /&gt;
                mAppSdk?.setPlayheadPosition(playheadSeconds)&lt;br /&gt;
            }&lt;br /&gt;
            delay(500)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''4.3:''' The following example demonstrates the passing of Nielsen ID3 tags to AppSDK during the playback of content. This is needed for DTVR measurement.&lt;br /&gt;
&lt;br /&gt;
The following example code demonstrates the extraction of ID3 metadata events from ExoPlayer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;kotlin&amp;quot;&amp;gt;&lt;br /&gt;
inner class PlayerEventListener : Player.Listener {&lt;br /&gt;
    override fun onMetadata(metadata: Metadata) {&lt;br /&gt;
        for (i in 0 until metadata.length()) {&lt;br /&gt;
            val entry = metadata.get(i)&lt;br /&gt;
            if (entry is PrivFrame) {&lt;br /&gt;
                val owner = entry.owner&lt;br /&gt;
                val data = String(entry.privateData, Charsets.UTF_8)&lt;br /&gt;
                &lt;br /&gt;
                // Check if it's a Nielsen ID3 tag&lt;br /&gt;
                if (owner.contains(&amp;quot;nielsen&amp;quot;, ignoreCase = true) ||&lt;br /&gt;
                    owner.contains(&amp;quot;www.nielsen.com&amp;quot;, ignoreCase = true)) {&lt;br /&gt;
                    appProcessID3tag(owner + data)&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;kotlin&amp;quot;&amp;gt;&lt;br /&gt;
fun appProcessID3tag(id3String: String?) {&lt;br /&gt;
    try {&lt;br /&gt;
        mAppSdk?.sendID3(id3String)&lt;br /&gt;
    } catch (e: Exception) {&lt;br /&gt;
        Log.e(&amp;quot;Nielsen&amp;quot;, &amp;quot;Cannot process ID3 tag: ${e.message}&amp;quot;)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
====Step 5: '''Stopping the AppSDK Measurement (DCR/DTVR)'''====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following code snippet demonstrates the pausing of AppSDK measurement whenever the video playback is paused or when switching between ad to content or content to ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;kotlin&amp;quot;&amp;gt;&lt;br /&gt;
fun appStopMeteringVideo() {&lt;br /&gt;
    mAppSdk?.stop()&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following code snipped demonstrates the completion of AppSDK measurement in case of DCR Video typically used when content playback is completed. This is triggered 1) at the end of the content stream 2) if the user switches to another piece of content&lt;br /&gt;
&lt;br /&gt;
Note: In case of DTVR this acts as an interrupt similar to stop() api&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;kotlin&amp;quot;&amp;gt;&lt;br /&gt;
fun appEndMeteringVideo() {&lt;br /&gt;
    mAppSdk?.end()&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
====Step 6: Measuring Non Video Content (DCR Static)====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following code snippet demonstrates the measurement of static screens/pages by sending the metadata of the static page/screen to AppSDK.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;kotlin&amp;quot;&amp;gt;&lt;br /&gt;
fun staticLoadMetadata() {&lt;br /&gt;
    val metadata = JSONObject()&lt;br /&gt;
        .put(&amp;quot;type&amp;quot;, &amp;quot;static&amp;quot;)                    // type of content [required]&lt;br /&gt;
        .put(&amp;quot;section&amp;quot;, &amp;quot;Web View Screen&amp;quot;)        // section of site [required]&lt;br /&gt;
        .put(&amp;quot;segA&amp;quot;, &amp;quot;CustomSegmentA&amp;quot;)            // custom segment [optional]&lt;br /&gt;
        .put(&amp;quot;segB&amp;quot;, &amp;quot;CustomSegmentB&amp;quot;)            // custom segment [optional]&lt;br /&gt;
        .put(&amp;quot;segC&amp;quot;, &amp;quot;CustomSegmentC&amp;quot;)            // custom segment [optional]&lt;br /&gt;
        .put(&amp;quot;crossId1&amp;quot;, &amp;quot;Standard Episode ID&amp;quot;)   // [optional]&lt;br /&gt;
        .put(&amp;quot;crossId2&amp;quot;, &amp;quot;Content Originator&amp;quot;)    // [optional]&lt;br /&gt;
    &lt;br /&gt;
    mAppSdk?.loadMetadata(metadata)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following code snippet demonstrates the completion of static screens/pages measurement by invoking staticEnd() on AppSDK which will finalise the screen/page viewed time.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;kotlin&amp;quot;&amp;gt;&lt;br /&gt;
fun staticEnd() {&lt;br /&gt;
    mAppSdk?.staticEnd()&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
====Step 7: Opting out of AppSDK measurement====&lt;br /&gt;
The following example code is to provide users the ability to opt out of Nielsen measurement.&lt;br /&gt;
&lt;br /&gt;
Below code snippet is used to fetch the Nielsen opt-out web page URL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;kotlin&amp;quot;&amp;gt;&lt;br /&gt;
fun getOptOutUrl(): String {&lt;br /&gt;
    return mAppSdk?.userOptOutURLString() ?: &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
// Load this URL in a WebView&lt;br /&gt;
webView.loadUrl(getOptOutUrl())&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Below code snippet is used to supply the response message captured from opt-out webpage to the AppSDK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;kotlin&amp;quot;&amp;gt;&lt;br /&gt;
webView.webViewClient = object : WebViewClient() {&lt;br /&gt;
    override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean {&lt;br /&gt;
        val url = request.url.toString()&lt;br /&gt;
        &lt;br /&gt;
        // Check for Nielsen opt-out response&lt;br /&gt;
        if (url.startsWith(&amp;quot;nielsenappsdk://&amp;quot;)) {&lt;br /&gt;
            mAppSdk?.userOptOut(url)&lt;br /&gt;
            // Navigate back or show confirmation&lt;br /&gt;
            return true&lt;br /&gt;
        }&lt;br /&gt;
        return false&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
====Step 8: Closing the AppSDK instance====&lt;br /&gt;
Kindly call this API whenever the application is closing or before creating another AppSDK instance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;kotlin&amp;quot;&amp;gt;&lt;br /&gt;
fun appCloseMeteringVideo() {&lt;br /&gt;
    mAppSdk?.close()&lt;br /&gt;
    mAppSdk = null&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Quick Reference - Android AppSDK Methods===&lt;br /&gt;
The table below provides a summary of the core Android AppSDK methods, their primary functions, and the appropriate triggers for calling them within your application lifecycle.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Method&lt;br /&gt;
!Purpose&lt;br /&gt;
!When to Call&lt;br /&gt;
|-&lt;br /&gt;
|play(channelInfo)&lt;br /&gt;
|Start content session&lt;br /&gt;
|Video playback begins.&lt;br /&gt;
|-&lt;br /&gt;
|loadMetadata(metadata)&lt;br /&gt;
|Send content/Ad/static info&lt;br /&gt;
|After play API call or for static content.&lt;br /&gt;
|-&lt;br /&gt;
|setPlayheadPosition(video playback pos)&lt;br /&gt;
|Report playhead position&lt;br /&gt;
|setPlayheadPosition(pos) - sets the playhead position in AppSDK as video playback time (seconds) in the content (VOD Video On Demand) or the current UTC time for live stream.&lt;br /&gt;
|-&lt;br /&gt;
|sendID3(tag)&lt;br /&gt;
|Process DTVR videos&lt;br /&gt;
|When ID3 tag received from stream.&lt;br /&gt;
|-&lt;br /&gt;
|stop()&lt;br /&gt;
|Pause measurement&lt;br /&gt;
|Video paused.&lt;br /&gt;
|-&lt;br /&gt;
|end()&lt;br /&gt;
|End content session&lt;br /&gt;
|Video playback ends.&lt;br /&gt;
|-&lt;br /&gt;
|staticEnd()&lt;br /&gt;
|End static session&lt;br /&gt;
|Leave static content screen.&lt;br /&gt;
|-&lt;br /&gt;
|close()&lt;br /&gt;
|Destroy SDK instance&lt;br /&gt;
|App exit only.&lt;br /&gt;
|-&lt;br /&gt;
|userOptOutURLString()&lt;br /&gt;
|Get opt-out URL&lt;br /&gt;
|Display opt-out WebView.&lt;br /&gt;
|-&lt;br /&gt;
|userOptOut(url)&lt;br /&gt;
|Set opt-out preference&lt;br /&gt;
|When the user completes the opt-out.&lt;br /&gt;
|-&lt;br /&gt;
|getNielsenId()&lt;br /&gt;
|Retrieve Nielsen ID&lt;br /&gt;
|When need to access the unique Nielsen identifier.&lt;br /&gt;
|-&lt;br /&gt;
|getDeviceId()&lt;br /&gt;
|Retrieve Device ID&lt;br /&gt;
|When need to access the unique device identifier.&lt;br /&gt;
|-&lt;br /&gt;
|getDemographicId()&lt;br /&gt;
|Retrieve Demographic ID&lt;br /&gt;
|When need to access the AppSDK session identifier.&lt;br /&gt;
|-&lt;br /&gt;
|getMeterVersion()&lt;br /&gt;
|Retrieve SDK Meter Version&lt;br /&gt;
|When need to check the current SDK version.&lt;br /&gt;
|-&lt;br /&gt;
|getOptOutStatus()&lt;br /&gt;
|Retrieve the Opt-Out or Opt-In state.&lt;br /&gt;
|When need to know the Opt-Out or Opt-In status.&lt;br /&gt;
|}&lt;br /&gt;
===Sample App: Download, Build, Emulator Setup and Install the AndroidTV===&lt;br /&gt;
The following section provides instructions for downloading the sample application, building the APK within Android Studio, and setting up the necessary Android TV emulator environment for testing.&lt;br /&gt;
====1: Download the package here====&lt;br /&gt;
Click [https://d280mermnrvzn0.cloudfront.net/NielsenAndroidTVSampleVideoPlayerApp.zip here] to  download the project and open the project in Android Studio IDE.&lt;br /&gt;
====2: Build the APK from this Project====&lt;br /&gt;
Before building the apk, create an AndroidTV emulator from the IDE and install the App directly through Android Studio.&lt;br /&gt;
&lt;br /&gt;
Follow the steps to test AndroidTV sample Apps in TV Emulators and how to build the app from the client package.&lt;br /&gt;
====3: Create the Android TV Emulator====&lt;br /&gt;
To create an Android TV emulator, you primarily use [https://developer.android.com/studio Android Studio] to set up an Android Virtual Device (AVD).&lt;br /&gt;
====4: Install the AndroidTV sample video player App====&lt;br /&gt;
Once you have built the APK and configured your Android TV emulator, use either of the following methods to install the sample video player application.&lt;br /&gt;
&lt;br /&gt;
Method 1: Drag and Drop (Easiest)&lt;br /&gt;
&lt;br /&gt;
Use your mouse to drag and drop the APK onto the running emulator :&lt;br /&gt;
#Launch the Android TV emulator.&lt;br /&gt;
#Locate the .apk file on your computer.&lt;br /&gt;
#Drag the file and drop it directly onto the emulator window.&lt;br /&gt;
#Wait for the installation to automatically complete.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Method 2: Use ADB (Command Line)&lt;br /&gt;
&lt;br /&gt;
Use the Android Debug Bridge (ADB) if you have the Android SDK Platform-Tools installed :&lt;br /&gt;
#Open the terminal or command prompt.&lt;br /&gt;
#Ensure emulator is running and detected by typing: -&amp;gt; adb devices.&lt;br /&gt;
#Install the APK by running the following command:   -&amp;gt; adb install path/to/your/sample_app.apk.&lt;br /&gt;
===Open up Android TV Emulator===&lt;br /&gt;
After installing the sample app, follow these steps to launch the Nielsen Sample TV application on your emulator.&lt;br /&gt;
&lt;br /&gt;
Select Nielsen Sample TV App  -&amp;gt; Select Legacy Option[[File:Screenshot 20260527 133449.png|center|720x720px|link=https://nielsentest.mywikis.net/wiki/File:Screenshot_20260527_133449.png]][[File:Screenshot 20260527 133705.png|center|720x720px|link=https://nielsentest.mywikis.net/wiki/File:Screenshot_20260527_133705.png]][[File:Screenshot 20260527 134418.png|center|720x720px|link=https://nielsentest.mywikis.net/wiki/File:Screenshot_20260527_134418.png]][[File:Screenshot 20260529 152139.png|center|720x720px|link=https://nielsentest.mywikis.net/wiki/File:Screenshot_20260529_152139.png]]Setting page for  select  Opt out/in options[[File:Screenshot 20260527 134647.png|center|720x720px|border|link=https://nielsentest.mywikis.net/wiki/File:Screenshot_20260527_134647.png]]&lt;br /&gt;
===Next Steps===&lt;br /&gt;
If there are any questions or concerns then please reach out to the AppSDK team. Reference the following guides for product specific information :&lt;br /&gt;
*[[DCR Video Android SDK|DCR Video]]&lt;br /&gt;
*[[DCR Static Android SDK|DCR Static]]&lt;br /&gt;
*[[DTVR Android SDK|DTVR]]&lt;br /&gt;
For further technical details , please contact your Technical Account Manager (TAM).&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>VenkataDodla</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=File:Screenshot_20260527_134647.png&amp;diff=7687</id>
		<title>File:Screenshot 20260527 134647.png</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=File:Screenshot_20260527_134647.png&amp;diff=7687"/>
		<updated>2026-06-22T07:44:27Z</updated>

		<summary type="html">&lt;p&gt;VenkataDodla: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>VenkataDodla</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=File:Screenshot_20260529_152139.png&amp;diff=7686</id>
		<title>File:Screenshot 20260529 152139.png</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=File:Screenshot_20260529_152139.png&amp;diff=7686"/>
		<updated>2026-06-22T07:43:55Z</updated>

		<summary type="html">&lt;p&gt;VenkataDodla: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>VenkataDodla</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=File:Screenshot_20260527_134418.png&amp;diff=7685</id>
		<title>File:Screenshot 20260527 134418.png</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=File:Screenshot_20260527_134418.png&amp;diff=7685"/>
		<updated>2026-06-22T07:42:56Z</updated>

		<summary type="html">&lt;p&gt;VenkataDodla: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>VenkataDodla</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=File:Screenshot_20260527_133705.png&amp;diff=7684</id>
		<title>File:Screenshot 20260527 133705.png</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=File:Screenshot_20260527_133705.png&amp;diff=7684"/>
		<updated>2026-06-22T07:42:33Z</updated>

		<summary type="html">&lt;p&gt;VenkataDodla: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>VenkataDodla</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=File:Screenshot_20260527_133449.png&amp;diff=7683</id>
		<title>File:Screenshot 20260527 133449.png</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=File:Screenshot_20260527_133449.png&amp;diff=7683"/>
		<updated>2026-06-22T07:39:35Z</updated>

		<summary type="html">&lt;p&gt;VenkataDodla: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>VenkataDodla</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=US_DCR_%26_DTVR&amp;diff=7682</id>
		<title>US DCR &amp; DTVR</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=US_DCR_%26_DTVR&amp;diff=7682"/>
		<updated>2026-06-22T07:38:16Z</updated>

		<summary type="html">&lt;p&gt;VenkataDodla: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
{{CategoryIcon|DCR.png|US Digital Content Ratings (DCR) &amp;amp; Digital in TV Ratings (DTVR)}}&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot;| Start Here&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
| '''Step-By-Step SDK Integration Guides ([[BSDK Step By Step|Browser]], [[Android Step By Step|Android]], [[iOS Step By Step|iOS]])'''&lt;br /&gt;
| '''API Reference Tables ([[Browser_SDK_API_Table|Browser]], [[Android_SDK_API_Table|Android]], [[iOS_SDK_API_Table|iOS]])'''&lt;br /&gt;
|-&lt;br /&gt;
| '''[[DCR_vs_DTVR|DCR vs. DTVR Implementation - Key Differences]]'''&lt;br /&gt;
| '''Product Information - [https://markets.nielsen.com/us/en/solutions/capabilities/digital-content-ratings/ DCR], [https://www.nielsen.com/solutions/audience-measurement/national-tv/ DTVR]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot;| General Reference&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Digital Measurement Onboarding]]'''&lt;br /&gt;
| '''[[Digital Measurement Metadata]]'''&lt;br /&gt;
| '''[[Digital Measurement Testing]]'''&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Digital Measurement Interruption Scenarios]]'''&lt;br /&gt;
| '''[[Digital Measurement FAQ]]'''&lt;br /&gt;
| '''SDK Release Notes - [[Browser_SDK_Release_Notes|Browser]], [[Android_SDK_Release_Notes|Android]], [[iOS_SDK_Release_Notes|iOS]], [[TVOS_SDK_Release_Notes|TVOS]], [[DOMless SDK Release Notes|DOMless]]'''&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Digital Pre-Certification Checklist App SDK]]'''&lt;br /&gt;
| '''[[Digital Pre-Certification Checklist Browser SDK]]'''&lt;br /&gt;
| '''[[Digital Measurement Persistent Identifiers]]'''&lt;br /&gt;
|-&lt;br /&gt;
|[[Dual Instances of SDK|'''Dual Instances of SDK''']]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SEI ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Single Endpoint Integration (SEI) - log-file based data transaction mechanism&lt;br /&gt;
|-&lt;br /&gt;
!Type&lt;br /&gt;
!&lt;br /&gt;
!Implementation Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; |{{SmallIcon|DigitalIcon.png}}&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; |{{OSIcon|VideoIcon.png|alt=Video}}&lt;br /&gt;
|'''[[Digital Measurement SEI Streaming Content Viewing]]'''&lt;br /&gt;
|-&lt;br /&gt;
|'''[[Digital Measurement Content Asset Metadata]]'''&lt;br /&gt;
|-&lt;br /&gt;
|'''[[Digital Measurement Content Audit Beacon]]'''&lt;br /&gt;
|-&lt;br /&gt;
|'''[[Digital Measurement SEI Audio File]](Only for DTVR)'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SDK - Video ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; | Maintaining an existing ''DCR'' or ''DTVR'' App integration? Continue to reference the API you're already using with the guides below.&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
! style=&amp;quot;width: 30%;&amp;quot; | DCR Implementation Guide&lt;br /&gt;
! style=&amp;quot;width: 25%;&amp;quot; | DTVR Implementation Guide&lt;br /&gt;
!| SDK Documentation&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; | {{SmallIcon|SDKIcon.png|alt=SDK}}&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | {{OSIcon|VideoIcon.png|alt=Video}}&lt;br /&gt;
| {{OSIcon|macOSIcon.png|alt=iOS}}&lt;br /&gt;
| '''[[DCR Video iOS SDK]]'''&lt;br /&gt;
| '''[[DTVR iOS SDK]]'''&lt;br /&gt;
| [[iOS SDK API Reference]]&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|AndroidIcon.png|alt=Android}}&lt;br /&gt;
| '''[[DCR Video Android SDK]]'''&lt;br /&gt;
| '''[[DTVR Android SDK]]'''&lt;br /&gt;
| [[Android SDK API Reference]]&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png|alt=Browser}}&lt;br /&gt;
| '''[[DCR Video Browser SDK]]'''&lt;br /&gt;
| '''[[DTVR Browser SDK]]'''&lt;br /&gt;
| [[Browser SDK API Reference]]&lt;br /&gt;
|-&lt;br /&gt;
|{{OSIcon|BrowserIcon.png|alt=Browser}}&lt;br /&gt;
|'''[[DCR Video Domless SDK]]'''&lt;br /&gt;
|'''[[DTVR Domless SDK]]'''&lt;br /&gt;
|[[Domless SDK API Reference]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SDK - Static ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
! style=&amp;quot;width: 55%;&amp;quot; | DCR Implementation Guide&lt;br /&gt;
!| SDK Documentation&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; | {{SmallIcon|SDKIcon.png|alt=SDK}}&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; | {{OSIcon|StaticIcon.png|alt=Static Content}}&lt;br /&gt;
| {{OSIcon|macOSIcon.png|alt=iOS}}&lt;br /&gt;
| '''[[DCR Static iOS SDK]]'''&lt;br /&gt;
| [[iOS SDK API Reference]]&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|AndroidIcon.png|alt=Android}}&lt;br /&gt;
| '''[[DCR Static Android SDK]]'''&lt;br /&gt;
| [[Android SDK API Reference]]&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | {{OSIcon|BrowserIcon.png|alt=Browser}}&lt;br /&gt;
| '''[[DCR Static Browser SDK]]'''&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; | [[Browser SDK API Reference]]&lt;br /&gt;
|-&lt;br /&gt;
| '''[[DCR Static Lite Browser SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
|  {{OSIcon|GoogleTagManagerIcon.png|alt=Google Tag Manager}}&lt;br /&gt;
| '''[[DCR Static Google Tag Manager]]'''&lt;br /&gt;
|-&lt;br /&gt;
|  {{OSIcon|FacebookIcon.png|alt=Facebook Instant Articles}}&lt;br /&gt;
| '''[[DCR Static Facebook Instant Articles Browser SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
|  {{OSIcon|Tealium_Icon.png|alt=Tealium}}&lt;br /&gt;
| '''[[DCR Static Tealium]]'''&lt;br /&gt;
|-&lt;br /&gt;
|  {{OSIcon|AMPIcon.png|alt=Google AMP}}&lt;br /&gt;
| '''[[DCR Static Google AMP Cloud API]]'''&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|{{OSIcon|BrowserIcon.png|alt=Browser}}&lt;br /&gt;
|'''[[DCR Static Domless SDK]]'''&lt;br /&gt;
|[[Domless SDK API Reference]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Xamarin ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; | Xamarin Integration Guides (Xamarin support is part of [[Special:Downloads|Nielsen's AppSDK V8]] and above.)&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| Implementation Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; | {{SmallIcon|SDKIcon.png|alt=SDK}}&lt;br /&gt;
|-&lt;br /&gt;
|  {{OSIcon|VideoIcon.png|alt=Video}}&lt;br /&gt;
| {{OSIcon|APIIcon.png|alt=Xamarin}}&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | '''[[DCR_%26_DTVR_Xamarin_Integration|DCR &amp;amp; DTVR Xamarin Integration]]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== AppSDK Flutter Plugin ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; | Flutter Integration Guides (Flutter support is part of [[Special:Downloads|Nielsen's AppSDK V10.1.0]] and above.)&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| Implementation Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; | {{SmallIcon|SDKIcon.png|alt=SDK}}&lt;br /&gt;
|-&lt;br /&gt;
|  {{OSIcon|VideoIcon.png|alt=Video}}&lt;br /&gt;
| {{OSIcon|APIIcon.png|alt=Xamarin}}&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | '''[[DCR_%26_DTVR_Flutter_Integration|DCR &amp;amp; DTVR Flutter Integration]]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Cloud API ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| DCR Implementation Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{SmallIcon|CloudAPIIcon.png|alt=Cloud API}} &lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |&lt;br /&gt;
{{OSIcon|VideoIcon.png|alt=Video}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{{OSIcon|StaticIcon.png|alt=Static Content}}&lt;br /&gt;
| {{OSIcon|APIIcon.png|alt=Cloud API}}&lt;br /&gt;
| '''[[DCR Video &amp;amp; Static Cloud API ]]''' &lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|APIIcon.png|alt=Cloud API}}&lt;br /&gt;
| '''[[DCR Video &amp;amp; Static Mobile Cloud API ]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|RokuIcon.png|alt=Roku}}&lt;br /&gt;
| '''[[DCR Video &amp;amp; Static Roku Cloud API]]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Adobe Launch Extensions ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; | Leverage Launch by Adobe? The guides below describe how to integrate DCR and DTVR with Nielsen's Adobe Launch extension&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| Implementation Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; | {{SmallIcon|SDKIcon.png|alt=SDK}}&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | '''[[Digital Measurement Onboarding Adobe ]]'''&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{OSIcon|VideoIcon.png|alt=Video}}&lt;br /&gt;
| {{OSIcon|macOSIcon.png|alt=iOS}}&lt;br /&gt;
| '''[[DCR &amp;amp; DTVR iOS Adobe Launch Extension]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|AndroidIcon.png|alt=Android}}&lt;br /&gt;
| '''[[DCR &amp;amp; DTVR Android Adobe Launch Extension]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png|alt=Browser}}&lt;br /&gt;
| '''[[DCR &amp;amp; DTVR Browser Adobe Launch Extension]]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SDK - Connected TV ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; | The guides below describe how to integrate DCR and DTVR with Smart tv's&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
! | Implementation Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; | {{SmallIcon|SDKIcon.png|alt=SDK}}&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | {{OSIcon|VideoIcon.png|alt=Video}}&lt;br /&gt;
| {{OSIcon|BrowserIcon.png|alt=Browser}}&lt;br /&gt;
| '''[[Digital Measurement Video TizenTv]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png|alt=Browser}}&lt;br /&gt;
| '''[[Digital Measurement Video webOS]]'''&lt;br /&gt;
|-&lt;br /&gt;
|{{OSIcon|AndroidIcon.png|alt=Android}}&lt;br /&gt;
|[[Digital Measurement Video AndroidTV|'''Digital Measurement Video AndroidTV''']]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>VenkataDodla</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=US_DCR_%26_DTVR&amp;diff=7681</id>
		<title>US DCR &amp; DTVR</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=US_DCR_%26_DTVR&amp;diff=7681"/>
		<updated>2026-06-22T07:37:48Z</updated>

		<summary type="html">&lt;p&gt;VenkataDodla: /* SDK - Connected TV */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
{{CategoryIcon|DCR.png|US Digital Content Ratings (DCR) &amp;amp; Digital in TV Ratings (DTVR)}}&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot;| Start Here&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
| '''Step-By-Step SDK Integration Guides ([[BSDK Step By Step|Browser]], [[Android Step By Step|Android]], [[iOS Step By Step|iOS]])'''&lt;br /&gt;
| '''API Reference Tables ([[Browser_SDK_API_Table|Browser]], [[Android_SDK_API_Table|Android]], [[iOS_SDK_API_Table|iOS]])'''&lt;br /&gt;
|-&lt;br /&gt;
| '''[[DCR_vs_DTVR|DCR vs. DTVR Implementation - Key Differences]]'''&lt;br /&gt;
| '''Product Information - [https://markets.nielsen.com/us/en/solutions/capabilities/digital-content-ratings/ DCR], [https://www.nielsen.com/solutions/audience-measurement/national-tv/ DTVR]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot;| General Reference&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Digital Measurement Onboarding]]'''&lt;br /&gt;
| '''[[Digital Measurement Metadata]]'''&lt;br /&gt;
| '''[[Digital Measurement Testing]]'''&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Digital Measurement Interruption Scenarios]]'''&lt;br /&gt;
| '''[[Digital Measurement FAQ]]'''&lt;br /&gt;
| '''SDK Release Notes - [[Browser_SDK_Release_Notes|Browser]], [[Android_SDK_Release_Notes|Android]], [[iOS_SDK_Release_Notes|iOS]], [[TVOS_SDK_Release_Notes|TVOS]], [[DOMless SDK Release Notes|DOMless]]'''&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Digital Pre-Certification Checklist App SDK]]'''&lt;br /&gt;
| '''[[Digital Pre-Certification Checklist Browser SDK]]'''&lt;br /&gt;
| '''[[Digital Measurement Persistent Identifiers]]'''&lt;br /&gt;
|-&lt;br /&gt;
|[[Dual Instances of SDK|'''Dual Instances of SDK''']]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SEI ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Single Endpoint Integration (SEI) - log-file based data transaction mechanism&lt;br /&gt;
|-&lt;br /&gt;
!Type&lt;br /&gt;
!&lt;br /&gt;
!Implementation Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; |{{SmallIcon|DigitalIcon.png}}&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; |{{OSIcon|VideoIcon.png|alt=Video}}&lt;br /&gt;
|'''[[Digital Measurement SEI Streaming Content Viewing]]'''&lt;br /&gt;
|-&lt;br /&gt;
|'''[[Digital Measurement Content Asset Metadata]]'''&lt;br /&gt;
|-&lt;br /&gt;
|'''[[Digital Measurement Content Audit Beacon]]'''&lt;br /&gt;
|-&lt;br /&gt;
|'''[[Digital Measurement SEI Audio File]](Only for DTVR)'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SDK - Video ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; | Maintaining an existing ''DCR'' or ''DTVR'' App integration? Continue to reference the API you're already using with the guides below.&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
! style=&amp;quot;width: 30%;&amp;quot; | DCR Implementation Guide&lt;br /&gt;
! style=&amp;quot;width: 25%;&amp;quot; | DTVR Implementation Guide&lt;br /&gt;
!| SDK Documentation&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; | {{SmallIcon|SDKIcon.png|alt=SDK}}&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | {{OSIcon|VideoIcon.png|alt=Video}}&lt;br /&gt;
| {{OSIcon|macOSIcon.png|alt=iOS}}&lt;br /&gt;
| '''[[DCR Video iOS SDK]]'''&lt;br /&gt;
| '''[[DTVR iOS SDK]]'''&lt;br /&gt;
| [[iOS SDK API Reference]]&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|AndroidIcon.png|alt=Android}}&lt;br /&gt;
| '''[[DCR Video Android SDK]]'''&lt;br /&gt;
| '''[[DTVR Android SDK]]'''&lt;br /&gt;
| [[Android SDK API Reference]]&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png|alt=Browser}}&lt;br /&gt;
| '''[[DCR Video Browser SDK]]'''&lt;br /&gt;
| '''[[DTVR Browser SDK]]'''&lt;br /&gt;
| [[Browser SDK API Reference]]&lt;br /&gt;
|-&lt;br /&gt;
|{{OSIcon|BrowserIcon.png|alt=Browser}}&lt;br /&gt;
|'''[[DCR Video Domless SDK]]'''&lt;br /&gt;
|'''[[DTVR Domless SDK]]'''&lt;br /&gt;
|[[Domless SDK API Reference]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SDK - Static ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
! style=&amp;quot;width: 55%;&amp;quot; | DCR Implementation Guide&lt;br /&gt;
!| SDK Documentation&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; | {{SmallIcon|SDKIcon.png|alt=SDK}}&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; | {{OSIcon|StaticIcon.png|alt=Static Content}}&lt;br /&gt;
| {{OSIcon|macOSIcon.png|alt=iOS}}&lt;br /&gt;
| '''[[DCR Static iOS SDK]]'''&lt;br /&gt;
| [[iOS SDK API Reference]]&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|AndroidIcon.png|alt=Android}}&lt;br /&gt;
| '''[[DCR Static Android SDK]]'''&lt;br /&gt;
| [[Android SDK API Reference]]&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | {{OSIcon|BrowserIcon.png|alt=Browser}}&lt;br /&gt;
| '''[[DCR Static Browser SDK]]'''&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; | [[Browser SDK API Reference]]&lt;br /&gt;
|-&lt;br /&gt;
| '''[[DCR Static Lite Browser SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
|  {{OSIcon|GoogleTagManagerIcon.png|alt=Google Tag Manager}}&lt;br /&gt;
| '''[[DCR Static Google Tag Manager]]'''&lt;br /&gt;
|-&lt;br /&gt;
|  {{OSIcon|FacebookIcon.png|alt=Facebook Instant Articles}}&lt;br /&gt;
| '''[[DCR Static Facebook Instant Articles Browser SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
|  {{OSIcon|Tealium_Icon.png|alt=Tealium}}&lt;br /&gt;
| '''[[DCR Static Tealium]]'''&lt;br /&gt;
|-&lt;br /&gt;
|  {{OSIcon|AMPIcon.png|alt=Google AMP}}&lt;br /&gt;
| '''[[DCR Static Google AMP Cloud API]]'''&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|{{OSIcon|BrowserIcon.png|alt=Browser}}&lt;br /&gt;
|'''[[DCR Static Domless SDK]]'''&lt;br /&gt;
|[[Domless SDK API Reference]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Xamarin ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; | Xamarin Integration Guides (Xamarin support is part of [[Special:Downloads|Nielsen's AppSDK V8]] and above.)&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| Implementation Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; | {{SmallIcon|SDKIcon.png|alt=SDK}}&lt;br /&gt;
|-&lt;br /&gt;
|  {{OSIcon|VideoIcon.png|alt=Video}}&lt;br /&gt;
| {{OSIcon|APIIcon.png|alt=Xamarin}}&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | '''[[DCR_%26_DTVR_Xamarin_Integration|DCR &amp;amp; DTVR Xamarin Integration]]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== AppSDK Flutter Plugin ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; | Flutter Integration Guides (Flutter support is part of [[Special:Downloads|Nielsen's AppSDK V10.1.0]] and above.)&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| Implementation Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; | {{SmallIcon|SDKIcon.png|alt=SDK}}&lt;br /&gt;
|-&lt;br /&gt;
|  {{OSIcon|VideoIcon.png|alt=Video}}&lt;br /&gt;
| {{OSIcon|APIIcon.png|alt=Xamarin}}&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | '''[[DCR_%26_DTVR_Flutter_Integration|DCR &amp;amp; DTVR Flutter Integration]]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Cloud API ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| DCR Implementation Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{SmallIcon|CloudAPIIcon.png|alt=Cloud API}} &lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |&lt;br /&gt;
{{OSIcon|VideoIcon.png|alt=Video}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{{OSIcon|StaticIcon.png|alt=Static Content}}&lt;br /&gt;
| {{OSIcon|APIIcon.png|alt=Cloud API}}&lt;br /&gt;
| '''[[DCR Video &amp;amp; Static Cloud API ]]''' &lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|APIIcon.png|alt=Cloud API}}&lt;br /&gt;
| '''[[DCR Video &amp;amp; Static Mobile Cloud API ]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|RokuIcon.png|alt=Roku}}&lt;br /&gt;
| '''[[DCR Video &amp;amp; Static Roku Cloud API]]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Adobe Launch Extensions ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; | Leverage Launch by Adobe? The guides below describe how to integrate DCR and DTVR with Nielsen's Adobe Launch extension&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| Implementation Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; | {{SmallIcon|SDKIcon.png|alt=SDK}}&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | '''[[Digital Measurement Onboarding Adobe ]]'''&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{OSIcon|VideoIcon.png|alt=Video}}&lt;br /&gt;
| {{OSIcon|macOSIcon.png|alt=iOS}}&lt;br /&gt;
| '''[[DCR &amp;amp; DTVR iOS Adobe Launch Extension]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|AndroidIcon.png|alt=Android}}&lt;br /&gt;
| '''[[DCR &amp;amp; DTVR Android Adobe Launch Extension]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png|alt=Browser}}&lt;br /&gt;
| '''[[DCR &amp;amp; DTVR Browser Adobe Launch Extension]]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SDK - Connected TV ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; | The guides below describe how to integrate DCR and DTVR with Smart tv's&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
! | Implementation Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; | {{SmallIcon|SDKIcon.png|alt=SDK}}&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | {{OSIcon|VideoIcon.png|alt=Video}}&lt;br /&gt;
| {{OSIcon|BrowserIcon.png|alt=Browser}}&lt;br /&gt;
| '''[[Digital Measurement Video TizenTv]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png|alt=Browser}}&lt;br /&gt;
| '''[[Digital Measurement Video webOS]]'''&lt;br /&gt;
|-&lt;br /&gt;
|{{OSIcon|AndroidIcon.png|alt=Android}}&lt;br /&gt;
|[[Digital Measurement Video AndroidTV]]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>VenkataDodla</name></author>
	</entry>
	<entry>
		<id>https://engineeringportal.nielsen.com/w/index.php?title=Digital_Measurement_Video_AndroidTV&amp;diff=7680</id>
		<title>Digital Measurement Video AndroidTV</title>
		<link rel="alternate" type="text/html" href="https://engineeringportal.nielsen.com/w/index.php?title=Digital_Measurement_Video_AndroidTV&amp;diff=7680"/>
		<updated>2026-06-22T07:36:41Z</updated>

		<summary type="html">&lt;p&gt;VenkataDodla: Initial save for AndroidTV sample app SDK integration details and document&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}}{{Breadcrumb|DCR &amp;amp; DTVR}}{{CurrentBreadcrumb}}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
This guide provides step-by-step instructions for integrating the Nielsen Android AppSDK into Android TV application.&lt;br /&gt;
&lt;br /&gt;
The SDK supports three measurement types: DCR  (Digital Content Ratings) Video for measuring VOD and live streaming video content by tracking playhead positions during playback, DCR Static for measuring non-video content such as web views, articles, and informational screens, and DTVR (Digital TV Ratings) for measuring live streams by processing Nielsen ID3  tags watermarks embedded in the broadcast signal.&lt;br /&gt;
===Android AppSDK Integration into Android TV App===&lt;br /&gt;
The below steps cover the complete integration process including AppSDK initialization, metadata ingestion, playhead tracking, ID3 tag processing and user opt-out/opt-in implementation.&lt;br /&gt;
====Step 1: Adding Nielsen AppSDK Dependency====&lt;br /&gt;
Add the Nielsen Android AppSDK Jar maven dependency to the Application module within the build.gradle file.&lt;br /&gt;
&lt;br /&gt;
In the app-level configuration file (build.gradle), add the below dependencies.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;kotlin&amp;quot;&amp;gt;&lt;br /&gt;
dependencies {&lt;br /&gt;
    implementation 'com.nielsenappsdk.global:ad:10.2.0.0'&lt;br /&gt;
    implementation 'com.google.android.gms:play-services-ads-identifier:18.2.0'&lt;br /&gt;
    implementation &amp;quot;androidx.work:work-runtime:2.11.2&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
====Step 2: Configuring AppSDK Initialization Parameters====&lt;br /&gt;
Build the JSON object by providing required values (App ID and Debug level).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;kotlin&amp;quot;&amp;gt;&lt;br /&gt;
val config = JSONObject()&lt;br /&gt;
    .put(&amp;quot;appid&amp;quot;, &amp;quot;NIELSEN_APP_ID&amp;quot;)         // Nielsen-provided App ID  [required]&lt;br /&gt;
    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;DEBUG&amp;quot;)           // only for debug builds    &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
====Step 3: Initializing AppSDK====&lt;br /&gt;
The following example code is for creating a singleton manager (Refer NielsenSdkManager.kt from the sample app source) and initializing the Android AppSDK when the app starts.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;kotlin&amp;quot;&amp;gt;&lt;br /&gt;
private var mAppSdk: AppSdk? = null&lt;br /&gt;
&lt;br /&gt;
fun initializeAppSdk(context: Context, config: JSONObject) {&lt;br /&gt;
    mAppSdk = AppSdk(context, config, object : IAppNotifier {&lt;br /&gt;
        override fun onAppSdkEvent(timestamp: Long, code: Int, description: String?) {&lt;br /&gt;
            if (code == AppSdk.EVENT_STARTUP) {&lt;br /&gt;
                Log.d(&amp;quot;Nielsen&amp;quot;, &amp;quot;AppSdk initialized successfully&amp;quot;)&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
    &lt;br /&gt;
    if (mAppSdk?.isValid != true) {&lt;br /&gt;
        Log.e(&amp;quot;Nielsen&amp;quot;, &amp;quot;Failed to initialize AppSdk&amp;quot;)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===='''Step 4: Starting the AppSDK Measurement (DCR/DTVR)'''====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''4.1:''' The following example code demonstrates the invocation of play() and loadMetadata() api calls whenever video playback begins.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;kotlin&amp;quot;&amp;gt;&lt;br /&gt;
fun appStartMeteringVideo(video: Video) {&lt;br /&gt;
    // Build content metadata&lt;br /&gt;
    val metaData = JSONObject()&lt;br /&gt;
        .put(&amp;quot;type&amp;quot;, &amp;quot;content&amp;quot;)               // type of content [required]&lt;br /&gt;
        .put(&amp;quot;assetid&amp;quot;, &amp;quot;uniqueassetid&amp;quot;)      // unique ID for each asset [required]&lt;br /&gt;
        .put(&amp;quot;program&amp;quot;, &amp;quot;Program Name&amp;quot;)       // name of program [required]&lt;br /&gt;
        .put(&amp;quot;title&amp;quot;, &amp;quot;Episode Title&amp;quot;)        // name of the episode [required]&lt;br /&gt;
        .put(&amp;quot;length&amp;quot;, &amp;quot;3600&amp;quot;)                // length of content [required]&lt;br /&gt;
        .put(&amp;quot;adloadtype&amp;quot;, &amp;quot;2&amp;quot;)               // type of ad load i.e 1=linear, 2=dynamic [required for DCR Video]&lt;br /&gt;
        .put(&amp;quot;adModel&amp;quot;, &amp;quot;2&amp;quot;)                  // type of ad load i.e 1=linear, 2=dynamic [required for DTVR]&lt;br /&gt;
    &lt;br /&gt;
    // Build channel information&lt;br /&gt;
    val channelInfo = JSONObject()&lt;br /&gt;
        .put(&amp;quot;channelName&amp;quot;, &amp;quot;channelName&amp;quot;)  // pass descriptive stream information through this parameter&lt;br /&gt;
        .put(&amp;quot;mediaURL&amp;quot;, &amp;quot;videoUrl&amp;quot;)        // Video URL value for the content that is being played&lt;br /&gt;
    &lt;br /&gt;
    // Start measurement&lt;br /&gt;
    mAppSdk?.play(channelInfo)&lt;br /&gt;
    mAppSdk?.loadMetadata(metaData)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A comprehensive list of parameters which can be passed to AppSDK are listed here - [https://engineeringportal.nielsen.com/wiki/play() play()] and [https://engineeringportal.nielsen.com/wiki/loadMetadata() loadMetadata()]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''4.2:''' The following example demonstrates the passing of playhead positions to AppSDK every one second during the playback of content. This is needed for DCR Video measurement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;kotlin&amp;quot;&amp;gt;&lt;br /&gt;
fun monitorPlayhead(exoPlayer: ExoPlayer) {&lt;br /&gt;
    monitorJob = lifecycle.coroutineScope.launch(Dispatchers.Main) {&lt;br /&gt;
      var ticks = 0&lt;br /&gt;
        while (isActive) {&lt;br /&gt;
            if (exoPlayer.isPlaying) {&lt;br /&gt;
                val positionMs = exoPlayer.currentPosition&lt;br /&gt;
                val durationMs = exoPlayer.duration&lt;br /&gt;
                &lt;br /&gt;
                ticks++&lt;br /&gt;
               // Report every 1 second (since loop runs every 500ms)&lt;br /&gt;
                if (ticks % 2 == 0) {&lt;br /&gt;
                val playheadToReport: Long = if (videoDuration &amp;lt;= 0) {&lt;br /&gt;
                     System.currentTimeMillis() / 1000  // Live: UTC time&lt;br /&gt;
                  } else {&lt;br /&gt;
                     videoPosition.toLong()  // VOD: Position from start&lt;br /&gt;
                   }&lt;br /&gt;
              &lt;br /&gt;
                mAppSdk?.setPlayheadPosition(playheadSeconds)&lt;br /&gt;
            }&lt;br /&gt;
            delay(500)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''4.3:''' The following example demonstrates the passing of Nielsen ID3 tags to AppSDK during the playback of content. This is needed for DTVR measurement.&lt;br /&gt;
&lt;br /&gt;
The following example code demonstrates the extraction of ID3 metadata events from ExoPlayer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;kotlin&amp;quot;&amp;gt;&lt;br /&gt;
inner class PlayerEventListener : Player.Listener {&lt;br /&gt;
    override fun onMetadata(metadata: Metadata) {&lt;br /&gt;
        for (i in 0 until metadata.length()) {&lt;br /&gt;
            val entry = metadata.get(i)&lt;br /&gt;
            if (entry is PrivFrame) {&lt;br /&gt;
                val owner = entry.owner&lt;br /&gt;
                val data = String(entry.privateData, Charsets.UTF_8)&lt;br /&gt;
                &lt;br /&gt;
                // Check if it's a Nielsen ID3 tag&lt;br /&gt;
                if (owner.contains(&amp;quot;nielsen&amp;quot;, ignoreCase = true) ||&lt;br /&gt;
                    owner.contains(&amp;quot;www.nielsen.com&amp;quot;, ignoreCase = true)) {&lt;br /&gt;
                    appProcessID3tag(owner + data)&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;kotlin&amp;quot;&amp;gt;&lt;br /&gt;
fun appProcessID3tag(id3String: String?) {&lt;br /&gt;
    try {&lt;br /&gt;
        mAppSdk?.sendID3(id3String)&lt;br /&gt;
    } catch (e: Exception) {&lt;br /&gt;
        Log.e(&amp;quot;Nielsen&amp;quot;, &amp;quot;Cannot process ID3 tag: ${e.message}&amp;quot;)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
====Step 5: '''Stopping the AppSDK Measurement (DCR/DTVR)'''====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following code snippet demonstrates the pausing of AppSDK measurement whenever the video playback is paused or when switching between ad to content or content to ad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;kotlin&amp;quot;&amp;gt;&lt;br /&gt;
fun appStopMeteringVideo() {&lt;br /&gt;
    mAppSdk?.stop()&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following code snipped demonstrates the completion of AppSDK measurement in case of DCR Video typically used when content playback is completed. This is triggered 1) at the end of the content stream 2) if the user switches to another piece of content&lt;br /&gt;
&lt;br /&gt;
Note: In case of DTVR this acts as an interrupt similar to stop() api&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;kotlin&amp;quot;&amp;gt;&lt;br /&gt;
fun appEndMeteringVideo() {&lt;br /&gt;
    mAppSdk?.end()&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
====Step 6: Measuring Non Video Content (DCR Static)====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following code snippet demonstrates the measurement of static screens/pages by sending the metadata of the static page/screen to AppSDK.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;kotlin&amp;quot;&amp;gt;&lt;br /&gt;
fun staticLoadMetadata() {&lt;br /&gt;
    val metadata = JSONObject()&lt;br /&gt;
        .put(&amp;quot;type&amp;quot;, &amp;quot;static&amp;quot;)                    // type of content [required]&lt;br /&gt;
        .put(&amp;quot;section&amp;quot;, &amp;quot;Web View Screen&amp;quot;)        // section of site [required]&lt;br /&gt;
        .put(&amp;quot;segA&amp;quot;, &amp;quot;CustomSegmentA&amp;quot;)            // custom segment [optional]&lt;br /&gt;
        .put(&amp;quot;segB&amp;quot;, &amp;quot;CustomSegmentB&amp;quot;)            // custom segment [optional]&lt;br /&gt;
        .put(&amp;quot;segC&amp;quot;, &amp;quot;CustomSegmentC&amp;quot;)            // custom segment [optional]&lt;br /&gt;
        .put(&amp;quot;crossId1&amp;quot;, &amp;quot;Standard Episode ID&amp;quot;)   // [optional]&lt;br /&gt;
        .put(&amp;quot;crossId2&amp;quot;, &amp;quot;Content Originator&amp;quot;)    // [optional]&lt;br /&gt;
    &lt;br /&gt;
    mAppSdk?.loadMetadata(metadata)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following code snippet demonstrates the completion of static screens/pages measurement by invoking staticEnd() on AppSDK which will finalise the screen/page viewed time.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;kotlin&amp;quot;&amp;gt;&lt;br /&gt;
fun staticEnd() {&lt;br /&gt;
    mAppSdk?.staticEnd()&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
====Step 7: Opting out of AppSDK measurement====&lt;br /&gt;
The following example code is to provide users the ability to opt out of Nielsen measurement.&lt;br /&gt;
&lt;br /&gt;
Below code snippet is used to fetch the Nielsen opt-out web page URL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;kotlin&amp;quot;&amp;gt;&lt;br /&gt;
fun getOptOutUrl(): String {&lt;br /&gt;
    return mAppSdk?.userOptOutURLString() ?: &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
// Load this URL in a WebView&lt;br /&gt;
webView.loadUrl(getOptOutUrl())&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Below code snippet is used to supply the response message captured from opt-out webpage to the AppSDK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;kotlin&amp;quot;&amp;gt;&lt;br /&gt;
webView.webViewClient = object : WebViewClient() {&lt;br /&gt;
    override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean {&lt;br /&gt;
        val url = request.url.toString()&lt;br /&gt;
        &lt;br /&gt;
        // Check for Nielsen opt-out response&lt;br /&gt;
        if (url.startsWith(&amp;quot;nielsenappsdk://&amp;quot;)) {&lt;br /&gt;
            mAppSdk?.userOptOut(url)&lt;br /&gt;
            // Navigate back or show confirmation&lt;br /&gt;
            return true&lt;br /&gt;
        }&lt;br /&gt;
        return false&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
====Step 8: Closing the AppSDK instance====&lt;br /&gt;
Kindly call this API whenever the application is closing or before creating another AppSDK instance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;kotlin&amp;quot;&amp;gt;&lt;br /&gt;
fun appCloseMeteringVideo() {&lt;br /&gt;
    mAppSdk?.close()&lt;br /&gt;
    mAppSdk = null&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Quick Reference - Android AppSDK Methods===&lt;br /&gt;
The table below provides a summary of the core Android AppSDK methods, their primary functions, and the appropriate triggers for calling them within your application lifecycle.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Method&lt;br /&gt;
!Purpose&lt;br /&gt;
!When to Call&lt;br /&gt;
|-&lt;br /&gt;
|play(channelInfo)&lt;br /&gt;
|Start content session&lt;br /&gt;
|Video playback begins.&lt;br /&gt;
|-&lt;br /&gt;
|loadMetadata(metadata)&lt;br /&gt;
|Send content/Ad/static info&lt;br /&gt;
|After play API call or for static content.&lt;br /&gt;
|-&lt;br /&gt;
|setPlayheadPosition(video playback pos)&lt;br /&gt;
|Report playhead position&lt;br /&gt;
|setPlayheadPosition(pos) - sets the playhead position in AppSDK as video playback time (seconds) in the content (VOD Video On Demand) or the current UTC time for live stream.&lt;br /&gt;
|-&lt;br /&gt;
|sendID3(tag)&lt;br /&gt;
|Process DTVR videos&lt;br /&gt;
|When ID3 tag received from stream.&lt;br /&gt;
|-&lt;br /&gt;
|stop()&lt;br /&gt;
|Pause measurement&lt;br /&gt;
|Video paused.&lt;br /&gt;
|-&lt;br /&gt;
|end()&lt;br /&gt;
|End content session&lt;br /&gt;
|Video playback ends.&lt;br /&gt;
|-&lt;br /&gt;
|staticEnd()&lt;br /&gt;
|End static session&lt;br /&gt;
|Leave static content screen.&lt;br /&gt;
|-&lt;br /&gt;
|close()&lt;br /&gt;
|Destroy SDK instance&lt;br /&gt;
|App exit only.&lt;br /&gt;
|-&lt;br /&gt;
|userOptOutURLString()&lt;br /&gt;
|Get opt-out URL&lt;br /&gt;
|Display opt-out WebView.&lt;br /&gt;
|-&lt;br /&gt;
|userOptOut(url)&lt;br /&gt;
|Set opt-out preference&lt;br /&gt;
|When the user completes the opt-out.&lt;br /&gt;
|-&lt;br /&gt;
|getNielsenId()&lt;br /&gt;
|Retrieve Nielsen ID&lt;br /&gt;
|When need to access the unique Nielsen identifier.&lt;br /&gt;
|-&lt;br /&gt;
|getDeviceId()&lt;br /&gt;
|Retrieve Device ID&lt;br /&gt;
|When need to access the unique device identifier.&lt;br /&gt;
|-&lt;br /&gt;
|getDemographicId()&lt;br /&gt;
|Retrieve Demographic ID&lt;br /&gt;
|When need to access the AppSDK session identifier.&lt;br /&gt;
|-&lt;br /&gt;
|getMeterVersion()&lt;br /&gt;
|Retrieve SDK Meter Version&lt;br /&gt;
|When need to check the current SDK version.&lt;br /&gt;
|-&lt;br /&gt;
|getOptOutStatus()&lt;br /&gt;
|Retrieve the Opt-Out or Opt-In state.&lt;br /&gt;
|When need to know the Opt-Out or Opt-In status.&lt;br /&gt;
|}&lt;br /&gt;
===Sample App: Download, Build, Emulator Setup and Install the AndroidTV===&lt;br /&gt;
The following section provides instructions for downloading the sample application, building the APK within Android Studio, and setting up the necessary Android TV emulator environment for testing.&lt;br /&gt;
====1: Download the package here====&lt;br /&gt;
Click [https://d280mermnrvzn0.cloudfront.net/NielsenAndroidTVSampleVideoPlayerApp.zip here] to  download the project and open the project in Android Studio IDE.&lt;br /&gt;
====2: Build the APK from this Project====&lt;br /&gt;
Before building the apk, create an AndroidTV emulator from the IDE and install the App directly through Android Studio.&lt;br /&gt;
&lt;br /&gt;
Follow the steps to test AndroidTV sample Apps in TV Emulators and how to build the app from the client package.&lt;br /&gt;
====3: Create the Android TV Emulator====&lt;br /&gt;
To create an Android TV emulator, you primarily use [https://developer.android.com/studio Android Studio] to set up an Android Virtual Device (AVD).&lt;br /&gt;
====4: Install the AndroidTV sample video player App====&lt;br /&gt;
Once you have built the APK and configured your Android TV emulator, use either of the following methods to install the sample video player application.&lt;br /&gt;
&lt;br /&gt;
Method 1: Drag and Drop (Easiest)&lt;br /&gt;
&lt;br /&gt;
Use your mouse to drag and drop the APK onto the running emulator :&lt;br /&gt;
#Launch the Android TV emulator.&lt;br /&gt;
#Locate the .apk file on your computer.&lt;br /&gt;
#Drag the file and drop it directly onto the emulator window.&lt;br /&gt;
#Wait for the installation to automatically complete.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Method 2: Use ADB (Command Line)&lt;br /&gt;
&lt;br /&gt;
Use the Android Debug Bridge (ADB) if you have the Android SDK Platform-Tools installed :&lt;br /&gt;
#Open the terminal or command prompt.&lt;br /&gt;
#Ensure emulator is running and detected by typing: -&amp;gt; adb devices.&lt;br /&gt;
#Install the APK by running the following command:   -&amp;gt; adb install path/to/your/sample_app.apk.&lt;br /&gt;
===Open up Android TV Emulator===&lt;br /&gt;
After installing the sample app, follow these steps to launch the Nielsen Sample TV application on your emulator.&lt;br /&gt;
&lt;br /&gt;
Select Nielsen Sample TV App  -&amp;gt; Select Legacy Option[[File:Screenshot 20260527 133449.png|center|720x720px|link=https://nielsentest.mywikis.net/wiki/File:Screenshot_20260527_133449.png]][[File:Screenshot 20260527 133705.png|center|720x720px|link=https://nielsentest.mywikis.net/wiki/File:Screenshot_20260527_133705.png]][[File:Screenshot 20260527 134418.png|center|720x720px|link=https://nielsentest.mywikis.net/wiki/File:Screenshot_20260527_134418.png]][[File:Screenshot 20260529 152139.png|center|720x720px|link=https://nielsentest.mywikis.net/wiki/File:Screenshot_20260529_152139.png]]Setting page for  select  Opt out/in options[[File:Screenshot 20260527 134647.png|center|720x720px|border|link=https://nielsentest.mywikis.net/wiki/File:Screenshot_20260527_134647.png]]&lt;br /&gt;
===Next Steps===&lt;br /&gt;
If there are any questions or concerns then please reach out to the AppSDK team. Reference the following guides for product specific information :&lt;br /&gt;
*[[DCR Video Android SDK|DCR Video]]&lt;br /&gt;
*[[DCR Static Android SDK|DCR Static]]&lt;br /&gt;
*[[DTVR Android SDK|DTVR]]&lt;br /&gt;
For further technical details , please contact your Technical Account Manager (TAM).&lt;/div&gt;</summary>
		<author><name>VenkataDodla</name></author>
	</entry>
</feed>