Подтвердить что ты не робот

Файл конфигурации Android

Каков наилучший способ и как настроить файл конфигурации для приложения?

Я хочу, чтобы приложение могло просматривать текстовый файл на SD-карте и выделять определенную информацию, которая ему нужна?

4b9b3361

Ответ 2

Если ваше приложение будет выпущено для публики, и если у вас есть конфиденциальные данные в вашей конфигурации, такие как ключи API или пароли, я бы предложил использовать secure-preferences вместо SharedPreferences, так как в конечном счете SharedPreferences хранятся в XML в открытом тексте и на корневом телефоне очень просто для приложения получить доступ к другим общим настройкам.

По умолчанию это не пуленепробиваемая безопасность (на самом деле это больше похоже на обфускация предпочтений), но это быстрый выигрыш для постепенного что делает ваше приложение для Android более безопасным. Например, это остановит пользователей на укорененные устройства, легко изменяющие общие привилегии приложения. (ссылка)

Я бы предложил несколько других методов:

Метод 1: используйте файл *.properties с Properties

Плюсы:

  • Легко редактировать любую среду, из которой вы используете
  • Более безопасный: поскольку он скомпилирован с вашим приложением
  • Можно легко переопределить, если вы используете варианты сборки/ароматы
  • Вы также можете записать в config

Минусы:

  • Вам нужен контекст
  • Вы также можете записать в config (да, это также может быть con)
  • (что-нибудь еще?)

Сначала создайте файл конфигурации: 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;

Ответ 4

Я недавно выполнил такое требование, отметив здесь, как я это сделал.

приложение, чтобы иметь возможность просматривать текстовый файл на SD-карте и выбрать определенную информацию, которая ему требуется

Требование:

  1. Значение конфигурации (Score_threshold) должно быть доступно на SD-карте. Так что кто-то может изменить значения после выпуска apk.
  2. Файл конфигурации должен быть доступен по адресу "/sdcard/config.txt" оборудования Android.

Содержимое файла 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 );