XML-файл Android не сохраняется

Я пишу игру с помощью LibGDX и пытаюсь сохранить XML-файл, но всегда есть исключение (java.io.FileNotFoundException: /data/Slugfest/teams/Team1.xml: open failed: ENOENT (Нет такого файл или каталог)) при сохранении файла. Этот код сохраняет файл.

public void save() {
    try {
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        DOMSource source = new DOMSource(doc);
        StreamResult result;

        if (Gdx.app.getType() == ApplicationType.Android) {
            result = new StreamResult(new File("/data/Slugfest/teams/" + name + ".xml"));
        } else {
            result = new StreamResult(new File(name + ".xml"));
        }
        transformer.transform(source, result);
        Gdx.app.log("Slugfest", "File saved.");
    } catch (TransformerException tfe) {
        Gdx.app.log("Slugfest", tfe.getLocalizedMessage());
    }
}

Между прочим, мой файл манифеста включает разрешения WRITE/READ_EXTERNAL_STORAGE.


person Shane    schedule 11.07.2012    source источник
comment
Я не знаю насчет LibGDX, но в случае простого андроида вам нужно сделать каталог, если он недоступен. Например, File dir = new File ("path to file");, а затем if(dir.exists()==false) { dir.mkdirs(); } а затем для файла File file = new File(dir, fileName);   -  person Mohsin Naeem    schedule 11.07.2012


Ответы (1)


Вам нужно создать каталог, в который вы пытаетесь сохранить. Вы должны проверить, есть ли он там, если нет, то создать его. Что-то вроде этого:

if (Environment.getExternalStorageState() == null) {
                directory = new File(Environment.getDataDirectory()
                        + "/RobotiumTestLog/");
                photoDirectory = new File(Environment.getDataDirectory()
                        + "/Robotium-Screenshots/");
                /*
                 * this checks to see if there are any previous test photo files
                 * if there are any photos, they are deleted for the sake of
                 * memory
                 */
                if (photoDirectory.exists()) {
                    File[] dirFiles = photoDirectory.listFiles();
                    if (dirFiles.length != 0) {
                        for (int ii = 0; ii <= dirFiles.length; ii++) {
                            dirFiles[ii].delete();
                        }
                    }
                }
                // if no directory exists, create new directory
                if (!directory.exists()) {
                    directory.mkdir();
                }

                // if phone DOES have sd card
            } else if (Environment.getExternalStorageState() != null) {
                // search for directory on SD card
                directory = new File(Environment.getExternalStorageDirectory()
                        + "/RobotiumTestLog/");
                photoDirectory = new File(
                        Environment.getExternalStorageDirectory()
                                + "/Robotium-Screenshots/");
                if (photoDirectory.exists()) {
                    File[] dirFiles = photoDirectory.listFiles();
                    if (dirFiles.length > 0) {
                        for (int ii = 0; ii < dirFiles.length; ii++) {
                            dirFiles[ii].delete();
                        }
                        dirFiles = null;
                    }
                }
                // if no directory exists, create new directory to store test
                // results
                if (!directory.exists()) {
                    directory.mkdir();
                }
            }

Здесь я проверяю, есть ли SD-карта, если нет, то сохраняю локально, иначе сохраняю на SD. Я также проверяю файлы и удаляю, если они есть. Возможно, вам это не нужно, но это всеобъемлющий алгоритм, который должен делать то, что вам нужно. Возьмите то, что вам нужно.

Надеюсь, поможет.

person BlackHatSamurai    schedule 11.07.2012
comment
Пожалуйста! Рад, что смог помочь! Не стесняйтесь принять и проголосовать, если хотите :) - person BlackHatSamurai; 11.07.2012