web-dev-qa-db-ja.com

Android構成ファイル

アプリケーションの構成ファイルを設定する最良の方法と方法は何ですか?

私はアプリケーションがSDカード上のテキストファイルを調べて、それが必要とする特定の情報を抽出できるようにしたいですか?

39
Beginner
8
Reno

アプリケーションを公開する予定で、APIキーやパスワードなどの構成に機密データがある場合は、代わりに secure-preferences を使用することをお勧めします SharedPreferences 最終的にSharedPreferencesはXMLにクリアテキストで保存され、ルート化された電話では、アプリケーションが別の共有設定に非常に簡単にアクセスできるためです。

デフォルトでは防弾セキュリティではありません(実際には設定の難読化に似ています)が、Androidアプリをより安全にするための迅速な勝利です。たとえば、ルート化されたユーザーを停止しますアプリの共有設定を簡単に変更するデバイス( link

他の方法をいくつかお勧めします。

方法1:* .propertiesファイルを Propertiesで使用する

長所:

  1. どんなものからでも簡単に編集できますIDE使用している
  2. より安全:アプリでコンパイルされるため
  3. Build variant/Flavors を使用すると簡単に上書きできます
  4. Configに書き込むこともできます

短所:

  1. コンテキストが必要です
  2. 構成に書き込むこともできます(はい、それは詐欺になる可能性もあります)
  3. (他に何か?)

まず、構成ファイルを作成します:res/raw/config.propertiesおよびいくつかの値を追加します。

api_url=http://url.to.api/v1/
api_key=123456

その後、次のような方法で値に簡単にアクセスできます。

package some.package.name.app;

import Android.content.Context;
import Android.content.res.Resources;
import Android.util.Log;

import Java.io.IOException;
import Java.io.InputStream;
import Java.util.Properties;

public final class Helper {
    private static final String TAG = "Helper";

    public static String getConfigValue(Context context, String name) {
        Resources resources = context.getResources();

        try {
            InputStream rawResource = resources.openRawResource(R.raw.config);
            Properties properties = new Properties();
            properties.load(rawResource);
            return properties.getProperty(name);
        } catch (Resources.NotFoundException e) {
            Log.e(TAG, "Unable to find the config file: " + e.getMessage());
        } catch (IOException e) {
            Log.e(TAG, "Failed to open config file.");
        }

        return null;
    }
}

使用法:

String apiUrl = Helper.getConfigValue(this, "api_url");
String apiKey = Helper.getConfigValue(this, "api_key");

もちろん、これは設定ファイルを一度読み込んですべての値を取得するように最適化できます。

方法2:AndroidManifest.xmlを使用する meta-data element:

個人的には、この方法はあまり柔軟性がないように思われるので、使用したことはありません。

あなたのAndroidManifest.xml次のようなものを追加します。

...
<application ...>
    ...

    <meta-data Android:name="api_url" Android:value="http://url.to.api/v1/"/>
    <meta-data Android:name="api_key" Android:value="123456"/>
</application>

値を取得する関数:

public static String getMetaData(Context context, String name) {
    try {
        ApplicationInfo ai = context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
        Bundle bundle = ai.metaData;
        return bundle.getString(name);
    } catch (PackageManager.NameNotFoundException e) {
        Log.e(TAG, "Unable to load meta-data: " + e.getMessage());
    }
    return null;
}

使用法:

String apiUrl = Helper.getMetaData(this, "api_url");
String apiKey = Helper.getMetaData(this, "api_key");

方法3: FlavorbuildConfigFieldを使用する

これは公式のAndroid documentation/trainingにありませんでしたが、 このブログ記事 は非常に便利です。

基本的にプロジェクトフレーバー(たとえばprod)を設定してから、アプリのbuild.gradle次のようなものがあります。

productFlavors {
    prod {
        buildConfigField 'String', 'API_URL', '"http://url.to.api/v1/"'
        buildConfigField 'String', 'API_KEY', '"123456"'
    }
}

使用法:

String apiUrl = BuildConfig.API_URL;
String apiKey = BuildConfig.API_KEY;
79
grim

アプリケーションの設定を保存する場合は、Androidが SharedPreferences を提供します。
公式トレーニングリソースへのリンクです。

8
Mudassir

私は最近、このような要件を満たしました。ここで、それをどのように行ったかに注意してください。

sDカード上のテキストファイルを調べて、必要な特定の情報を取り出すことができるようにするアプリケーション

要件:

  1. 構成値(score_threshold)は、SDカードで利用可能でなければなりません。そのため、誰かがapkをリリースした後に値を変更できます。
  2. 構成ファイルは、Androidハードウェアの「/sdcard/config.txt」にある必要があります。

Config.txtファイルの内容は、

score_threshold=60

テキストファイルを読み書きするためのユーティリティクラスConfig.Javaを作成します。

import Android.util.Log;
import Java.io.FileInputStream;
import Java.io.FileOutputStream;
import Java.io.IOException;
import Java.io.InputStream;
import Java.io.OutputStream;
import Java.util.Properties;

public final class Config {

    private static final String TAG = Config.class.getSimpleName();
    private static final String FILE_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/config.txt";
    private static Config sInstance = null;

    /**
     * Gets instance.
     *
     * @return the instance
     */
    public static Config getInstance() {
        if (sInstance == null) {
            synchronized (Config.class) {
                if (sInstance == null) {
                    sInstance = new Config();
                }
            }
        }
        return sInstance;
    }

    /**
     * Write configurations values boolean.
     *
     * @return the boolean
     */
    public boolean writeConfigurationsValues() {

        try (OutputStream output = new FileOutputStream(FILE_PATH)) {

            Properties prop = new Properties();

            // set the properties value
            prop.setProperty("score_threshold", "60");

            // save properties
            prop.store(output, null);

            Log.i(TAG, "Configuration stored  properties: " + prop);
            return true;
        } catch (IOException io) {
            io.printStackTrace();
            return false;
        }
    }

    /**
     * Get configuration value string.
     *
     * @param key the key
     * @return the string
     */
    public String getConfigurationValue(String key){
        String value = "";
        try (InputStream input = new FileInputStream(FILE_PATH)) {

            Properties prop = new Properties();

            // load a properties file
            prop.load(input);
            value = prop.getProperty(key);
            Log.i(TAG, "Configuration stored  properties value: " + value);
         } catch (IOException ex) {
            ex.printStackTrace();
        }
        return value;
    }
}

別のユーティリティクラスを作成して、アプリケーションの初回実行時に構成ファイルを書き込みます。注:SDカードの読み取り/書き込み権限をアプリケーションに設定する必要があります。

public class ApplicationUtils {

  /**
  * Sets the boolean preference value
  *
  * @param context the current context
  * @param key     the preference key
  * @param value   the value to be set
  */
 public static void setBooleanPreferenceValue(Context context, String key, boolean value) {
     SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
     sp.edit().putBoolean(key, value).commit();
 }

 /**
  * Get the boolean preference value from the SharedPreference
  *
  * @param context the current context
  * @param key     the preference key
  * @return the the preference value
  */
 public static boolean getBooleanPreferenceValue(Context context, String key) {
     SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
     return sp.getBoolean(key, false);
 }

}

メインアクティビティで、onCreate()

if(!ApplicationUtils.getBooleanPreferenceValue(this,"isFirstTimeExecution")){
           Log.d(TAG, "First time Execution");
           ApplicationUtils.setBooleanPreferenceValue(this,"isFirstTimeExecution",true);
           Config.getInstance().writeConfigurationsValues();
}
// get the configuration value from the sdcard.
String thresholdScore = Config.getInstance().getConfigurationValue("score_threshold");
Log.d(TAG, "thresholdScore from config file is : "+thresholdScore );
1
Hardian