Каков наилучший способ и как настроить файл конфигурации для приложения?
Я хочу, чтобы приложение могло просматривать текстовый файл на SD-карте и выделять определенную информацию, которая ему нужна?
Каков наилучший способ и как настроить файл конфигурации для приложения?
Я хочу, чтобы приложение могло просматривать текстовый файл на SD-карте и выделять определенную информацию, которая ему нужна?
Вы можете достичь этого, используя общие настройки
Существует очень подробное руководство по использованию общих настроек на странице Google Android https://developer.android.com/guide/topics/data/data-storage.html#pref
Если ваше приложение будет выпущено для публики, и если у вас есть конфиденциальные данные в вашей конфигурации, такие как ключи API или пароли, я бы предложил использовать secure-preferences вместо SharedPreferences, так как в конечном счете SharedPreferences хранятся в XML в открытом тексте и на корневом телефоне очень просто для приложения получить доступ к другим общим настройкам.
По умолчанию это не пуленепробиваемая безопасность (на самом деле это больше похоже на обфускация предпочтений), но это быстрый выигрыш для постепенного что делает ваше приложение для Android более безопасным. Например, это остановит пользователей на укорененные устройства, легко изменяющие общие привилегии приложения. (ссылка)
Я бы предложил несколько других методов:
Метод 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:
Лично я никогда не использовал этот метод, потому что он не кажется очень гибким.
В вашем 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: используйте buildConfigField
в Вкус:
Я не нашел это в официальной документации/обучении Android, но эту статью в блоге очень полезен.
В основном настройка проекта Flavor (например 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 );