Media3Player-Android(V1.3.0) MediaMelon SDK with Google IMA
This procedure describes the MediaMelon SDK(with Google IMA) Integration with a Media3 Android . This is a sample integration done with the sample application from the Google IMA.
The below steps describe the procedure to integrate the MediaMelon SDK into the application.
Note - Only the code written inside the <MediaMelon Integration> tag is to be added for MediaMelon-specific integration, the rest of the code above and below the <MediaMelon Integration> tag is shown just to give a context, as shown below:-
privatevoidinitPlayer() { // this is the function that creates/initialises the EXO playerrelease(); simpleExoPlayer =new SimpleExoPlayer.Builder(context).build();playerView.setPlayer(simpleExoPlayer);..//<MediaMelon Integration>ContentMetadata cm =newContentMetadata();cm.videoId="VIDEO_ID";cm.seriesTitle="TITLE";cm.season="SEASON";cm.genre="GENRE";cm.episodeNumber="EPISODE_NUMBER";cm.drmProtection="DRM_PROTECTION";cm.contentType="CONTENT_TYPE";cm.assetName="ASSET_NAME";cm.assetId="ASSET_ID";cm.videoType="VIDEO_TYPE";JSONObject ContentMetadataAsJSON =cm.getJSONObject();boolean isLive =false; //Set this to true for a live stream or to false for a VoD stream MMSmartStreamingExo2.getInstance().initializeSession(simpleExoPlayer, MMQBRMode.QBRModeDisabled, streamUrl, ContentMetadataAsJSON, isLive); //isLive is an optional field here
MMSmartStreamingExo2.getInstance().reportCustomMetadata("key","value"); //(optional) add custom tagsMMSmartStreamingExo2.getInstance().reportUserInitiatedPlayback();//<MediaMelon Integration>};
@OverrideprotectedvoidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);setContentView(R.layout.activity_my);..//<MediaMelon Integration>Log.d("SmartStreamingIntgr",MMSmartStreamingExo2.getVersion());MMSmartStreamingExo2.enableLogTrace(true); //set to "false" before releasing player to production if (MMSmartStreamingExo2.getRegistrationStatus() == false){ //Check if it is the first time Registration process is done
MMSmartStreamingExo2.registerMMSmartStreaming("PLAYER_NAME", "CUSTOMER_ID", "SUBSCRIBER_ID", "DOMAIN_NAME", "SUBSCRIBER_TYPE", "SUBSCRIBER_TAG");
MMSmartStreamingExo2.reportPlayerInfo("PLAYER_BRAND","PLAYER_MODEL","PLAYER_VERSION"); MMSmartStreamingExo2.getInstance().setContext(getApplicationContext()); //Please make sure to provide the application's context here, and not the activity's context
}//<MediaMelon Integration>.. }
Variable
Description
PLAYER_NAME
String containing the player version (e.g. “Bitmovin_Android_Player_2.28.0”).
CUSTOMER_ID
String containing your MediaMelon-assigned Customer ID.
SUBSCRIBER_ID
String containing your subscriber’s ID. If you do not use subscriber IDs, enter null
DOMAIN_NAME
String containing your section of your subscriber or assets. (Optional)
SUBSCRIBER_TYPE
String containing the subscriber type (e.g. “Free”, “Paid”). If you do not use subscriber types, enter null
SUBSCRIBER_TAG
String containing an additional subscriber-specific information. This is sent in clear (not hashed) to SmartSight and it is advised to not send sensitive information in this field.
ASSET_ID
String containing Asset Id.
ASSET_NAME
String containing Asset Name.
VIDEO_ID
String containing your video’s ID. If you do not use videos IDs, enter null.
PLAYER_BRAND
String containing the player brand (e.g. “bitmovin”).
PLAYER_MODEL
String containing the player model. For example - This could be a variant of player. Say name of third party player used by organisation. Or any human readable name of the player.
privatefinalImaSdkFactory sdkFactory;privateAdsLoader adsLoader;privateStreamDisplayContainer displayContainer;privateStreamManager streamManager;privatefinalList<VideoStreamPlayer.VideoStreamPlayerCallback> playerCallbacks;..//<MediaMelon Integration>MMAnalyticsBridge analyticsBridgeObject; // Declaration of Analytics Bridge object, wherever the IMA AdsLoader and IMA StreamManager are declared in your application
//<MediaMelon Integration>
private void createAdsLoader() { // this functions creates the Google IMA DAI ads loader (which is preferably a singleton - only one ads loader for the entire lifecyle)
ImaSdkSettings settings =sdkFactory.createImaSdkSettings();//<MediaMelon Integration> analyticsBridgeObject = MMSmartStreamingExo2.getInstance().getAnalyticsBridge(); // get the Analytics Bridge Object ,this should be done wherever in your application the Google IMA adsLoader is created
//<MediaMelon Integration>.. adsLoader =sdkFactory.createAdsLoader(context, settings, displayContainer);}
publicvoidrequestAndPlayAds() { ..//<MediaMelon Integration>adsLoader.addAdErrorListener(analyticsBridgeObject); // pass the Analytics Bridge object to the ads error listeners adsLoader.addAdsLoadedListener(analyticsBridgeObject); // pass the Analytics Bridge object to the ads loaded listeners
//<MediaMelon Integration>..adsLoader.addAdErrorListener(this);adsLoader.addAdsLoadedListener(this); adsLoader.requestStream(buildStreamRequest());..}
@OverridepublicvoidonAdsManagerLoaded(AdsManagerLoadedEvent event) {..//<MediaMelon Integration> streamManager.addAdErrorListener(analyticsBridgeObject); // pass the Analytics Bridge object to the ad error listeners
streamManager.addAdEventListener(analyticsBridgeObject); // pass the Analytics Bridge object to the ad event listeners
//<MediaMelon Integration>..streamManager.addAdErrorListener(this);streamManager.addAdEventListener(this);streamManager.init();.. }
Step 4: AD Event callbacks from the SDK.
A list of all Google IMA DAI AD events can be found here.
@Override
public void onAdEvent(AdEvent event) { // this is a callback which gets called whenever a AD event occurs
switch (event.getType()) {
// Access all ad events here , this method will be automatically called whenever an ad event occurs
case AD_PROGRESS:
// write your own logic inside each case
break;
case FIRST_QUARTILE:
// write your own logic inside each case
break;
case MIDPOINT:
// write your own logic inside each case
break;
case THIRD_QUARTILE:
// write your own logic inside each case
break;
case COMPLETED:
// write your own logic inside each case
break;
default:
log(String.format("Event: %s\n", event.getType()));
break;
}
}