代码之家  ›  专栏  ›  技术社区  ›  Kheldar haccks

如何使用gradle替换Google Maps API密钥?

  •  5
  • Kheldar haccks  · 技术社区  · 6 年前

    我使用许多选项中的一个将API密钥存储在 计算机/钥匙链 而不是直接在云端备份的项目代码中(即 gradle-credentials-plugin )。我希望能够以类似的方式管理Google Maps密钥,但它们在不同的文件中使用( Manage Google Maps API Key with Gradle in Android Studio )。

    如果有人给我一个简单(或复杂但可靠)的选择,我将不胜感激!

    4 回复  |  直到 6 年前
        1
  •  6
  •   hb0    4 年前

    您可以使用 manifestPlaceholders build.gradle

    1. 将API密钥插入到文件中,如 local.properties
    google.maps_api_key=SECRET_KEY
    
    1. 确保使用忽略此文件 .gitignore :
    local.properties
    
    1. 使API密钥可用于 AndroidManifest.xml . 使用 withInputStream() 确保 InputStream is closed automatically
    android{
      defaultConfig {
    
        // Load credentials.
        def properties = new Properties()
        file("../local.properties").withInputStream { properties.load(it) }
    
        // Share the key with your `AndroidManifest.xml`
        manifestPlaceholders = [ googleMapsApiKey:"${properties.getProperty('google.maps_api_key')}"]
    
    1. 将API密钥加载到 AndroidManifest。xml :
    <application>
    
            <meta-data
                android:name="com.google.android.geo.API_KEY"
                android:value="${googleMapsApiKey}" />
    
        2
  •  3
  •   shadowsheep    6 年前

    您可以使用 未版本控制 文件按您的需要调用 api.keys 使用此内容:

    debugMapsApiKey=xxxxXXXxxxx
    releaseMapsApiKey=xxxYYYxxx
    

    将其放在根项目文件夹中。

    您在 build.gradle 以如下方式归档:

    def apiKeysFile = rootProject.file("api.keys")
    def apiKeysFile = new Properties()
    apiKeysFile.load(new FileInputStream(apiKeysFile))
    
    [...]
    
    debug {
        buildConfigField "String", MAPS_KEY, apiKeysFile['debugMapsApiKey']
    }
    
    release {
        buildConfigField "String", MAPS_KEY, apiKeysFile['releaaseMapsApiKey']
    }
    

    您可以通过

    BuildConfig.MAPS_KEY 如果您在调试中构建,您将 "xxxxXXxxxx" 值,而在版本中您将拥有 "xxxxYYxxxx"

    如果您想访问XML,可以使用 resValue 创建字符串资源。

    debug {
        resValue "string", MAPS_KEY, apiKeysFile['debugMapsApiKey']
    }
    
    release {
       resValue "string", MAPS_KEY, apiKeysFile['releaseMapsApiKey']
    }
    

    通过这种方式,您还可以使用

    getString(R.string.MAPS_KEY)
    
        3
  •  0
  •   Kheldar haccks    6 年前

    Shadowsheep的解决方案很有效,但这并不是我真正想要做的。

    我最终做了什么。

    • 首先,我有一个错误的印象,那就是人口是绝对必要的 谷歌地图api。xml 当在清单中设置密钥显然足够时,使用密钥。

    • 其次,我添加了 <meta-data android:name="com.google.android.geo.API_KEY" android:value"@string/GoogleMapsApiKey"> 清单中的行

    • 第三,我通过我选择的工具(etiennestuder的gradle凭据插件)设置了mapsKey

    • 最后,我将其添加到应用程序的模块中 建筑格拉德尔 buildTypes 将这两条线剖切:

    def mapsKey=凭据。GOOGLE\u MAPS\u API\u密钥?:“缺少密钥”

    它resValue“字符串”,“GoogleMapsApiKey”,mapsKey

        4
  •  0
  •   Josef Vancura    3 年前

    google\u maps\u api。xml

    <resources>
        <string name="google_maps_key" templateMergeStrategy="preserve" translatable="false">GoogleMapsApiKey</string>
    </resources>
    

    显示

    <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="@string/GoogleMapsApiKey"/>
    

    格拉德尔

    resValue "string", "GoogleMapsApiKey", mapskey
    

    格拉德尔。属性

    mapskey="AIza...8w" // key here