You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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")
    }
}

后续配置步骤

  1. 添加原生广告布局文件
    在android/app/src/main/res/layout目录下创建两个布局文件:

    • my_native_ad.xml:对应MyNativeAdFactory的广告UI
    • list_tile_native_ad.xml:对应ListTileNativeAdFactory的广告UI
      布局中需包含代码里用到的视图ID(如ad_headline、list_tile_headline等)。
  2. local_auth权限配置
    在AndroidManifest.xml中添加生物识别权限:

    <uses-permission android:name="android.permission.USE_BIOMETRIC" />
    <uses-permission android:name="android.permission.USE_FINGERPRINT" />
    
  3. 同步依赖并编译
    执行flutter pub get拉取最新依赖,然后重新编译项目。

核心修正点

  • 用LayoutInflater.from(this)替代原代码中的context,解决上下文引用错误
  • 补充NativeAdFactory的具体实现,满足google_mobile_ads原生广告注册要求

内容的提问来源于stack exchange,提问作者Yasincan Olcay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 23:03:04