在 com.android.build.gradle.AppExtension_Decorated 上找不到 属性 'xxxx'

Could not find property 'xxxx' on com.android.build.gradle.AppExtension_Decorated

我将这些行添加到我的 gradle 文件后出现此错误:

buildTypes.each {
        it.buildConfigField 'String', 'OPEN_WEATHER_MAP_API_KEY', MyOpenWeatherMapApiKey
    }

然后日志显示:

Could not find property 'MyOpenWeatherMapApiKey' on com.android.build.gradle.AppExtension_Decorated@c3b784

我在google上搜索的解决方案无法解决我的问题。请告诉我哪里错了?

由于您使用的是 String,因此您必须使用以下语法:

buildConfigField "String" , "OPEN_WEATHER_MAP_API_KEY" ,  "\"XXXXX-XXXXX-XXX\""

最后一个参数必须是字符串

否则你可以使用这样的东西:

resValue "string", "OPEN_WEATHER_MAP_API_KEY", "\"XXXXX-XXXXX-XXX\""

第一种情况在您的 BuildConfig 文件中生成一个常量。
第二种情况生成一个字符串资源值,可以使用 @string/OPEN_WEATHER_MAP_API_KEY 注释访问。

'OPEN_WEATHER_MAP_API_KEY' 引用了需要配置的名为 'MyOpenWeatherMapApiKey' 的 gradle 属性。

一个原因是构建系统为此生成代码。另一个可能是您不会不小心将 API-KEY 提交给 GitHub 或其他 public 存储库。

您应该做的是像这样在 'gradle.properties' 文件中添加一个条目:

MyOpenWeatherMapApiKey="[你的-API-KEY]"

然后将您的项目与 gradle 同步(如果使用 Android Studio)

您应该在 本地用户 设置中定义 MyOpenWeatherMapApiKey,因此,转到您的家 gradle 设置:~/.gradle/gradle.properties(Win: %USERPROFILE%\.gradle\gradle.properties)。如果 gradle.properties 不存在 - 只需创建它。

在文件中添加以下行:

MyOpenWeatherMapApiKey="XXXXXXXXXXXXXXXXXXXXXXXXXXXX"

(不幸的是,Android Udacity 老师不太好从 gradle 的角度解释它是如何工作的;就像我不容易从 gradle 找到任何文档一样it.buildConfigField 是如何工作的)

参见“打开天气图 API 需要密钥。”在 https://github.com/udacity/Sunshine-Version-2

的底部

我不得不使用此处多个答案中的一些信息来解决此问题。

  1. it.buildConfigField 'String', 'OPEN_WEATHER_MAP_API_KEY', MyOpenWeatherMapApiKey 没问题。投票最高的答案将密钥直接放入此字段,而不是为您的用户引用 "global" 密钥。
  2. 您需要通过创建一个帐户来获取一个开放天气图API密钥here
  3. Gradle 希望您将通过创建 Open Weather Map 帐户获得的密钥放入名为 MyOpenWeatherMapApiKey 的字段中,该字段由之前的 OPEN_WEATHER_MAP_API_KEY 引用。为此,请在 Android Studio 中打开 gradle.properties 并添加 MyOpenWeatherMapApiKey="<Your Key Here>"

现在您应该可以毫无问题地构建应用程序了。

  1. http://openweathermap.org/appid#use 或其他天气 api 提供商处注册帐户以获得您的唯一 API 密钥
  2. 去你家gradle设置:~/.gradle/gradle.properties

添加这一行:

MyOpenWeatherMapApiKey="yourUniqueApiKey"
  1. 重建它

接受的答案是绝对正确的。另一种方法,可能更简单,将内部的值格式化为 String 是这样的:

it.buildConfigField 'String', 'OPEN_WEATHER_MAP_API_KEY', '"xxxxxxxxxxxxxxxxxx"'