I'm trying to update this code (base in this code) to use the native ads with the new lib FirebaseAdmob2 and new Mobile SDK (20).
The problem is in this part of the code below, that check if the ad has a video and, if don't, show an image.
Native ads with video has a better revenue than an ad with only image.
I get this error (and I don't know what has changed in the new sdk to this method "getVideoController"):
Links used to update the code:
developers.google.com
developers.google.com
Thanks in advance for any help.
The problem is in this part of the code below, that check if the ad has a video and, if don't, show an image.
Native ads with video has a better revenue than an ad with only image.
B4X:
'check if ad has a video
Dim vid As JavaObject = NativeAd.RunMethod("getVideoController", Null)
If vid.IsInitialized Then
Dim MediaView As JavaObject
MediaView.InitializeNewInstance("com/google/android/gms/ads/formats/MediaView".Replace("/", "."), Array(ctxt))
content.AddView(MediaView, 10dip, 120dip, 200dip, 200dip)
NativeAdView.RunMethod("setMediaView", Array(MediaView))
Else
'If don't has video, check if is there are images
Dim images As List = NativeAd.RunMethod("getImages", Null)
If images.IsInitialized And images.Size > 0 Then
Dim MediaView As JavaObject
MediaView.InitializeNewInstance("com/google/android/gms/ads/formats/MediaView".Replace("/", "."), Array(ctxt))
content.AddView(MediaView, 10dip, 120dip, 200dip, 200dip)
NativeAdView.RunMethod("setImageView", Array(MediaView))
End If
End If
B4X:
main$ResumableSub_LoadNativeAdresume (java line: 548)
java.lang.RuntimeException: Method: getVideoController not found in: com.google.android.gms.internal.ads.zzatp
at anywheresoftware.b4j.object.JavaObject$MethodCache.getMethod(JavaObject.java:363)
at anywheresoftware.b4j.object.JavaObject.RunMethod(JavaObject.java:120)
at br.com.as2.testes.main$ResumableSub_LoadNativeAd.resume(main.java:548)
B4X:
Sub LoadNativeAd
Dim AdUnitId As String = "ca-app-pub-3940256099942544/2247696110" 'Native Advanced TEST
' Dim AdUnitId As String = "ca-app-pub-3940256099942544/1044960115" 'Native Advanced with Video TEST
Dim ctxt As JavaObject
ctxt.InitializeContext
Dim builder As JavaObject
builder.InitializeNewInstance("com.google.android.gms.ads.AdLoader.Builder", Array(ctxt, AdUnitId))
Dim onUnifiedAdLoadedListener As Object = builder.CreateEventFromUI("com/google/android/gms/ads/nativead/NativeAd.OnNativeAdLoadedListener".Replace("/", "."), _
"UnifiedAdLoaded", Null)
builder.RunMethod("forNativeAd", Array(onUnifiedAdLoadedListener))
Dim Listener As JavaObject
Listener.InitializeNewInstance(Application.PackageName & ".main$MyAdListener", Array("NativeAd")) 'change 'main' with the current activity module name
builder.RunMethod("withAdListener", Array(Listener))
' Sends a request To AdMob, requesting an ad.
Dim AdLoader As JavaObject = builder.RunMethod("build", Null)
Dim AdRequestBuilder As JavaObject
AdRequestBuilder.InitializeNewInstance("com/google/android/gms/ads/AdRequest.Builder".Replace("/", "."), Null)
AdLoader.RunMethod("loadAd", Array(AdRequestBuilder.RunMethod("build", Null)))
Wait For (builder) UnifiedAdLoaded_Event (MethodName As String, Args() As Object)
Dim NativeAd As JavaObject = Args(0)
LogColor("LoadNativeAd", Colors.Green)
Log("getHeadline: " & NativeAd.RunMethod("getHeadline", Null))
Log("getBody: " & NativeAd.RunMethod("getBody", Null))
Log("getAdvertiser: " & NativeAd.RunMethod("getAdvertiser", Null))
Log("getCallToAction: " & NativeAd.RunMethod("getCallToAction", Null))
Log("getPrice: " & NativeAd.RunMethod("getPrice", Null))
Log("getStarRating: " & NativeAd.RunMethod("getStarRating", Null))
Log("getStore: " & NativeAd.RunMethod("getStore", Null))
Log("getExtras: " & NativeAd.RunMethod("getExtras", Null))
Dim NativeAdView As JavaObject
NativeAdView.InitializeNewInstance("com/google/android/gms/ads/nativead/NativeAdView".Replace("/", "."), _
Array(ctxt))
Dim pNativeAdView As Panel = NativeAdView
Dim content As Panel
content.Initialize("")
pNativeAdView.AddView(content, 0, 0, 100%x, 300dip)
Dim lbl As Label
lbl.Initialize("")
lbl.TextSize = 20
lbl.TextColor = Colors.Black
lbl.Text = NativeAd.RunMethod("getHeadline", Null)
content.AddView(lbl, 10dip, 10dip, 300dip, 50dip)
NativeAdView.RunMethod("setHeadlineView", Array(lbl))
Dim lbl2 As Label
lbl2.Initialize("")
lbl2.TextColor = Colors.Black
lbl2.Text = NativeAd.RunMethod("getBody", Null)
content.AddView(lbl2, 10dip, 60dip, 300dip, 50dip)
NativeAdView.RunMethod("setBodyView", Array(lbl2))
Dim logo As JavaObject = NativeAd.RunMethod("getIcon", Null)
If logo.IsInitialized Then
Dim logoView As Panel
logoView.Initialize("")
logoView.Background = logo.RunMethod("getDrawable", Null)
content.AddView(logoView, 250dip, 10dip, 80dip, 80dip)
NativeAdView.RunMethod("setIconView", Array(logoView))
End If
'check if ad has a video
Dim vid As JavaObject = NativeAd.RunMethod("getVideoController", Null)
If vid.IsInitialized Then
Dim MediaView As JavaObject
MediaView.InitializeNewInstance("com/google/android/gms/ads/formats/MediaView".Replace("/", "."), Array(ctxt))
content.AddView(MediaView, 10dip, 120dip, 200dip, 200dip)
NativeAdView.RunMethod("setMediaView", Array(MediaView))
Else
'If don't has video, check if is there are images
Dim images As List = NativeAd.RunMethod("getImages", Null)
If images.IsInitialized And images.Size > 0 Then
Dim MediaView As JavaObject
MediaView.InitializeNewInstance("com/google/android/gms/ads/formats/MediaView".Replace("/", "."), Array(ctxt))
content.AddView(MediaView, 10dip, 120dip, 200dip, 200dip)
NativeAdView.RunMethod("setImageView", Array(MediaView))
End If
End If
'*** new button to action
Dim btAction As Button
btAction.Initialize("")
Dim cd As ColorDrawable
cd.Initialize(Colors.RGB(65,105,225),3dip)
btAction.Background = cd
btAction.Text = NativeAd.RunMethod("getCallToAction", Null)
content.AddView(btAction, 10dip, 120dip, 100dip, 50dip)
NativeAdView.RunMethod("setCallToActionView", Array(btAction))
NativeAdView.RunMethod("setNativeAd", Array(NativeAd))
Activity.AddView(pNativeAdView, 0, 0, 100%x, 200dip)
End Sub
#if Java
public static class MyAdListener extends com.google.android.gms.ads.AdListener {
String eventName;
public MyAdListener(String s) {
eventName = s.toLowerCase(BA.cul);
}
public void onAdClosed() {
processBA.raiseEventFromDifferentThread(null, null, 0, eventName + "_adclosed", false, null);
}
public void onAdFailedToLoad(int arg0) {
processBA.raiseEventFromDifferentThread(null, null, 0, eventName + "_failedtoreceivead", false, new Object[] {String.valueOf(arg0)});
}
public void onAdLeftApplication() {
processBA.raiseEventFromDifferentThread(null, null, 0, eventName + "_adleftapplication", false, null);
}
public void onAdLoaded() {
processBA.raiseEventFromDifferentThread(null, null, 0, eventName + "_receivead", false, null);
}
public void onAdClicked() {
processBA.raiseEventFromDifferentThread(null, null, 0, eventName + "_clicked", false, null);
}
}
#End If

Native advanced | Android | Google for Developers


NativeAdView | Google Play services | Google Developers

Last edited: