如何在MainActivity.kt中配置google_mobile_ads与local_auth包
问题解决指南:集成google_mobile_ads与local_auth到Flutter的MainActivity.kt
问题说明
- 不使用
FlutterFragmentActivity时无编译错误,但无法启用指纹认证(local_auth依赖该Activity实现生物识别功能) - 使用
FlutterFragmentActivity时触发编译错误:e: C:\flutterprojelerim\auto_daily\android\app\src\main\kotlin\com\devonesoft\app\auto_daily\MainActivity.kt: (17, 71): Unresolved reference: context e: C:\flutterprojelerim\auto_daily\android\app\src\main\kotlin\com\devonesoft\app\auto_daily\MainActivity.kt: (20, 68): Unresolved reference: context
错误根源
FlutterFragmentActivity没有直接暴露context属性,且原代码缺少自定义NativeAdFactory的实现逻辑,这是google_mobile_ads注册原生广告工厂的必要前提。
修正后的完整MainActivity.kt代码
package com.devonesoft.app.auto_daily import android.view.LayoutInflater import android.view.View import android.widget.TextView import io.flutter.embedding.android.FlutterFragmentActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugins.googlemobileads.GoogleMobileAdsPlugin import com.google.android.gms.ads.nativead.NativeAd import com.google.android.gms.ads.nativead.NativeAdView // 自定义原生广告工厂实现 class MyNativeAdFactory(private val layoutInflater: LayoutInflater) : GoogleMobileAdsPlugin.NativeAdFactory { override fun createNativeAd(nativeAd: NativeAd, customOptions: MutableMap<String, Any>?): NativeAdView { val adView = layoutInflater.inflate(R.layout.my_native_ad, null) as NativeAdView // 绑定广告数据到视图(根据你的布局调整ID和元素) adView.headlineView = adView.findViewById(R.id.ad_headline) (adView.headlineView as TextView).text = nativeAd.headline adView.bodyView = adView.findViewById(R.id.ad_body) nativeAd.body?.let { (adView.bodyView as TextView).text = it adView.bodyView.visibility = View.VISIBLE } ?: run { adView.bodyView.visibility = View.INVISIBLE } adView.setNativeAd(nativeAd) return adView } } // ListTile样式原生广告工厂实现 class ListTileNativeAdFactory(private val layoutInflater: LayoutInflater) : GoogleMobileAdsPlugin.NativeAdFactory { override fun createNativeAd(nativeAd: NativeAd, customOptions: MutableMap<String, Any>?): NativeAdView { val adView = layoutInflater.inflate(R.layout.list_tile_native_ad, null) as NativeAdView // 绑定ListTile样式广告数据(根据你的布局调整) adView.headlineView = adView.findViewById(R.id.list_tile_headline) (adView.headlineView as TextView).text = nativeAd.headline adView.iconView = adView.findViewById(R.id.list_tile_icon) nativeAd.icon?.let { adView.iconView.visibility = View.VISIBLE // 此处需添加图标加载逻辑,比如用Glide加载it.drawable } ?: run { adView.iconView.visibility = View.GONE } adView.setNativeAd(nativeAd) return adView } } class MainActivity : FlutterFragmentActivity() { override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) // 用LayoutInflater.from(this)替代context(Activity本身就是Context子类) val myAdFactory = MyNativeAdFactory(LayoutInflater.from(this)) val listTileAdFactory = ListTileNativeAdFactory(LayoutInflater.from(this)) GoogleMobileAdsPlugin.registerNativeAdFactory(flutterEngine, "MyNativeAdFactory", myAdFactory) GoogleMobileAdsPlugin.registerNativeAdFactory(flutterEngine, "listTile", listTileAdFactory) } override fun cleanUpFlutterEngine(flutterEngine: FlutterEngine) { super.cleanUpFlutterEngine(flutterEngine) GoogleMobileAdsPlugin.unregisterNativeAdFactory(flutterEngine, "MyNativeAdFactory") GoogleMobileAdsPlugin.unregisterNativeAdFactory(flutterEngine, "listTile") } }
后续配置步骤
添加原生广告布局文件
在android/app/src/main/res/layout目录下创建两个布局文件:my_native_ad.xml:对应MyNativeAdFactory的广告UIlist_tile_native_ad.xml:对应ListTileNativeAdFactory的广告UI
布局中需包含代码里用到的视图ID(如ad_headline、list_tile_headline等)。
local_auth权限配置
在AndroidManifest.xml中添加生物识别权限:<uses-permission android:name="android.permission.USE_BIOMETRIC" /> <uses-permission android:name="android.permission.USE_FINGERPRINT" />同步依赖并编译
执行flutter pub get拉取最新依赖,然后重新编译项目。
核心修正点
- 用
LayoutInflater.from(this)替代原代码中的context,解决上下文引用错误 - 补充
NativeAdFactory的具体实现,满足google_mobile_ads原生广告注册要求
内容的提问来源于stack exchange,提问作者Yasincan Olcay
相关产品推荐
相关产品推荐

