Сохранение файла на внутреннюю память андроида с помощью Context

Я пытаюсь сохранить случайный файл приветствия во внутренней памяти моего Android. Когда я запускаю свое приложение, оно просто останавливается.

Код:

public void saveDataOnDevice(String toWrite, String filename) {
    Context ctx = null;
    try {
        FileOutputStream fos = ctx.openFileOutput(filename, Context.MODE_PRIVATE);
        fos.write(toWrite.getBytes());
        fos.close();
    }
    catch (IOException ioe) {
        ioe.printStackTrace();
    }
}

Другой вопрос, что означает Context. Я много читал об этом здесь, но до сих пор не понимаю.


person arnoutvh    schedule 07.04.2015    source источник
comment
Я думаю, что вряд ли можно сказать проще, чем это было в предоставленной вами ссылке: как следует из названия, это контекст текущего состояния приложения/объекта.   -  person notanormie    schedule 07.04.2015
comment
Кроме того, этот код семантически неверен, поскольку вы вызываете метод для нулевого объекта, который наверняка вызовет исключение нулевого указателя. Вы должны получить контекст из действия/службы/приложения, вызывающего этот метод.   -  person notanormie    schedule 07.04.2015
comment
покажите нам код того, как вы вызываете этот метод   -  person Arlind    schedule 07.04.2015


Ответы (1)


Прежде всего... ваш контекст всегда нулевой: Context ctx = null;, поэтому вы никак не сможете заставить его работать.

Для упрощения: Context в простом приложении будет вашим MainActivity. В большом приложении у вас может быть несколько контекстов, и ответ будет более сложным.

Вернемся к вашему коду, если он размещен внутри вашей MainActivity context, будет this:

public void saveDataOnDevice(String toWrite, String filename) {
    try {
        FileOutputStream fos = this.openFileOutput(filename, Context.MODE_PRIVATE);
        //                     ^ --> refers to main class, in this case your MainActivity
        fos.write(toWrite.getBytes());
        fos.close();
    }
    catch (IOException ioe) {
        ioe.printStackTrace();
    }
}

ПРИМЕЧАНИЕ. Если у вас нет этого метода внутри MainActivity, вы должны как-то передать ссылку на ваш Activity методу или классу (атрибут, параметр метода и т. д. и т. д.).

Дополнительные сведения см. в разделе Android Developers::saving files.

person Jordi Castilla    schedule 07.04.2015
comment
Привет @ ernie379 Я видел, что вы задавали разные вопросы, но не отметили ни один из них как принятый. Если этот или любой другой ответ решил ваш вопрос, рассмотрите просмотр ваших вопросов и отметьте как принятые те, которые разрешили ваши сомнения, нажав на галочку. Это показывает более широкому сообществу, что вы нашли решение, и улучшает репутацию как отвечающего, так и вас самих. Конечно, нет никаких обязательств делать это. - person Jordi Castilla; 07.04.2015
comment
Итак, я просто инициирую контекст как Context ctx = null; в своей основной активности? И эти разрешения в моем манифесте между тегами активности? - person arnoutvh; 07.04.2015
comment
Неа! Контекст ЯВЛЯЕТСЯ самим вашим классом MainActivity, поэтому вы используете this в качестве контекста, если метод находится внутри MainActivity.java - person Jordi Castilla; 07.04.2015
comment
хорошо, теперь мое приложение больше не падает. Куда следует сохранить этот файл? Это не в каталоге /data - person arnoutvh; 07.04.2015
comment
Проверьте этот ответ - person Jordi Castilla; 07.04.2015
comment
Я новичок в андроиде, поэтому не знаю, как отобразить результат метода getFilesDir(). Я пытался использовать textViews, но это не увенчалось успехом. - person arnoutvh; 07.04.2015