Перейти к содержанию
Fire Monkey от А до Я
  • 0

Программа не запускается под Android


Roman V

Вопрос

Всем привет. Учусь работать с ini-файлами на Android. И сразу же возникла проблема, которую никак не могу решить. Хотел написать подобие приложение-тест с хранением данных в ini файле. В итоге все отлично работает на windows,а под Андроид при запуске висит только значок firemonkey секунд 10 и приложение вырубается так и не запустившись. В чем может быть проблема? Использую отладку по USB. 

TIniFile *Ini = new TIniFile(System::Ioutils::TPath::GetDocumentsPath() + PathDelim + "options.ini");

Юзаю эти библиотеки 

#include <System.IOUtils.hpp>
#include <System.IniFiles.hpp>

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
#include <System.IniFiles.hpp>
#include <System.IOUtils.hpp>
#include <memory>

//****

   #ifdef __ANDROID__
   String path = System::Ioutils::TPath::Combine(System::Ioutils::TPath::GetSharedDownloadsPath(), L"options.ini");
   #elif _Windows
   String path = System::Ioutils::TPath::Combine(ExtractFilePath(ParamStr(0)), L"options.ini");
   #endif

   if(FileExists(path))
    {
      std::unique_ptr<TIniFile> FileINI(new TIniFile(path));
      String ip = FileINI->ReadString(L"HOST", L"ip", L"127.0.0.1");
//****

1. std::unique_ptr используется чтобы избавиться от delete. std::unique_ptr все делает сам.
2. Файл ini для Андроида надо сохранить в UTF-8.

Ссылка на комментарий
  • 0
2 часа назад, Kitty сказал:

.. ExtractFilePath(ParamStr(0)) ...

Думаю, для Windows предпочтительнее использовать GetDocumentsPath(), т.к.:
1). как правило, exe-файл лежит в папке находящейся в Program Files и для записи ini-файла рядом с exe понадобятся права администратора;
2). если работа ведется с разных рабочих столов, то каждый пользователь сможет иметь индивидуальные настройки, хранящиеся в ini-файле

Ссылка на комментарий
  • 0
34 минуты назад, Kitty сказал:

Эта строка ни причем. Судя по ошибке, где-то ошибка в коде в синтаксе, например, пропущена где то точка с запятой ;

Не могу ничего найти, скорее всего ошибка в коде, что написал ты. Но блин, 20 раз уже проверил. Видимо я слепой)

Ссылка на комментарий
  • 0

Доброго вечера. Уж не помню в какой версии, но если мне память не изменят я когда то натыкался на аткой косяк.

Ради спортивного интереса, перепишите строку проверку таким макаром

int check = FileExists(path);
if(check == 1)
{
//
}

я ПОНИМАЮ, что это бред, но попробовать то можно.

Ссылка на комментарий
  • 0

Компилируется если закомментировать саму проверку. Но далее все равно прога на андроиде не запускается (только значок файерманки висит). А на винде все так же отлично работает. 

Изменено пользователем Roman V
Ссылка на комментарий
  • 0

Похоже на отсутствие прав чтения /записи в Андроиде.
Проверьте : Project - Options - Uses Permission - Read external storage (Write external storage)

P.S. Когда задаете вопрос, указывайте версию RAD, версию Android и устройство на котором тестируете

Изменено пользователем enatechno
Ссылка на комментарий
  • 0
26 минут назад, enatechno сказал:

P.S. Когда задаете вопрос, указывайте версию RAD, версию Android и устройство на котором тестируете

Запускаю на Lenovo A806, Android 4.4.2. Кастомная Lewa OS. Пробовал запускать другой код. Все работает. Однако с ini не хочет. Все галочки стоят.

Ссылка на комментарий
  • 0
51 минуту назад, Rusland сказал:

Покажите ваш код

По сути весь основной код уже сверху написан

#ifdef __ANDROID__
String path = System::Ioutils::TPath::Combine
	(System::Ioutils::TPath::GetSharedDownloadsPath(), L"options.ini");
#elif _Windows
String path = System::Ioutils::TPath::Combine(ExtractFilePath(ParamStr(0)),
	L"options.ini");
#endif

if (FileExists(path)) {
	std::unique_ptr <TIniFile> Ini(new TIniFile(path));
	String ip = Ini->ReadString(L"HOST", L"ip", L"127.0.0.1");
}
int butId; // номер вопроса

Далее идет код, который передает данные с ini на кнопки. 

void __fastcall TForm1::FormShow(TObject *Sender) {
	Form1->Updated();
	Form1->Updating();
	Button1->Text = Ini->ReadString(butId, "Ответ1", "Def");
	Button2->Text = Ini->ReadString(butId, "Ответ2", "Def");
	Button3->Text = Ini->ReadString(butId, "Ответ3", "Def");
	Button4->Text = Ini->ReadString(butId, "Ответ4", "Def");
	right = StrToInt(Ini->ReadString(butId, "right", "0"));
	Image1->Bitmap->LoadFromFile("img\\" + IntToStr(butId) + ".jpg");
	Label1->Text = butId;
}

Ну и еще там по мелочи. Все писать не буду. Т.к. в остальном ini не фигурирует.

Ссылка на комментарий
  • 0
В 26.10.2017 в 15:40, Kitty сказал:

1. std::unique_ptr используется чтобы избавиться от delete. std::unique_ptr все делает сам.
2. Файл ini для Андроида надо сохранить в UTF-8.

Спасибо большое! У тебя все правильно). Сегодня решил еще раз зайти и посмотреть со свежей головой. И вот, оказывается я не туда писал код просто. Приложение теперь запускается на Андроиде, но как мне создать файл ini во внутренней папке андроида? Если поместить файл ini в asset, то при компиляции все из этой папки удаляется, и приложение запускается без необходимых данных. Как решить эту беду. Как сделать так, чтобы файл считывался из папки assets?)

Ссылка на комментарий
  • 0

За это отвечает Deployment.

Добавьте нужные файлы, укажите путь и все.

Подробнее смотрите http://docwiki.embarcadero.com/RADStudio/Berlin/en/Deployment_Manager и http://docwiki.embarcadero.com/RADStudio/Berlin/en/Creating_an_Android_App#Loading_and_Deploying_Files

Так же есть статья в блоге Андрея Ефимова http://delphifmandroid.blogspot.ru/2014/02/deployment-manager.html

Ссылка на комментарий
  • 0
6 часов назад, mazayhin сказал:

Добавьте нужные файлы, укажите путь и все.

Не до конца понял как с этим работать. Шаги: пишу код 

#ifdef __ANDROID__
	String path = System::Ioutils::TPath::Combine
		(System::Ioutils::TPath::GetDocumentsPath(), L"options.ini");

->добавляю файл в Deployment Manager ->указываю путь(assets internal), кидая в папку assets файл-ini->нажимаю Deploy. После этого файл-ini из папки удаляется и сама строка становится не активной. И при запуске естественно приложение сразу же вырубается так и не запустившись. Что я делаю не так? И да. Пробовал класть ini файл в другую директорию, и загружать оттуда, но в Remote Path все равно указывал assets\internal. В таком случае строка остается активной, однако приложение не запускается...

Безымянный.png

Изменено пользователем Roman V
Забыл кое-что упомянуть
Ссылка на комментарий
  • 1

Судя по скринам ini-файл берется из папки Android\Debug. Зачем так делать? Эту папку создает сама студия. Возможно что Clean очищает все содержимое в этой папке и строка становится неактивной, потому что файла больше нет.

 

19 часов назад, Roman V сказал:

Пробовал класть ini файл в другую директорию, и загружать оттуда, но в Remote Path все равно указывал assets\internal. В таком случае строка остается активной, однако приложение не запускается...

Какую ошибку при этом выдает?

Ссылка на комментарий
  • 0
1 час назад, Rusland сказал:

Какую ошибку при этом выдает?

Вот щас попробовал вообще попробовал в левую папку кинуть ini файл и задеплоудить. Строка остается активной, однако на андроиде проект не запускается, хоть и компиляция проходит успешно...

Изменено пользователем Roman V
Ссылка на комментарий
  • 0
6 минут назад, Rusland сказал:

Что значит не запускается? В режиме дебаг что-то выдает наверное...

Компиляция проходит успешно. Но итоге все отлично работает на windows,а под Андроид при запуске висит только значок firemonkey пару секунд и приложение вырубается так и не запустившись. Debug чист.

Ссылка на комментарий
  • 0
1 час назад, Rusland сказал:

Вообще никаких сообщений не показывается?

Блин. Я вообще не понимаю что с этим андроидом. Оказывается он ругался на загрузку картинки. Так вот я закомментировал строку загрузки картинки щас. Теперь прога запускается, однако почему то не считывает данные с ini файла((((. Юзаю этот код. Однако в конченом результате на экране выводится только Def, Def, Def, Def. А то что под ключем "Ответ1" вообще игнорится...(( 

void __fastcall TForm1::FormShow(TObject *Sender) {
	Form1->Updated();
	Form1->Updating();
	Button1->Text = Ini->ReadString(butId, "Ответ1", "Def");
	Button2->Text = Ini->ReadString(butId, "Ответ2", "Def");
	Button3->Text = Ini->ReadString(butId, "Ответ3", "Def");
	Button4->Text = Ini->ReadString(butId, "Ответ4", "Def");
	right = StrToInt(Ini->ReadString(butId, "right", "0"));
	//Image1->Bitmap->LoadFromFile("img\\" + IntToStr(butId) + ".jpg");
	Label1->Text = butId;
}

 

Безымянный.png

Ссылка на комментарий
  • 0

во-первых, \ это только у windows разделитель
во-вторых, вы просите прочитать файл 1.jpg из папки /img в корне файловой системы ?

нет у вас никаких прав на это.

прочтите документацию по модулю ioutils

Ссылка на комментарий
  • 0
4 часа назад, krapotkin сказал:

прочтите документацию по модулю ioutils

Спасибо за информацию (приму к сведению), но щас я хочу разобраться именно с ini. А именоо почему у меня не считываются данные с ini файла. )

Ссылка на комментарий
  • 0

Скорее всего проблема в том, что вы используете русские буквы: 

Ответ1

Ответ2

Ответ3

...

Возможно проблема в кодировке файла. Она должна быть utf8.

Лучше замените буквы на латинские:

Otvet1

Otvet2

Otvet3

...

Ссылка на комментарий
  • 0
13 часа назад, Roman V сказал:

Спасибо за информацию (приму к сведению), но щас я хочу разобраться именно с ini. А именоо почему у меня не считываются данные с ini файла. )

Вы уверены что загружаете файл по правильному пути? Он точно там существует? При отсутствии файла, будет выдаваться значение по-умолчанию.

В какой он кодировке? Если кодировка не UTF-8, попробуйте указать в конструкторе верную (ту, в которой на самом деле файл).

Проверьте банально (на С++ перепишите):

if TFile.Exists(TPath.Combine(TPath.GetDocumentsPath,'inifile.ini')) then
  showmessage('file found') else
  showmessage('file not found');

Были ли значения в файле, когда у вас первый раз получилось его задеплоить? При обновлении приложения, если файл есть на устройстве, он не обновляется сам, надо или очистить в настройках, или сделать это все руками.

Проверьте что вообще в нем записано, да тем же TFile.ReadAllText('путь к файлу', 'кодировка'). Ну и если его "там" не будет, то как раз словите исключение...

P.S.: специально сейчас проверил, с русскими ключами проблемы нет, все читается. С кодировкой тоже, читает и ANSI и UTF-8 и Win-1251, в конструкторе даже не указывал кодировку.

 

Изменено пользователем mazayhin
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...