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

Android单应用双Activity能否使用不同Google Maps API密钥?

为不同Activity配置独立的Google Maps API密钥

可以为不同Activity使用不同的Google Maps API密钥,并且完全可以绕过Manifest的meta-data配置,通过代码动态初始化地图。以下是具体实现步骤:

1. 移除Manifest中的全局API密钥配置

首先删除AndroidManifest.xml中原来的<meta-data>配置,避免和代码中设置的密钥冲突:

<!-- 删除这一段 -->
<meta-data
    android:name="com.google.android.geo.API_KEY"
    android:value="@string/GOOGLE_MAP_KEY" />

2. 在每个Activity中动态初始化地图

根据你使用的地图组件类型(SupportMapFragment或MapView),选择对应的实现方式:

方式一:使用SupportMapFragment

在每个Activity的onCreate方法中,先通过MapsInitializer指定当前Activity要使用的API密钥,再初始化地图:

第一个Activity(使用密钥KEY1)

class FirstMapActivity : AppCompatActivity() {
    // 替换为你的第一个API密钥
    private val MAP_KEY = "YOUR_FIRST_API_KEY"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_first_map)

        // 初始化Maps服务,指定当前密钥
        MapsInitializer.initialize(applicationContext, MAP_KEY)

        // 获取并初始化地图
        val mapFragment = supportFragmentManager.findFragmentById(R.id.map_fragment_1) as SupportMapFragment
        mapFragment.getMapAsync { googleMap ->
            // 地图加载完成后的逻辑,比如设置相机位置、添加标记等
            googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(39.9042, 116.4074), 12f))
        }
    }
}

第二个Activity(使用密钥KEY2)

class SecondMapActivity : AppCompatActivity() {
    // 替换为你的第二个API密钥
    private val MAP_KEY = "YOUR_SECOND_API_KEY"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second_map)

        MapsInitializer.initialize(applicationContext, MAP_KEY)

        val mapFragment = supportFragmentManager.findFragmentById(R.id.map_fragment_2) as SupportMapFragment
        mapFragment.getMapAsync { googleMap ->
            // 第二个地图的自定义逻辑
        }
    }
}

方式二:使用MapView

如果你的布局中直接使用MapView,可以通过GoogleMapOptions在创建MapView时指定密钥:

class MapViewActivity : AppCompatActivity() {
    private val MAP_KEY = "YOUR_API_KEY"
    private lateinit var mapView: MapView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // 创建带指定密钥的MapView
        val mapOptions = GoogleMapOptions().apiKey(MAP_KEY)
        mapView = MapView(this, mapOptions)
        setContentView(mapView)

        // 初始化MapView
        mapView.onCreate(savedInstanceState)
        mapView.getMapAsync { googleMap ->
            // 地图操作逻辑
        }
    }

    // 必须处理MapView的生命周期方法
    override fun onStart() {
        super.onStart()
        mapView.onStart()
    }

    override fun onResume() {
        super.onResume()
        mapView.onResume()
    }

    override fun onPause() {
        super.onPause()
        mapView.onPause()
    }

    override fun onStop() {
        super.onStop()
        mapView.onStop()
    }

    override fun onDestroy() {
        super.onDestroy()
        mapView.onDestroy()
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        mapView.onSaveInstanceState(outState)
    }

    override fun onLowMemory() {
        super.onLowMemory()
        mapView.onLowMemory()
    }
}

注意事项

  • 确保每个API密钥都在Google Cloud控制台正确配置了对应Activity所在应用的包名和SHA-1指纹,否则地图会加载失败并显示错误。
  • 不要在Manifest中保留任何com.google.android.geo.API_KEY的meta-data,否则系统会优先使用Manifest中的密钥,覆盖代码设置的内容。
  • 该方法适用于com.google.android.gms:play-services-maps 18.0.0及以上版本,低版本可能存在兼容性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 00:27:07