アプリケーションの構成ファイルを設定する最良の方法と方法は何ですか?
私はアプリケーションがSDカード上のテキストファイルを調べて、それが必要とする特定の情報を抽出できるようにしたいですか?
共有設定 を使用してこれを達成できます。
Google Androidページ https://developer.Android.com/guide/topics/data/data-storage。で共有設定を使用する方法に関する非常に詳細なガイドがあります。 html#pref
アプリケーションを公開する予定で、APIキーやパスワードなどの構成に機密データがある場合は、代わりに secure-preferences を使用することをお勧めします SharedPreferences 最終的にSharedPreferencesはXMLにクリアテキストで保存され、ルート化された電話では、アプリケーションが別の共有設定に非常に簡単にアクセスできるためです。
デフォルトでは防弾セキュリティではありません(実際には設定の難読化に似ています)が、Androidアプリをより安全にするための迅速な勝利です。たとえば、ルート化されたユーザーを停止しますアプリの共有設定を簡単に変更するデバイス( link )
他の方法をいくつかお勧めします。
方法1:* .propertiesファイルを Propertiesで使用する
長所:
短所:
まず、構成ファイルを作成します: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: Flavor :でbuildConfigField
を使用する
これは公式の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;
アプリケーションの設定を保存する場合は、Androidが SharedPreferences を提供します。
公式トレーニングリソースへのリンクです。
私は最近、このような要件を満たしました。ここで、それをどのように行ったかに注意してください。
sDカード上のテキストファイルを調べて、必要な特定の情報を取り出すことができるようにするアプリケーション
要件:
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 );