I want to monetise my Flutter app using google_mobile_ads library with Native ads. I am facing some issues while facing this documentation – https://developers.google.com/admob/flutter/native I am not sure where to put the my_native_ad.xml file so that it can be referred by the Kotlin Main Activity File.
Also, in the MainActivity file, I am facing some errors :-
- e: /Users/yash/AndroidStudioProjects/VideoPlayer/android/app/src/main/kotlin/dev/jideguru/filex/MainActivity.kt: (26, 5): ‘cleanUpFlutterEngine’ overrides nothing
- e: /Users/yash/AndroidStudioProjects/VideoPlayer/android/app/src/main/kotlin/dev/jideguru/filex/MainActivity.kt: (46, 113): No value passed for parameter ‘layoutInflater’
- e: /Users/yash/AndroidStudioProjects/VideoPlayer/android/app/src/main/kotlin/dev/jideguru/filex/MainActivity.kt: (83, 54): Unresolved reference: my_native_ad e: /Users/yash/AndroidStudioProjects/VideoPlayer/android/app/src/main/kotlin/dev/jideguru/filex/NativeAdFactoryExample.kt: (14, 58): Unresolved reference: R
- e:/Users/yash/AndroidStudioProjects/VideoPlayer/android/app/src/main/kotlin/dev/jideguru/filex/NativeAdFactoryExample.kt: (14, 58): Unresolved reference: R
Here is my MainActivity.kotlin file
import android.os.Build import android.os.Environment import android.os.StatFs import android.util.Log import androidx.annotation.NonNull import androidx.annotation.RequiresApi import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugin.common.MethodChannel import io.flutter.plugins.GeneratedPluginRegistrant import androidx.core.content.ContextCompat.* import java.io.File import android.graphics.Color import android.view.LayoutInflater import android.view.View import android.widget.TextView import com.google.android.gms.ads.formats.UnifiedNativeAd import com.google.android.gms.ads.formats.UnifiedNativeAdView import io.flutter.plugins.googlemobileads.GoogleMobileAdsPlugin import io.flutter.plugins.googlemobileads.GoogleMobileAdsPlugin.NativeAdFactory class MainActivity: FlutterActivity() { override fun cleanUpFlutterEngine(flutterEngine: FlutterEngine?) { GoogleMobileAdsPlugin.unregisterNativeAdFactory(flutterEngine, "adFactoryExample") } override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { flutterEngine.getPlugins().add(GoogleMobileAdsPlugin()) super.configureFlutterEngine(flutterEngine) GoogleMobileAdsPlugin.registerNativeAdFactory(flutterEngine, "adFactoryExample", NativeAdFactoryExample()) } } internal class NativeAdFactoryExample(private val layoutInflater: LayoutInflater) : NativeAdFactory { override fun createNativeAd( nativeAd: UnifiedNativeAd, customOptions: Map<String, Any>?): UnifiedNativeAdView { val adView = layoutInflater.inflate(R.layout.my_native_ad, null) as UnifiedNativeAdView val headlineView = adView.findViewById<TextView>(R.id.ad_headline) val bodyView = adView.findViewById<TextView>(R.id.ad_body) headlineView.text = nativeAd.headline bodyView.text = nativeAd.body adView.setBackgroundColor(Color.YELLOW) adView.setNativeAd(nativeAd) adView.bodyView = bodyView adView.headlineView = headlineView return adView } }
Please let me know if any other details are required.
Advertisement
Answer
For those who are stuck on the same issue :-
list_tile_native_ad.xml :-
<?xml version="1.0" encoding="utf-8"?> <com.google.android.gms.ads.formats.UnifiedNativeAdView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/tv_list_tile_native_ad_attribution_small" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#F19938" android:text="Ad" android:textColor="#FFFFFF" android:textSize="12sp" /> <ImageView android:id="@+id/iv_list_tile_native_ad_icon" android:layout_width="48dp" android:layout_height="48dp" android:layout_gravity="center_vertical" android:layout_marginStart="16dp" android:layout_marginLeft="16dp" android:scaleType="fitXY" tools:background="#EDEDED" /> <TextView android:id="@+id/tv_list_tile_native_ad_attribution_large" android:layout_width="48dp" android:layout_height="48dp" android:layout_gravity="center_vertical" android:layout_marginStart="16dp" android:layout_marginLeft="16dp" android:background="#F19938" android:gravity="center" android:text="Ad" android:textColor="#FFFFFF" android:visibility="invisible" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginStart="80dp" android:layout_marginLeft="80dp" android:layout_marginEnd="16dp" android:layout_marginRight="16dp" android:orientation="vertical"> <TextView android:id="@+id/tv_list_tile_native_ad_headline" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ellipsize="end" android:lines="1" android:maxLines="1" android:textColor="#000000" android:textSize="16sp" tools:text="Headline" /> <TextView android:id="@+id/tv_list_tile_native_ad_body" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ellipsize="end" android:lines="1" android:maxLines="1" android:textColor="#828282" android:textSize="14sp" tools:text="body" /> </LinearLayout> </FrameLayout>
</com.google.android.gms.ads.formats.UnifiedNativeAdView>
MainActivity.kt :-
package com.customapp.videoplayer import android.os.Build import android.os.Environment import android.os.StatFs import android.util.Log import androidx.annotation.NonNull import androidx.annotation.RequiresApi import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugin.common.MethodChannel import io.flutter.plugins.GeneratedPluginRegistrant import androidx.core.content.ContextCompat.* import android.content.Context import java.io.File import android.graphics.Color import android.view.LayoutInflater import android.view.View import android.widget.TextView import android.widget.ImageView import com.google.android.gms.ads.formats.UnifiedNativeAd import com.google.android.gms.ads.formats.UnifiedNativeAdView import com.google.android.gms.ads.formats.NativeAd import io.flutter.plugins.googlemobileads.GoogleMobileAdsPlugin import io.flutter.plugins.googlemobileads.GoogleMobileAdsPlugin.NativeAdFactory class MainActivity: FlutterActivity() { @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR2) override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) val factory: NativeAdFactory = NativeAdFactoryExample(layoutInflater) GoogleMobileAdsPlugin.registerNativeAdFactory(flutterEngine, "adFactoryExample", factory) } } internal class NativeAdFactoryExample(private val layoutInflater: LayoutInflater) : NativeAdFactory { override fun createNativeAd( nativeAd: UnifiedNativeAd, customOptions: Map<String, Any>?): UnifiedNativeAdView { val adView = layoutInflater.inflate(R.layout.list_tile_native_ad, null) as UnifiedNativeAdView // val headlineView = adView.findViewById<TextView>(R.id.ad_headline) // val bodyView = adView.findViewById<TextView>(R.id.ad_body) // headlineView.text = nativeAd.headline // bodyView.text = nativeAd.body adView.setNativeAd(nativeAd) val attributionViewSmall: TextView = adView .findViewById(R.id.tv_list_tile_native_ad_attribution_small) val attributionViewLarge: TextView = adView .findViewById(R.id.tv_list_tile_native_ad_attribution_large) val iconView: ImageView = adView.findViewById(R.id.iv_list_tile_native_ad_icon) val icon: NativeAd.Image = nativeAd.getIcon() if (icon != null) { attributionViewSmall.setVisibility(View.VISIBLE) attributionViewLarge.setVisibility(View.INVISIBLE) iconView.setImageDrawable(icon.getDrawable()) } else { attributionViewSmall.setVisibility(View.INVISIBLE) attributionViewLarge.setVisibility(View.VISIBLE) } adView.setIconView(iconView) val headlineView: TextView = adView.findViewById(R.id.tv_list_tile_native_ad_headline) headlineView.setText(nativeAd.getHeadline()) adView.setHeadlineView(headlineView) val bodyView: TextView = adView.findViewById(R.id.tv_list_tile_native_ad_body) bodyView.setText(nativeAd.getBody()) bodyView.setVisibility(if (nativeAd.getBody() != null) View.VISIBLE else View.INVISIBLE) adView.setBodyView(bodyView) return adView } }
Keep your list_tile_native_ad.xml inside android/app/src/main/res/layout
NOTE :- I couldn’t add a dispose method because it kept throwing me an error.
Cheers!!