Читать assets app с книжного магазина (jar)

Что такое сообщество. Посмотрим кто-то я dá рука в этом. Случается, что я работаю в организовывании повторных и переиспользуемых кодов в собственном книжном магазине, и намерение состоит в том, чтобы распространять ее на фабрике в формате jar, как это нормальное. Все в порядке, но у меня есть особенный случай с одним из классов, что я мигрирую; у меня есть класс, который берется за то, чтобы писать серию докладов активности пользователя системы (вид мониторинга), что я хочу сделать, так это следующее: делать configurable имя (между другими вещами) файла logs, я думал о том, чтобы взять эту конфигурацию файла json, что он помещен в assets проекта того, кто использует книжный магазин, не в assets книжного магазина.

EDIT: я издаю мой вопрос для того, чтобы поняли лучше

В каждом каждом классе, который должен регистрировать события использования, осуществляется инстанция монитора следующего способа:

public class MainActivity extends Activity {

Logit logger = Logit.getInstance(this.getClass());
...// onCreate(), etc ...
}

Инстанция осуществляется даже с классов, которые они не увеличивают Activity, например с Датабасеельпер де Склите.

Строитель класса Logit - следующий:

public static Logit getInstance(Class<?> clazz) {
    if (log == null)
        log = new Logit();

    try {
        AssetManager manager = Resources.getSystem().getAssets();
        InputStream is = manager.open("logit.cfg");
        String input = new Scanner(is, "UTF-8").useDelimiter("\\A").next();
        JSONObject json = new JSONObject(input);
        String file = json.getString("filename");
        boolean showv = json.getBoolean("showAppVersion");
        log.setFileName(file);
        log.setShowVersion(showv);
        log.setClassName(clazz.getCanonicalName());
        return log;
    }catch(Exception e) {
        log.write(Logit.stringStackTrace(e));
        return log;
    }
}

То, что интересует меня, состоит в том, чтобы сохранять действительно необходимый аргумент в момент инстанции (Class<?>) и из-за расположения линии инстанции я не является выполнимым помещать ссылки в AssetManager главного app, чтобы помещать ресурс, поэтому мой интерес к тому, чтобы находить способ помещать конфигурацию с высокой повторяемостью молчаливым образом через файл конфигурации. Вопрос: как я могу с книжного магазина брать конфигурацию, которая существует в проекте, который использует книжный магазин, специально assets? мне не нравится идея, состоящая в том, что разработчик должен открывать jar, чтобы изменять конфигурации в Ваш вкус. Ясный пример цели состоит в том, чтобы состязаться такую конфигурацию как, например, конфигурация log4j. Привет всем!

7
задан 22.01.2016, 00:39
3 ответа

Я искал из-за сети, доказательство с этим

getResources().getIdentifier("res_name", "res_type", "com.library.package");

на R.id.settings соглашаются:

getResources().getIdentifier("settings", "id", "com.library.package");

ExtraГ-do StackOverflow

0
ответ дан 24.11.2019, 14:58

Давайте верить в класс, чтобы загружать свойства, я это сделал для файла типа ключ - стоимость как properties, ты сделай это для JSON:

public class PropertiesLoader { 
  private Context context;
  private Properties properties;

  public PropertiesReader(Context context) { 
    this.context = context;
    properties = new Properties();
  }

  public Properties getProperties(String fileName) {
    try {    
      //Accede al directorio asset 
      AssetManager am = context.getAssets(); 
      InputStream inputStream = am.open(fileName); 
      properties.load(inputStream);
    } catch (IOException e) { 
       //traza el error
    }
    return properties;
  }
}

Сейчас мы приспосабливаем твой класс Logit, чтобы использовать этот новый класс

public static Logit getInstance(Class<?> clazz, Context context) {
  if (log == null)
    log = new Logit();

  try {
    PropertiesLoader loader=new PropertiesLoader(context);
    Properties logitProperties=loader.getProperties(logit.cfg);

    // :TODO cargar propiedades en logit
    //yo lo hize para un fichero tipo properties tu hazlo para un fichero JSON
    ......
    return log;
  } catch(Exception e) {
    log.write(Logit.stringStackTrace(e));
    return log;
  }
}

Этот класс это будет осуществленная разработчиком

public class MainActivity extends Activity {

  //Añadimos el nuevo parametro al constructor
  Logit logger = Logit.getInstance(this.getClass(),this);
  ...// onCreate(), etc ...
}

Я надеюсь, что оно ты функционирует.....

4
ответ дан 24.11.2019, 14:58
  • 1
    превосходный! Уже v и # 237; тема проблемы, что имей, и # 237; который делать значило перемещать контекст aplicaci и # 243; n, на которой работает librer и # 237; в, а именно; вместо этого AssetManager manager = Resources.getSystem().getAssets(); только, перемещать context и помещать assets, схвати и # 237; AssetManager am = context.getAssets(); – Rosendo Ropher 21.04.2016, 00:56
  • 2
    Habr и # 225; какой-то способ не включать Context внутри getInstance? То, что он перемещает, состоит в том, что это не класс использования exculsivo в activities, нужно мочь использовать в любом классе java, его было или нет одним Activity, твой ответ решает мою проблему, но сейчас у меня есть этот новый недостаток. Пробуйте с Resources.getSystem () .getAssets (), но он не идет, это не assets, в которых я нуждаюсь, ты комментируешь мне. – Rosendo Ropher 21.04.2016, 02:04

QuizÃ: найди этих métodos útiles.

public class MainActivity extends AppCompatActivity {

    BufferedReader br;

    EditText editTextName;

    private final String FILENAME = "properties.xml";
    Properties properties;


    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        this.editTextName = (EditText) this.findViewById(R.id.editTextName);

        this.loadAssetFile();
        this.loadRawFile();

        this.properties = new Properties();

        File file = new File(getFilesDir(), FILENAME);
        try {
            if(file.exists()) {
                FileInputStream fis = openFileInput(FILENAME);
                this.properties.loadFromXML(fis);
                fis.close();
            } else {
                this.saveToStorage();
            }
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public void saveToStorage() throws Exception {
        FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
        this.properties.storeToXML(fos, null);
        fos.close();
    }

    public void saveToProperties(View v) {
        this.properties.setProperty("name", this.editTextName.getText().toString());
        Toast.makeText(this, "Saved", Toast.LENGTH_SHORT).show();
    }

    public void loadFromProperties(View v) {
        this.textViewName.setText("Welcome " + this.properties.getProperty("name") + "!");
    }

    public void loadAssetFile() {
        try {
            AssetManager manager = getApplicationContext().getAssets();
            InputStream is = manager.open("asset.txt");
            InputStreamReader isr = new InputStreamReader(is);
            this.br = new BufferedReader(isr);
            String currentLine;
            if((currentLine = this.br.readLine()) != null)
                this.greetingAsset.setText(currentLine);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void loadRawFile() {
        try {
            InputStream is = getResources().openRawResource(R.raw.raw);
            InputStreamReader isr = new InputStreamReader(is);
            this.br = new BufferedReader(isr);
            String currentLine;
            if((currentLine = this.br.readLine()) != null)
                this.greetingRes.setText(currentLine);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
0
ответ дан 24.11.2019, 14:58