• 0
Roman V

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

Вопросы

Всем привет. Учусь работать с 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>

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

25 ответов на этот вопрос

  • 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
3 часа назад, Kitty сказал:

if(FileExists(path))

На этой строчке выходит ошибка [bccaarm Error] Unit1.cpp(31): expected unqualified-id

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
34 минуты назад, Kitty сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
51 минуту назад, Gingercat сказал:

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

Не прокатило((

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

Изменено пользователем Roman V

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
15 часов назад, Roman V сказал:

На этой строчке выходит ошибка [bccaarm Error] Unit1.cpp(31): expected unqualified-id

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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

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

Debug.png.76c072d8cefeabbfddf8405f302d1d6b.png

Тогда только смотреть через monitor.bat, что там происходит с приложением.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Похожий контент

    • От Юрий Гусач
      Доброго дня!
      Проясните пожалуйста ситуацию: при запуске программы  под Андроидом на различных устройствах я получаю размеры формы, которые вроде всегда в разы меньше чем максимальное разрешение экрана конкретного устройства. Я пробовал планшеты и разные смартфоны. Написал тестовую прогу, которая выводит СlientScreen и  ClientWidth формы, на которой ничего больше нет. Например для крайне бюджетного смартфона Fly FS-549 получилось 497 х 320, а по паспорту 854x480. Разрешение и так хреновое, а Delphi его еще сильнее уменьшает. -       Почему это происходит и можно ли как то это обойти?
       
       
    • От Андрей Лещинский
      Здравствуйте ребята. С Firemonkey знаком только два дня. Многое уже подчеркнул с данного форума. Спасибо вам. 
      Проблема заключается в том, что у меня sdk для андроид 7 версии. Я собираю apk файл, запускаю его на Андроид 7 и все отлично, но как только я устанавливаю приложение на Андроид например версии 5, то при запуске оно мерцает пару раз и потом отображается отлично. Не подскажите в чем проблема? Я пробовал проект с данного форума, чтобы форма уходила под статусбара. Вот все они и мерцают на Андроид ниже 7, другие не пробовал проекты
      Стаж у меня только 2 дня, скажите в какую сторону смотреть мне далее
    • От SIARHEI RAHOUSKI
      Создал проект там куча компонентов. Но разворачивании формы на весь экран компоненты размер не меняют:
      Прочитал про свойства align Но как только я выставлю Group box например left другим right все сбивается в кучу и поправить это не могу. 
      Как настроить align ?

    • От SIARHEI RAHOUSKI
      Как сделать форму с компонентами под все разрешения?

    • От SIARHEI RAHOUSKI
      Как сделать мозаику (drag/drop) ? Получается есть 2 прямоугольника (которые надо перетаскивать)  и есть ещё 2 прямоугольника (которые должны принимать) и ещё есть кнопка проверки. При нажатии определяет правильно ли разместили прямоугольники.
    • От SIARHEI RAHOUSKI
      Как задать градиентную заливку TChart? именно самих столбцов. 

    • От SIARHEI RAHOUSKI
      При нажатии на Label действия не происходят
      procedure TForm2.Label11Click(Sender: TObject);
      begin
      Button1.visible:= true;
      {label7.Font.Style:= [];
      label8.Font.Style := [];
      label9.Font.Style := [];
      //label11.Font.Style := [fsbold];
      label10.Font.Style := [];  }

        GroupBox12.Visible := false;
        GroupBox13.Visible := false;
        GroupBox14.Visible := false;
        GroupBox15.Visible := true;
        GroupBox16.Visible := false;
      end;
    • От gutalin79
      Почему при добавлении MapView в пример Android Service, приложение перестает работать?
      AndroidSimpleService.zip
       
       
       
      Пример делал по этому видео: 
       
    • От Astghik
      Hello !!!
      I want onButtonClick create popup. I use TPopup component. All good, but on android "Back button" click closing forma. But I want close popup (when popup is shown).

       
      //---------------------------------------------------------------------------------
      void __fastcall  btn3PointsClick(TObject *Sender)
      {
          PopUpSettings->IsOpen = true;
          PopUpSettings->PlacementTarget = btn3Points;
          PopUpSettings->BringToFront();
      }
      //-------------------------------------------------------------------------------------
      void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose)
      {
          try {
              if (PopUpSettings->IsOpen == true) {
                  CanClose = false;
              }
              else {
                  CanClose = true;
              }
          } __finally {
              PopUpSettings->IsOpen = false;
          }
      }
      //-------------------------------------------------------------------
       
    • От Rokweb
      Таймер с интервалом 1мс заметно подтормаживает во время выполнения анимации TFloatAnimation в Tokyo. У всех так или только у меня?
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу