Просмотр полной версии : Конфигурационный файл (Android)
ZackMercury
12.10.2013, 18:09
Застопорился на одном проэкте, решил создать Визуал Новеллу для Android, но проблема с созданием кофиг файла. Делаю подобную вещь впервые, гуглил и нашел код, на компьютере он записывал в хранилище данных(applicationStorageDirectory.nativePath), создавало там файл config.xml, где хранились конфигурационный данные приложения. На компе все прекрасно работало, загружало файл, при IO_ERROR, оно создавало файл и записывало в него настройки по-умолчанию, пускало загрузку файла заново. На телефоне оно не захотело создать или загрузить файл. Ошибок не видно, телефон ведь. Я сначала думал, что просто не отправлялся IO_ERROR, поэтому поставил создание файла в инициализации класса-загрузчика XML-файла. Результатов не дало.
Добавлено через 2 минуты
applicationStorageDirectory я трейсил на компе, там вывело Documents&Settings/AppData/Roaming/AppName
Добавлено через 42 минуты
Стоп, я, кажется, понял, в чем проблема. Сейчас проверю разрешения приложения.
Добавлено через 52 минуты
Нет, ничего не изменилось. На телефоне ничего не изменилось.
Добавлено через 2 часа 4 минуты
Итак, что я нашел. Открыв RootExplorer, зашел в папку data, где по данным от Adobe хранится кэш и сторэйджи всех AIR-приложений. Вот, покопавшись в ней, нашел-таки свой файл, зайдя еще в некоторые директории. Все с ним в порядке. Читал он файл по тому же пути, по которому и отправлял. Почему не хотел загружать его - без понятия . Может кто-то мне подскажет об особенностях загрузки файлов из локального хранилища, или проблема, получается, в самом приложении?
ZackMercury
13.10.2013, 14:54
Судя по тому, что происходит в приложении, событие окончания загрузки файла из локального хранилища вообще не происходит.
Сейчас кину код класса.
Но, повторюсь, на компьютере все нижеприведенное работает без проблем.
//Класс doXML, который проводит все операции с XML.
package com.instruments
{
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IOErrorEvent;
import flash.filesystem.File;
import flash.filesystem.FileMode;
import flash.filesystem.FileStream;
import flash.display.MovieClip;
public class doXML extends EventDispatcher
{
public static const SETTINGS_LOADED:String = "Settings is Loaded";
private var loader:URLLoader;
public var xml:XML;
public function doXML()
{
trace("class doXML initialize();");
}
public function loadXML(path:String):void
{
trace("function doXML.loadXML();");
loader = new URLLoader();
loader.addEventListener(Event.COMPLETE, onLoadXML);
loader.load(new URLRequest(path));
loader.addEventListener(IOErrorEvent.IO_ERROR, createDoc);
}
private function createDoc(e:IOErrorEvent = null):void
{
trace("function doXML.createDoc();");
var fileToCreate:File = File.applicationStorageDirectory;
fileToCreate = fileToCreate.resolvePath("config.xml");
var fileStream:FileStream = new FileStream();
fileStream.open(fileToCreate, FileMode.WRITE);
fileStream.writeUTFBytes("<?xml version=\"1.0\" encoding=\"utf-8\"?><configs><config><sound>true</sound><music>true</music><soundvalue>0.7</soundvalue><musicvalue>0.5</musicvalue><language>0</language> <!-- English 0, Russian 1 --> <progress>0</progress> </config></configs>")
fileStream.close();
this.loadXML(fileToCreate.nativePath);
}
private function onLoadXML(e:Event):void
{
trace("function doXML.onLoadXML();");
xml = XML(loader.data);
var xmlLoaded:Event = new Event(SETTINGS_LOADED);
dispatchEvent(xmlLoaded);
}
public function getSettings():XML
{
trace("function doXML.getSettings();");
return xml;
}
public static function saveSettings(settings:Array):void
{
trace("static function doXML.saveSettings();");
}
}
}
//Теперь код из кадра, который пользуется этим классом.
//ooXML - экземпляр класса doXML;
import com.game.*;
import flash.filesystem.File;
stop();
var path:File = File.applicationStorageDirectory;
path = path.resolvePath("config.xml");
showMenu();
ooXML.loadXML(path.nativePath);
ooXML.addEventListener(doXML.SETTINGS_LOADED, onSettingsLoad);
function onSettingsLoad(e:Event):void
{
trace("function onSettingsLoad();");
settingsXML = ooXML.getSettings(); // Получаем загруженные настройки в переменную settingsXML;
menu.play(); // В приложении на телефоне этого не происходит, соответственно данное событие не было получено.
//Если же убрать stop(); внутри меню, то меню анимируется. Иначе нет, тоесть этот код не выполняется.
settingsList = settingsXML.config; // Эта переменная типа XMLList.
currentProgress = settingsList.progress; // currentProgress:int
titles = null; // Удаляем из памяти заставку приложения.
var theSettings:Array = [settingsList.sound, settingsList.music, settingsList.soundvalue, settingsList.musicvalue, settingsList.language, settingsList.progress];
settings.setSettings(theSettings); // Отсылаем классу Settings загруженные настройки.
}
function showMenu():void
{
menu = new Menu();
addChild(menu);
menu.alpha = 0.6;
Element.align(menu, "right");
menu.y = 100; // Знаю, нехорошо.
}
var game:Game = new Game(settings, stage);
http://help.adobe.com/ru_RU/as3/dev/WS5b3ccc516d4fbf351e63e3d118666ade46-7fe4.html
Примечание. В Android свойство nativePath не может быть использовано для получения доступа к файлам в пакете приложения. Свойство nativePath представляет собой пустую строку. При обращении к файлам в каталоге приложения всегда используйте URL вместо собственного пути.
Зачем вам вообще, в данном случае URLLoader? Загружайте свой xml, через FileStream.
ZackMercury
13.10.2013, 18:26
http://help.adobe.com/ru_RU/as3/dev/WS5b3ccc516d4fbf351e63e3d118666ade46-7fe4.html
Зачем вам вообще, в данном случае URLLoader? Загружайте свой xml, через FileStream.
Спасибо вам большое.
Я просто ранее всегда писал лишь под Flash Player, вот и умею грузить только лоудерами.
Это, можно считать, мой первый проэкт под AIR, не считая простых экспериментов.
Сейчас начну гуглить про загрузку FileStream'ом)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.