Android读取Build.properties值遇文件未找到异常,求解决方案
你遇到的文件找不到问题,核心原因是Android运行时的文件系统和本地开发的项目路径完全不重合,直接用FileInputStream("Build.properties")找的是设备上的路径,不是你电脑里的项目文件。另外注意你提到Build.properties里的变量是OneSignal_ID,但代码里用的是ONESIGNAL_APP_ID,键名大小写必须完全匹配,先确认这个是否一致。
下面给两种可行的解决办法:
方案一:将Build.properties放到assets目录,用AssetManager读取
- 把
Build.properties文件复制到app/src/main/assets目录下(如果没有assets文件夹,右键app模块 → New → Folder → Assets Folder创建) - 修改读取代码:
private void getOneSignalId(){ try { Properties properties = new Properties(); // 通过AssetManager获取assets目录下的文件输入流 InputStream fl = getContext().getAssets().open("Build.properties"); properties.load(fl); // 键名要和Build.properties里的完全一致,比如你说的OneSignal_ID String oneSignalID = properties.getProperty("OneSignal_ID"); Log.d("PringLog: OneSignalId", oneSignalID != null ? oneSignalID : "未找到对应值"); } catch (IOException e) { Log.e("OneSignalManager", "读取配置文件失败", e); // 建议做容错处理,不要直接抛RuntimeException避免崩溃 } }
注意:如果是在非Activity/非Fragment类里,需要传入Context对象来获取AssetManager。
方案二:用Gradle将配置注入BuildConfig(推荐,更符合Android规范)
这种方式不需要手动读取文件,Gradle会帮你把属性值自动生成到BuildConfig类里,代码直接调用即可:
- 打开app模块的
build.gradle(app/build.gradle),在android块内添加以下配置:
android { // 其他已有配置... defaultConfig { // 其他已有配置... // 读取Build.properties文件 def props = new Properties() props.load(new FileInputStream(file("../clients/clientname/Build/Build.properties"))) // 将OneSignal_ID注入BuildConfig buildConfigField "String", "ONESIGNAL_APP_ID", "\"${props.getProperty('OneSignal_ID')}\"" } }
注意:这里的文件路径是相对于app模块的build.gradle的路径,需根据实际项目结构调整,确保能正确找到Build.properties。
- 同步Gradle(点击Android Studio右上角的Sync Now按钮)
- 代码里直接调用:
private void getOneSignalId(){ String oneSignalID = BuildConfig.ONESIGNAL_APP_ID; Log.d("PringLog: OneSignalId", oneSignalID); }
这种方式编译时就完成了属性注入,运行时不需要读取文件,更高效稳定。
内容的提问来源于stack exchange,提问作者Hemal Adani
相关产品推荐
相关产品推荐

