Media Native Placement
Media Native renders the same video and display creatives as the Media format, but inside a layout you build and control instead of the SDK's own container. The SDK still owns the paid click, the same as Media.
Sample App
The official Teads SDK sample application includes working examples of this format. Use it for implementation examples and as a reference while you set up this placement.
Example
- Kotlin
- Java
import tv.teads.sdk.combinedsdk.adplacement.TeadsAdPlacementMediaNative
import tv.teads.sdk.combinedsdk.adplacement.config.TeadsAdPlacementMediaNativeConfig
import tv.teads.sdk.combinedsdk.adplacement.interfaces.TeadsAdPlacementEventsDelegate
import tv.teads.sdk.combinedsdk.adplacement.interfaces.core.TeadsAdPlacement
import tv.teads.sdk.combinedsdk.TeadsAdPlacementEventName
import tv.teads.sdk.renderer.NativeAdView
import android.net.Uri
class ContentActivity : AppCompatActivity(), TeadsAdPlacementEventsDelegate {
private var nativePlacement: TeadsAdPlacementMediaNative? = null
private var nativeAdView: NativeAdView? = null
private lateinit var binding: ActivityNativeAdBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityNativeAdBinding.inflate(layoutInflater)
setContentView(binding.root)
setupNativeAd()
}
private fun setupNativeAd() {
// Create custom native ad view
nativeAdView = createCustomNativeAdView()
// Create configuration
val config = TeadsAdPlacementMediaNativeConfig(
124859, // Your unique Placement ID
Uri.parse("https://yoursite.com/article")
)
// Create placement
nativePlacement = TeadsAdPlacementMediaNative(
this, // Context
config, // Placement config
this // Event delegate
)
// Load and bind the ad
nativePlacement
?.loadAd()
?.let { binder ->
// Bind the ad native object to your native ad view
binder(binding.myContainerAdView.nativeAdView)
}
}
override fun onPlacementEvent(
placement: TeadsAdPlacement<*, *>,
event: TeadsAdPlacementEventName,
data: Map<String, Any>?
) {
// Listen the ad lifecycle events
}
override fun onDestroy() {
super.onDestroy()
nativePlacement?.clean()
}
}
import tv.teads.sdk.combinedsdk.adplacement.TeadsAdPlacementMediaNative;
import tv.teads.sdk.combinedsdk.adplacement.config.TeadsAdPlacementMediaNativeConfig;
import tv.teads.sdk.combinedsdk.adplacement.interfaces.TeadsAdPlacementEventsDelegate;
import tv.teads.sdk.combinedsdk.adplacement.interfaces.core.TeadsAdPlacement;
import tv.teads.sdk.combinedsdk.TeadsAdPlacementEventName;
import tv.teads.sdk.renderer.NativeAdView;
import android.net.Uri;
import kotlin.Unit;
import kotlin.jvm.functions.Function1;
import java.util.Map;
public class ContentActivity extends AppCompatActivity implements TeadsAdPlacementEventsDelegate {
private TeadsAdPlacementMediaNative nativePlacement;
private NativeAdView nativeAdView;
private ActivityNativeAdBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityNativeAdBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
setupNativeAd();
}
private void setupNativeAd() {
// Create custom native ad view
nativeAdView = createCustomNativeAdView();
// Create configuration — the trailing MediaScale param has a Kotlin default
// (null, meaning "use the SDK default") that doesn't bridge; pass it explicitly
TeadsAdPlacementMediaNativeConfig config = new TeadsAdPlacementMediaNativeConfig(
124859, // Your unique Placement ID
Uri.parse("https://yoursite.com/article"),
null // MediaScale
);
// Create placement
nativePlacement = new TeadsAdPlacementMediaNative(
this, // Context
config, // Placement config
this // Event delegate
);
// Load and bind the ad — loadAd() returns a Kotlin Function1<NativeAdView, Unit>,
// call its invoke() method from Java
Function1<NativeAdView, Unit> binder = nativePlacement.loadAd();
if (binder != null) {
binder.invoke(binding.myContainerAdView.getNativeAdView());
}
}
@Override
public void onPlacementEvent(TeadsAdPlacement<?, ?> placement, TeadsAdPlacementEventName event, Map<String, ?> data) {
// Listen the ad lifecycle events
}
@Override
protected void onDestroy() {
super.onDestroy();
if (nativePlacement != null) {
nativePlacement.clean();
}
}
}
Ad Lifecycle Listener
Implement TeadsAdPlacementEventsDelegate to observe playback, clicks, and viewability. See Placement Events Listener for the full event reference and error handling guide.
Checklist
- ✅ Ensure Brand Safety is enabled
- ✅ Ensure you comply with privacy legal requirements (GDPR/CCPA/GPP)
- ✅ Comply with app-ads.txt
- ✅ Implement proper error handling
- ✅ Test with the PIDs in Test PIDs and Configurations