Media Placement
Media placements display in-content ads. The container can render several creative types, including video.
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.TeadsAdPlacementMedia
import tv.teads.sdk.combinedsdk.adplacement.config.TeadsAdPlacementMediaConfig
import tv.teads.sdk.combinedsdk.adplacement.interfaces.TeadsAdPlacementEventsDelegate
import tv.teads.sdk.combinedsdk.adplacement.interfaces.core.TeadsAdPlacement
import tv.teads.sdk.combinedsdk.TeadsAdPlacementEventName
import android.net.Uri
class ContentActivity : AppCompatActivity(), TeadsAdPlacementEventsDelegate {
private var mediaPlacement: TeadsAdPlacementMedia? = null
private lateinit var binding: ActivityArticleBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityArticleBinding.inflate(layoutInflater)
setContentView(binding.root)
setupMediaPlacement()
}
private fun setupMediaPlacement() {
// Create configuration
val config = TeadsAdPlacementMediaConfig(
pid = 84242, // Your unique Placement ID
articleUrl = Uri.parse("https://yoursite.com/article")
)
// Create placement with delegate
mediaPlacement = TeadsAdPlacementMedia(
this, // Context
config, // Placement config
this // Event delegate
)
// Load the ad
val mediaAdView = mediaPlacement?.loadAd()
// Add to your view hierarchy
binding.myContainerAdView.addView(mediaAdView)
}
override fun onPlacementEvent(
placement: TeadsAdPlacement<*, *>,
event: TeadsAdPlacementEventName,
data: Map<String, Any>?
) {
// Listen the ad lifecycle events
}
override fun onDestroy() {
super.onDestroy()
teadsAdPlacementMedia?.clean()
}
}
import tv.teads.sdk.combinedsdk.adplacement.TeadsAdPlacementMedia;
import tv.teads.sdk.combinedsdk.adplacement.config.TeadsAdPlacementMediaConfig;
import tv.teads.sdk.combinedsdk.adplacement.interfaces.TeadsAdPlacementEventsDelegate;
import tv.teads.sdk.combinedsdk.adplacement.interfaces.core.TeadsAdPlacement;
import tv.teads.sdk.combinedsdk.TeadsAdPlacementEventName;
import android.net.Uri;
import android.widget.FrameLayout;
import java.util.Map;
public class ContentActivity extends AppCompatActivity implements TeadsAdPlacementEventsDelegate {
private TeadsAdPlacementMedia mediaPlacement;
private ActivityArticleBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityArticleBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
setupMediaPlacement();
}
private void setupMediaPlacement() {
// Create configuration — Kotlin's `enableValidationTool` default doesn't
// bridge to Java, it must be passed explicitly
TeadsAdPlacementMediaConfig config = new TeadsAdPlacementMediaConfig(
84242, // Your unique Placement ID
Uri.parse("https://yoursite.com/article"),
false // enableValidationTool
);
// Create placement with delegate
mediaPlacement = new TeadsAdPlacementMedia(
this, // Context
config, // Placement config
this // Event delegate
);
// Load the ad
FrameLayout mediaAdView = mediaPlacement.loadAd();
// Add to your view hierarchy
binding.myContainerAdView.addView(mediaAdView);
}
@Override
public void onPlacementEvent(TeadsAdPlacement<?, ?> placement, TeadsAdPlacementEventName event, Map<String, ?> data) {
// Listen the ad lifecycle events
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mediaPlacement != null) {
mediaPlacement.clean();
}
}
}
Best Practices
The SDK opens the click URL. Do not navigate in this handler or the browser will open twice. Use the event for tracking only.
When using Media Placement, the ad container must use dynamic sizing, not fixed dimensions.
Media creatives do not have a fixed size. The VPAID standard allows them to change dimensions and aspect ratio while they play. A fixed-height container crops the creative or leaves blank space, and viewability measurement is wrong after the first resize.
XML: android:layout_height="wrap_content"
Compose: Modifier.wrapContentHeight() or Modifier.height(IntrinsicSize.Min)
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
- ✅ Enable ad view resizing. Do not give the ad a fixed height. See the Dynamic height warning above.