3

私の(Android以外のテスト)テストでは、src / main / resourcesにあるcommon.propertiesというリソースをAndroidプロジェクトに配置して、そこからMavenプロジェクトのバージョンを読み取りました。

@Test
public void testReadVersion() throws IOException {      
    Properties props = new Properties();
    props.load(FileUtils.openInputStream(FileUtils.toFile(this.getClass().getResource("/common.properties"))));

    String version = props.getProperty("version");

    assertNotNull(version);
    assertTrue(!"".equals(version));
}

これは機能します。しかし、本番コードで同じリソースにアクセスしようとすると、リソースにアクセスするときに常にNullPointerExceptionsが発生します。

    Properties props = new Properties();
    final StringBuilder versionBuilder = new StringBuilder();

    try {
        props.load(FileUtils.openInputStream(FileUtils.toFile(this.getClass().getResource("/common.properties"))));

        versionBuilder.append(props.getProperty("version"));
    } 
    catch (IOException e) {
        // will be ignored.
    }

デバッグしました。リソースが見つからないため、nullです。これをどのように解決すればよいですか?ファイルをres/rawに置いて読むと

props.load(getResources().openRawResource(R.raw.common));

ファイルアクセスは機能しますが、ファイルの内容から値を変換できません:version =${project.version}結果は、バージョン1.0などではなく、値文字列自体${project.version}になります。私のオプションは何ですか?

[更新]
以下で受け入れられた解決策は、私の最新のプロジェクトでは機能しなくなりました。値の代わりに常に${project.version}を取得します。なぜそうなのかわからない。AssetManagerを使用したソリューションでさえ私には機能しません。あまり不便ではない良い回避策を見つけました。android:versionName(AndroidManifest)の情報を取得して表示します。

String versionName = this.getPackageManager().getPackageInfo(this.getPackageName(), 0).versionName;

TextView version = (TextView)findViewById(R.id.version);
version.setText(" " + versionName);
4

2 に答える 2

0

まず、もっと簡単なアプローチを使用することをお勧めします。

InputStream resourceAsStream = this.getClass().getResourceAsStream("/common.properties");
Properties prop = new Properties();
prop.load(resourceAsStream);

これは、テストまたは本番コードで実行している場合に機能します。さらに、リソース内で置き換えられたpomから値を取得するには、フィルタリングを設定する必要があります。

<project>
  ...
  <build>
    ...
    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
      </resource>
      ...
    </resources>
    ...
  </build>
  ...
</project>
于 2012-12-24T13:53:00.637 に答える
0

@khmarbaiseソリューションは私には機能しないので、リソースフィルタリング(Dmitriy Tarasovの例)とAssetManager(ここで説明)を使用したアセットの読み込みを組み合わせました。

于 2013-04-06T18:38:57.053 に答える