我有一个不是活动的简单类,所以我无法访问上下文,但我想在我的项目中读取属性文件(而不是sd卡)。
MyClass {
public static void readProperties(){
Properties props=new Properties();
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("/mine.properties");
try {
props.load(inputStream);
} catch(Exception e){
e.printStackTrace();
}
}
}
当我运行代码时,我得到一个空指针异常:
02-20 15:32:38.396:E / AndroidRuntime(27473):java.lang.NullPointerException:in == null
02-20 15:32:38.396:E / AndroidRuntime(27473):at java.util.Properties.load(Properties.java:246)
我应该在哪里放置我的属性文件以便能够阅读它?我尝试src
,项目根,资产,以及MyClass.java旁边,每次都获得空指针。我做错了什么?
我正在将Eclipse与ADT结合使用(尚未在Android Studio上使用) 我的结构是这样的:
-src
- 主/ SomeActivity.java
- 主/ MyClass.java
- 主/ mine.properties
-assets
-gen
-res
答案 0 :(得分:2)
我使用gradle.properties
来存储API密钥等内容。 Gradle属性是简单的键值对:
tmdbApiKey=1a2b3c4d5e6f7g8h9i0j6f7g8h9i0j
属性文件位于我的Android项目的根目录中:
/Wutson
gradle.properties
... other files/directories
mobile/
build.gradle
在/Wutson/mobile/build.gradle
这是我的Android模块的构建文件中,我从我的属性文件中读取,并使用buildConfigField
方法在我的BuildConfig
类中生成静态最终字段可以在运行时从我的Android模块中的类访问。
apply plugin: 'com.android.application'
...
def tmdbApiKey = hasProperty('tmdbApiKey') ? tmdbApiKey : 'provide this in gradle.properties'
android {
...
defaultConfig {
...
buildConfigField "String", "TMDB_API_KEY", "\"$tmdbApiKey\""
}
...
}
我的Android模块中的某个类,例如MainActivity
,我可以访问此值:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("TEST", "my api key: " + BuildConfig.TMDB_API_KEY);
}
将打印:
TEST | my api key: 1a2b3c4d5e6f7g8h9i0j6f7g8h9i0j
除非您忘记将该属性放在文件中,否则您将获得:
TEST | my api key: provide this in gradle.properties
我可以在project repo on GitHub找到完整的示例(其中gradle.properties.example
是gradle.properties
的示例)。