Перейти к содержанию
  • 0
bossalex

[DELPHI FMX Android] [6.0] Не удается загрузить SSL библиотеку

Вопросы

Недавно компилил приложение на Delphi  FMX Android  при обращении  к серверу https при выполнении Get запроса от компонента TIdHttp запросил библиотеку "Could not load SSL library" используется протокол sslvTLSv1_2 в windows все пашет в андроид нет , накопал что можно подключить библиотеки  libssl.so и  libcrypto.so через  deployment .assets\internal , А вот как в коде дальше их использовать никто примерчик не выложил, хоть и обсуждали на интернет просторах 100 раз, те как прикрутить  к IdSSLIOHandlerSocketOpenSSL1.SSLOptions.CertFile. Если есть у кого код выложите пожалуйста? или скинте по email bossalex@ya.ru

IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method.sslvTLSv1_2;
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode.sslmUnassigned;

 

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


Ссылка на сообщение

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

  • 1
4 часа назад, bossalex сказал:

Недавно компилил приложение на Delphi  FMX Android  при обращении  к серверу https при выполнении Get запроса от компонента TIdHttp запросил библиотеку "Could not load SSL library" используется протокол sslvTLSv1_2 в windows все пашет в андроид нет , накопал что можно подключить библиотеки  libssl.so и  libcrypto.so через  deployment .assets\internal , А вот как в коде дальше их использовать никто примерчик не выложил, хоть и обсуждали на интернет просторах 100 раз, те как прикрутить  к IdSSLIOHandlerSocketOpenSSL1.SSLOptions.CertFile. Если есть у кого код выложите пожалуйста? или скинте по email bossalex@ya.ru

IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method.sslvTLSv1_2;
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode.sslmUnassigned;

 

 

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


Ссылка на сообщение
  • 0
В 30.09.2017 в 03:01, bossalex сказал:

 

Просто пытаетесь выполнить get запрос? Очень странно, у меня все работало. Даже в справке от эмбы написано:

For OS X and Android, your application does not need to meet any prerequisite for TLS/SSL support. The required OpenSSL library is available by default on those operating systems.

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Securing_Indy_Network_Connections

Может дело в версии студии/ведра?

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


Ссылка на сообщение
  • 0
12 минуты назад, M1shQa сказал:

Может дело в версии студии/ведра?

все дело в TidHTTP (Indy) - его нельзя использовть под Андроидом

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


Ссылка на сообщение
  • 0

 

3 часа назад, Равиль Зарипов (ZuBy) сказал:

все дело в TidHTTP (Indy) - его нельзя использовть под Андроидом

Систем.нет.хттп? Кстати да, на андроиде все плохо, особенно когда ковырял сервис, в сервисе заработал только систем нет сокет..

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


Ссылка на сообщение
  • 0
3 минуты назад, M1shQa сказал:

 

Систем.нет.хттп? Кстати да, на андроиде все плохо, особенно когда ковырял сервис, в сервисе заработал только систем нет сокет..

System.Net.* - нативный, он на всех платформах работает правильно, а Indy не работает на андроиде, т.к. используется другая либа (не boringSSL)

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


Ссылка на сообщение
  • 0

Кто знает как яндекс почту прикрутить к indy с ssl под дектоп работает, под андроид раньше работало сейчас оред что в отладке при коннекте SMTP не загружена библиотека SSL ранше использовал связку tidSMTP+tidMessage+IdSSLIOHandlerSocketOpenSSL c 465 портом

Этото код работает в десктопе на яндексе под win рабоатает со внешними библиотекеми SSL типа libeay32.dll ssleay32dll

Function TFormOFORMLENIE.mail(email:STRING):Boolean;
var email:String;
begin
  try
    Smtp.AuthType:=satDefault;
    SMTP.ReadTimeout:=10000;
    SMTP.Host := 'smtp.yandex.ru';
    SMTP.Port := 465;
    SMTP.Username :=login;
    SMTP.Password :=pass;

    SMTP.IOHandler:=IdSSLIOHandlerSocketOpenSSL1;
    SMTP.UseTLS:= utUseImplicitTLS;

    IdSSLIOHandlerSocketOpenSSL1.Destination := SMTP.Host+':'+IntToStr(SMTP.Port);
    IdSSLIOHandlerSocketOpenSSL1.Host := SMTP.Host;
    IdSSLIOHandlerSocketOpenSSL1.Port := SMTP.Port;
    IdSSLIOHandlerSocketOpenSSL1.DefaultPort := 0;
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method:=sslvTLSv1;
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode := sslmUnassigned;
    MailMessage.From.Name := 'Тест';
    MailMessage.Subject := 'Тест: '+FormatDateTime('dd.mm.yy-hh:nn',Now) ;

    MailMessage.From.Address :='bossalex@ya.ru';
    MailMessage.Recipients.EMailAddresses := email;
    MailMessage.Body.Text := MemoTXT.Text;
  try
      try
        SMTP.Connect;// орет нет библиотеки SSL - под win рабоатает со внешними библиотекеми SSL типа libeay32.dll ssleay32dll только не FMX на VCL к яндексу коннектися и отправляет письма,

// есть еще libgcc_s_dw2-1.dll libwinpthread-1.dll msvcr100.dll правда не помню тоже какието библиотеки забыл для чего, надо в инете поковырять
        sleep(200);
        Application.ProcessMessages;
        SMTP.Send(MailMessage);
        ShowMessage('Письмо отправлено!');
        MailMessage.MessageParts.Clear;
      except
        on e: Exception do
        begin
          sleep(200);
          ShowMessage('Письмо не отправлено!');
        end;
      end;
    finally
      MailMessage.MessageParts.Clear;
      SMTP.Disconnect;
    end;
  except
  end;
end;

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


Ссылка на сообщение
  • 0

На андроиде с версии 6+ Гугл перешёл на boringSSL, которая не поддерживается инди

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


Ссылка на сообщение
  • 0

На stackoverflow описано решение этой проблемы. Суть в том, что мы принудительно заставляем Indy использовать OpenSSL вместо BorinSSL:

1. добавляем в project deployment для андроида 2 файла: libcrypto.so и libssl.so (взять их можно на https://forums.embarcadero.com/thread.jspa?threadID=211147), в качестве Remote path для обоих файлов указываем .\assets\internal

2. убеждаемся, что в .dpr модуль System.StartUpCopy указан самым первым

3. при запуске приложения вызываем IdOpenSSLSetLibPath(TPath.GetDocumentsPath) 

примечание к версии SSL - на файлы по ссылке из п.1 Google не выдает предупреждений, а на более старые версии будет ругаться

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


Ссылка на сообщение
  • 0
В 08.11.2017 в 13:54, Tumaso сказал:

На stackoverflow описано решение этой проблемы. Суть в том, что мы принудительно заставляем Indy использовать OpenSSL вместо BorinSSL:

1. добавляем в project deployment для андроида 2 файла: libcrypto.so и libssl.so (взять их можно на https://forums.embarcadero.com/thread.jspa?threadID=211147), в качестве Remote path для обоих файлов указываем .\assets\internal

2. убеждаемся, что в .dpr модуль System.StartUpCopy указан самым первым

3. при запуске приложения вызываем IdOpenSSLSetLibPath(TPath.GetDocumentsPath) 

примечание к версии SSL - на файлы по ссылке из п.1 Google не выдает предупреждений, а на более старые версии будет ругаться

Добрый день!

На Androide7 у меня не работает! Все равно выдает Could not load SSL!  Как на Андроиде 7 передать почту используя SSL. На Андроиде 5 почта  с SSL передается вообще без проблем 

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


Ссылка на сообщение
  • 0
23 часа назад, Юрий Гусач сказал:

Добрый день!

На Androide7 у меня не работает! Все равно выдает Could not load SSL!  Как на Андроиде 7 передать почту используя SSL. На Андроиде 5 почта  с SSL передается вообще без проблем 

Лучший вариант отказаться от Indy и использовать родную библиотеку из модуля System.Net.HttpClient и THTTPClient. Она и более стабильная на всех 4 ОС и SSL работает прозрачно.

Что означает "передать почту"?

 

Отредактировал ENERGY

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


Ссылка на сообщение
  • 0

[ENERGY] Подскажите тогда, как с помощью родной библиотеки отправить e-mail адресату из приложения? Компоненты Indy позволяют это сделать!

Скачайте просто свежий SSL с сайта Indy

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


Ссылка на сообщение
  • 0
2 часа назад, wamaco сказал:

[ENERGY] Подскажите тогда, как с помощью родной библиотеки отправить e-mail адресату из приложения? Компоненты Indy позволяют это сделать!

Скачайте просто свежий SSL с сайта Indy

Я отправляю через PHP скрипт, а скрипт отправляет через SMTP хостинг сервера, который в данный момент работает. Т.е. отправляю письмо через POST запрос. Так можно и лог вести на сервере.

Отредактировал ENERGY

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


Ссылка на сообщение
  • 0
33 минуты назад, ENERGY сказал:

Я отправляю через PHP скрипт, а скрипт отправляет через SMTP хостинг сервера, который в данный момент работает. Т.е. отправляю письмо через POST запрос. Так можно и лог вести на сервере.

Ну вот... вопрос? а если сервера нет.... и задача этого не требует... приплыли?

через post запрос любой сможет! ?

Как обойти, я написал выше! Скачать валидный SSL

Отредактировал wamaco

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


Ссылка на сообщение
  • 0
23 минуты назад, wamaco сказал:

Ну вот... вопрос? а если сервера нет.... и задача этого не требует... приплыли?

через post запрос любой сможет! ?

Как обойти, я написал выше! Скачать валидный SSL

В смысле сервера нет? А через какой SMTP тогда почта отправляется? Через сервер хостинг провайдера.

На деле это проще реализуется, чем кажется. Ведь даже "отправить комментарий разработчику", проще сделать через такой PHP скрипт, чем заморачиватся с Indy и SMTP компонентами.

Отредактировал ENERGY

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


Ссылка на сообщение
  • 0
2 минуты назад, ENERGY сказал:

В смысле сервера нет? А через какой SMTP тогда почта отправляется? Через сервер хостинг провайдера.

На деле это проще реализуется, чем кажется.

Почта отправляется напрямую, без php скриптов и вашего сервера! и не надо никаких скриптов!

Вы же имеете ввиду, что вы запускаете скрипт PHP на своем сервере и шлете почту! так?

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


Ссылка на сообщение
  • 0
10 минут назад, wamaco сказал:

Почта отправляется напрямую, без php скриптов и вашего сервера! и не надо никаких скриптов!

Вы же имеете ввиду, что вы запускаете скрипт PHP на своем сервере и шлете почту! так?

Ну как это напрямую, на деревню дедушке что-ли? На SMTP сервер же. А где вы его берете? Не бесплатными же пользоваться, которые могут забанить в любое время, по любым причинам, с лимитированным кол. писем.

Я из программы вызываю https://mysite.com/sendemail.php  с post параметрами. Все шифруется с https. И дальше уже заботы PHP скрипта и сервера.

 

 

Отредактировал ENERGY

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


Ссылка на сообщение
  • 0
23 минуты назад, ENERGY сказал:

Ну как это напрямую, на деревню дедушке что-ли? На SMTP сервер же. А где вы его берете? Не бесплатными же пользоваться, которые могут забанить в любое время, по любым причинам, с лимитированным кол. писем.

Я из программы вызываю https://mysite.com/sendemail.php  с post параметрами. Все шифруется с https. И дальше уже заботы PHP скрипта и сервера.

 

 

По-моему, Вы не знаете, как работает Indy. Используя эти компоненты, можно послать письмо, минуя свой сервер, вы сразу настраиваете параметры отсылки, аналогично, любому почтовому клиенту и отсылаете письмо! 

например, я не знаю и знать не хочу PHP и сервера у меня нет! как мне отослать письмо с приложения? INDY спешит на помощь!

Вот пример:

var
  SMTP    : TIdSMTP;
  msg     : TIdMessage;
  SSLOpen : TIdSSLIOHandlerSocketOpenSSL;
begin
  SMTP := TIdSMTP.Create(Application);
  SMTP.Host := 'smtp.mail.ru';
  SMTP.Port := 465;
  SMTP.AuthType := satDefault;
  SMTP.Username := 'моя почта@mail.ru';
  SMTP.Password := 'пароль от моей почты ';
 
  //это необходимо использовать для SSL
  SSLOpen := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  SSLOpen.Destination := SMTP.Host+':'+IntToStr(SMTP.Port);
  SSLOpen.Host := SMTP.Host;
  SSLOpen.Port := SMTP.Port;
  SSLOpen.DefaultPort := 0;
  SSLOpen.SSLOptions.Method := sslvSSLv23;
  SSLOpen.SSLOptions.Mode := sslmUnassigned;
 
  SMTP.IOHandler := SSLOpen;
  SMTP.UseTLS := utUseImplicitTLS;
 
  msg := TIdMessage.Create(Application);
  msg.Subject := 'Проверка почты';
  msg.From.Address := 'моя почта@mail.ru';
  msg.From.Name := 'AlexF';
  msg.Recipients.EMailAddresses := 'почта получателя@yandex.ru';
 
  SMTP.Connect;
  if SMTP.Connected then
    begin
      SMTP.Send(msg);
      ShowMessage ('Сообщение отправлено');
    end else
      ShowMessage ('Не удалось отправить сообщение');
  SMTP.Disconnect();
  SMTP.Free;
  msg.Free;
end;
Отредактировал wamaco

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


Ссылка на сообщение
  • 0

Посмотрите на пример Indy наверху. Там написано: 

  SMTP.Host := 'smtp.yandex.ru';
Вот про него я и говорю, что бесплатный SMTP сервер это очень нестабильная вещь, и забанить там могут в любое время, по любой причине. Кстати, smtp.yandex.ru в Украине не будет работать.

Отредактировал ENERGY

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


Ссылка на сообщение
  • 0
2 минуты назад, ENERGY сказал:

Посмотрите на пример Indy наверху. Там написано: 

  SMTP.Host := 'smtp.yandex.ru';
Вот про него я и говорю, что бесплатный SMTP сервер это очень нестабильная вещь, и забанить там могут в любое время, по любой причине. Кстати, smtp.yandex.ru в Украине не будет работать.

Это просто Вам, как пример! Еще раз... отправить письмо надо! Сервера нет! (нет денег содержать, нет возможностей и т.д.)

Вы сделали приложение, передали заказчику, там функционал отправки письма! Кто оплачивает сей фуршет по отправке? ?

Вы держите сервер и всех там обслуживаете?

Отредактировал wamaco

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


Ссылка на сообщение
  • 0

Смысл от такого функционала, если через неделю он не будет работать, причем разработчик об этом не будет знать, т.к. письма не будут доходить. А так, да, заказчик должен арендовать хостинг, 2-3$ в месяц не такая большая цена, где все есть "в пакете" и уже готово к работе. Причем на хостинге обычно и база находится и\или вебсайт.

Отредактировал ENERGY

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


Ссылка на сообщение
  • 0

>Кстати, smtp.yandex.ru в Украине не будет работать.

Все работает. 

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


Ссылка на сообщение
  • 0
10 часов назад, ENERGY сказал:

Смысл от такого функционала, если через неделю он не будет работать, причем разработчик об этом не будет знать, т.к. письма не будут доходить. А так, да, заказчик должен арендовать хостинг, 2-3$ в месяц не такая большая цена, где все есть "в пакете" и уже готово к работе. Причем на хостинге обычно и база находится и\или вебсайт.

Слишком много ЕСЛИ.... 

Задачи разные бывают и приложения тоже. Мы говорим про конкретную задачу отправки письма из приложения. Способов несколько, использование Indy позволяет это сделать без стороннего хостинга.

А через неделю и Ваш хостинг может загнуться, ввиду не оплаты, форс мажора и т.д.

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


Ссылка на сообщение
  • 0

Вообще не совсем понятно зачем делать отправку письма из приложения.

Я придерживаюсь мнения что захардкоренные места не нужно держать в приложении, при обновлении параметров smtp сервера вы никак не сможете починить быстро

самый простой способ это хостинг ну или текущий сайт компании, там реализовать отправку письма как предлагал @ENERGY

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


Ссылка на сообщение

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

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

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

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

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

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

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

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


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

    • От Delpher-X
      Доброе время суток. У меня есть код, который отправляет данные, в частности файлы, из одного приложения в другое, используя технологию AppTethering. Вот код, который отправляет данные: 
      var ImageToStream : TMemoryStream; begin ImageToStream := TMemoryStream.Create; ImageToStream.LoadFromFile('Здесь находится путь к файлу'); ImageToStream.Position := 0; TetheringAppProfile1.Resources.FindByName('ImageTransfer').Value := ImageToStream; ImageToStream.Free; end; А вот который принимает: 
      procedure TForm1.TetheringAppProfile1Resources3ResourceReceived( const Sender: TObject; const AResource: TRemoteResource); var GetImage : TMemoryStream; begin GetImage := TMemoryStream.Create; GetImage.Position := 0; GetImage.LoadFromStream(AResource.Value.AsStream); ImageViewer1.Bitmap.LoadFromStream(GetImage); GetImage.Free; end; Пока передача данных идет между двумя Windows-приложениями, все работает прекрасно. Однако, когда я пытаюсь отправить данные от Windows-приложения в Android-приложение, которое исполняется на смартфоне, подключенном к компьютеру через USB-шнур, данные не проходят.  
    • От Delpher-X
      У меня есть код, который должен скачивать файл с сайта: 
      var LoadFile : TMemoryStream; begin LoadFile := TMemoryStream.Create; IdHTTP1.Get('https://sitename.pro/Folder/FileName.txt', LoadFile); LoadFile.SaveToFile('FileName.txt'); LoadFile.Free; end; Проблема однако в том, что вместо скачивания файла программа выдает: Could not load SSL library, хотя я никакой "SSL library" не просил)). При этом, когда я попробовал скачать файл с сайта работающего по старинке, на http (в отличие от https), все скачалось нормально, то есть проблема явно в данном протоколе. Поиск по Интернету ничего не дал.  
    • От Delpher-X
      Здравствуйте. У меня такая проблема. 
      Пытаюсь скачать файл:
       
      var S : TMemoryStream; begin S := TMemoryStream.Create(); IdHTTP1.Get('http://sitename.com/7UlmBU7IXHA.jpg', S); S.SaveToFile('/storage/emulated/0/ImageFile.jpg'); S.Free; end;
      Проблема возникает на последней стадии - при сохранении файла. Android пишет, Cannot create file: '/storage/emulated/0/ImageFile.jpg'. Permission denied, то есть доступ запрещен. Но как его разрешить? Когда я устанавливаю приложение, система пишет, что никаких разрешений данная программа не требует.
    • От Delpher-X
      Здравствуйте. Как указываются пути к каталогам и файлам в Android? Скажем, в Windows я указываю такой путь:  C:/Windows/Folder, а как это делается в Android? Особенно меня интересует, как обратиться к корневому каталогу, для создания там новой папки или файла, в Windows это C:/, или D:/ а тут как? 
    • От destroyer86
      Всем привет, с помощью Java2Op сделал обертку библиотеки получил модуль с интерфейсами.
      Теперь сам вопрос в JavaInterfaces.pas есть описание:
       
      JUsbManagerClass = interface(JObjectClass) ['{1048A6E9-E1B5-4DA5-A168-ED91E8DE5284}'] {class} function _GetACTION_USB_ACCESSORY_ATTACHED: JString; cdecl; {class} function _GetACTION_USB_ACCESSORY_DETACHED: JString; cdecl; {class} function _GetACTION_USB_DEVICE_ATTACHED: JString; cdecl; {class} function _GetACTION_USB_DEVICE_DETACHED: JString; cdecl; {class} function _GetEXTRA_ACCESSORY: JString; cdecl; {class} function _GetEXTRA_DEVICE: JString; cdecl; {class} function _GetEXTRA_PERMISSION_GRANTED: JString; cdecl; {class} function getAccessoryList: TJavaObjectArray<JUsbAccessory>; cdecl;//Deprecated {class} function openAccessory(accessory: JUsbAccessory): JParcelFileDescriptor; cdecl;//Deprecated {class} function openDevice(device: JUsbDevice): JUsbDeviceConnection; cdecl;//Deprecated {class} procedure requestPermission(device: JUsbDevice; pi: JPendingIntent); cdecl; overload;//Deprecated {class} property ACTION_USB_ACCESSORY_ATTACHED: JString read _GetACTION_USB_ACCESSORY_ATTACHED; {class} property ACTION_USB_ACCESSORY_DETACHED: JString read _GetACTION_USB_ACCESSORY_DETACHED; {class} property ACTION_USB_DEVICE_ATTACHED: JString read _GetACTION_USB_DEVICE_ATTACHED; {class} property ACTION_USB_DEVICE_DETACHED: JString read _GetACTION_USB_DEVICE_DETACHED; {class} property EXTRA_ACCESSORY: JString read _GetEXTRA_ACCESSORY; {class} property EXTRA_DEVICE: JString read _GetEXTRA_DEVICE; {class} property EXTRA_PERMISSION_GRANTED: JString read _GetEXTRA_PERMISSION_GRANTED; end; [JavaSignature('android/hardware/usb/UsbManager')] JUsbManager = interface(JObject) ['{6F603A25-E816-4012-9B23-054B428A4A75}'] function getDeviceList: JHashMap; cdecl;//Deprecated function hasPermission(device: JUsbDevice): Boolean; cdecl; overload;//Deprecated function hasPermission(accessory: JUsbAccessory): Boolean; cdecl; overload;//Deprecated procedure requestPermission(accessory: JUsbAccessory; pi: JPendingIntent); cdecl; overload;//Deprecated end; TJUsbManager = class(TJavaGenericImport<JUsbManagerClass, JUsbManager>) end; Что бы получить доступ к методам интерфейса используется следующая конструкция:
      JavaObject := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.USB_SERVICE); FUsbManager := TJUsbManager.Wrap((JavaObject as ILocalObject).GetObjectID); теперь я могу получить доступ к методам JUsbManager, а как получить доступ к методам JUsbManagerClass
      Вот пример кода на Java, который хочу реализовать в Delphi:
      UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager); if (availableDrivers.isEmpty()) { return; } // Open a connection to the first available driver. UsbSerialDriver driver = availableDrivers.get(0); //Вот тут мы видим что из экземпляра класса мы вызываем openDriver, как это сделать в Delphi UsbDeviceConnection connection = manager.openDevice(driver.getDevice()); Как мы можем заметить этого метода в описании интерфейса нет, но есть в классе, как получить доступ к экземпляру класса?
    • От Yarpda
      Доброго дня уважаемые форумчане!
      Есть одна задача, но я не совсем уверен, что так можно, прошу совета.
      В общем есть приложение, в ней база данных SqlLite (файл базы данных деплоится в assets\internal\). Пользователь наполняет эту базу данных своими данными.
      Необходимо сделать возможность экспортирования этих данных на внешний носитель и последующего импортирования уже на другом устройстве.
      Вопрос, даст ли система экспортировать свой файл из assets\internal и главное импортировать его (т.е. фактически заменить существующий файл  базы данных) в папке assets\internal на другом устройстве? (предполагается что root прав у пользователя нет).
      Если да, то можно вкратце объяснить порядок действий (желательно с указанием запрашиваемых и статичных разрешений на это дело, путей обращения к файлам).
      Если нет, то каким образом тогда это можно сделать (формировать промежуточный файл с данными БД, а потом его обрабатывать на другом устройстве средствами СУБД)?
      P.S. Такая задача встала впервые, не очень разбираюсь в теме безопасности на Андроид устройствах и работе с файлами приложения напрямую, поэтому прошу помощи, может быть кто-то уже сталкивался с подобной задачей.
      Заранее спасибо! )
    • От zekelive
      Коллеги, здравствуйте. Помогите пожалуйста с работой потоков. При запуске потока, появляется индикатор и исправно крутится. В какой то момент он залипает и перестает крутиться и так до конца работы потока. Понимаю, что в потоке идет работа с визуальными компонентами, по этому скорее всего и залипает индикатор. Как исправить/оптимизировать код? Спасибо.
      DelOff = class (TThread) protected FOnTaskStarted: TThreadMethod; FOnTaskFinished: TThreadMethod; procedure DoStarted; procedure DoFinished; procedure load; procedure Execute; override; public property OnTaskStarted: TThreadMethod read FOnTaskStarted write FOnTaskStarted; property OnTaskFinished: TThreadMethod read FOnTaskFinished write FOnTaskFinished; end; procedure DelOff.DoFinished; begin Add.Layout1.Visible:=false; if Assigned (Add.FindComponent('Null') as TLayout) then (Add.FindComponent('Null') as TLayout).Free; end; procedure DelOff.DoStarted; begin Add.Layout1.Visible:=true; end; procedure DelOff.load; begin try ReOpen; ClientModule2.ServerMethods1Client.Number13(a,b,g,h); a:='1'; ReOpen; offerlist1.Lines.Text:=ClientModule2.ServerMethods1Client.Number12(a,b,g,h); a:='2'; ReOpen; sumofferlist1.Lines.Text:=ClientModule2.ServerMethods1Client.Number12(a,b,g,h); a:='3'; ReOpen; keyofferlist1.Lines.Text:=ClientModule2.ServerMethods1Client.Number12(a,b,g,h); ReOpen; offercount:=ClientModule2.ServerMethods1Client.Number11(a,b,g,h); except ANM.Show; Add.Visible:=false; ShowmessageToast('Ошибка загрузки',TJToast.JavaClass.LENGTH_LONG); Value := Trim('10,500'); if Add.CheckPermission then if Value.Contains(',') then TVibratorHelper.vibrate(Value.Split([',']), -1) else TVibratorHelper.vibrate(Value.ToInt64); end; end; procedure DelOff.Execute; begin inherited; //Удаление из БД продукта try try Synchronize(DoStarted); updatecount:=StringReplace((Add.FindComponent('LabelIntro') as TLabel).Hint, 'Rec', '', [rfReplaceAll]); a:=(Add.FindComponent('NameProduct'+updatecount) as TLabel).Hint; di:= TZDeviceInfo.Create; b:=StringReplace(di.DeviceID, '=', '', [rfReplaceAll]); if(internet='true') and (server='true') then begin EditCase:='false'; Add.PSB.AutoCalculateContentSize:=false; Add.PSB.EnabledScroll:=true; Add.PSB.AutoCalculateContentSize:=true; synchronize(load); if Assigned (Add.FindComponent((Add.FindComponent('LabelDel') as TLabel).Hint)) then begin (Add.FindComponent((Add.FindComponent('LabelDel') as TLabel).Hint) as TRectangle).Free; (Add.FindComponent('RecEdit') as TRectangle).Free; end; Add.PSB.ScrollTo(0,0,true); for countload:=0 to StrToInt(offercount)-1 do begin (Add.FindComponent('XRun'+IntToStr(countload)) as TFloatAnimation).Enabled:=false; (Add.FindComponent('x'+IntToStr(countload)) as TImage).Opacity:=0; (Add.FindComponent('VRun'+IntToStr(countload)) as TFloatAnimation).Enabled:=false; (Add.FindComponent('v'+IntToStr(countload)) as TImage).Opacity:=0; end; end else begin ShowmessageToast('Нет интернета',TJToast.JavaClass.LENGTH_LONG); Value := Trim('10,500'); if Add.CheckPermission then if Value.Contains(',') then TVibratorHelper.vibrate(Value.Split([',']), -1) else TVibratorHelper.vibrate(Value.ToInt64); end; finally Synchronize(DoFinished); end; except ANM.Show; Add.Visible:=false; ShowmessageToast('Ошибка загрузки',TJToast.JavaClass.LENGTH_LONG); Value := Trim('10,500'); if Add.CheckPermission then if Value.Contains(',') then TVibratorHelper.vibrate(Value.Split([',']), -1) else TVibratorHelper.vibrate(Value.ToInt64); end; end;  
    • От Malstream
      Недавно решил написать небольшое приложение под андроид, которое будет в удобном виде показывать расписание моего ВУЗа (они нам передают 20 летний привет в виде экселя), ну и задно изучить FMX.
      Написал за пару дней парсер, все более менее работает. Встал вопрос - какими компонентами все это удобно и красиво отобразить? Перечитал кучу инфы по стандартным компонентам и, кажется, они мне не подойдут
      Для того чтобы было понятно, чего именно я хочу - набросал схему. Границы для наглядности. 
      Каким компонентом это можно реализовать? Если все-таки коробочные тоже годятся, то ткните лицом куда читать :)
      Заранее спасибо.

    • От ComAlex
      Господа Delphi-программисты под Android (FireMonkey),
      Нужна ваша помощь или совет в направления решения в несложной, достаточно типичной и прозрачной задаче:
      Я хочу выполнять некоторые вычисления (или выдавать Toastы) через каждые 30 сек. в Android-приложении.
      Что-то типа сервиса (службы): Приложение запускает задание и может закрываться, 
      но периодические вычисления продолжаются (результат сохраняется, допустим, в ini - не важно пока), т.е. служба работает.
      Я не знаю, как это решить:
      1. Организовал как сервис.
          Сервисы убиваются androidом ... И это политика androidов: экономить батарию и т.д.
      2. Сделал через AlarmManager.
          Тоже это не работает на MI 9T (Android 10: API 29). На старых (Android 4...: API 19) всё работает.
      3. Хотел использовать job scheduler: добавлять задания и удалять исполненные. Но не знаю как. ничего не нагуглил под Firemonkey. Может кто знает?
      Какие ещё варианты и вообще, это решается на Firemonkey Delphi XE 10.3.3?
      На поиск решения мною потрачено много время - сдвинуться не могу.
      Если Delphi это не умеет, так и скажите - перепрыгну на другую платформу.
          Может Delphi об этом думает, чтоб это скоро реализовать? В интернете тишина.
      Если Delphi это умеет, просьба дать идею или совет или пример ...
    • От Игорь Маринин
      поделитесь пожалуйста пустым проектом, готовым к публикации для TV устройств.
      что-то никак не получается опубликовать, сейчас отклонили с такими ошибками:
      APK:8
      No Now Playing notification [card]"
      Your App does not contain a “Now Playing” notification [card] for when the user has selected the HOME button within the app. Please refer to our Displaying a Now Playing Card documentation for more details.
      APK:8
      Play/Pause key event is not respected during playback
      Your media apps that play video or music content must respect the play/pause key during playback. Please refer to our Media Play/Pause documentation and Update the Playback State documentation for details.
      Missing DPad functionality
      Your app requires user interaction for menus or app navigation. Please make sure that all menus and app navigation are fully functional using a DPad. Please refer to our DPAD Control and Hardware Declaration documentation.
      ну и баннер не прилепил
      No full-size app banner
      Your app does not contain a full-size app banner or is it not visible in the launcher. We are targeting 1080P, which we consider xhdpi. Apps should include the banner in the xhdpi (320 dpi) drawables folder with a size of (320px × 180px). Please refer to our Home Screen Banner and UI Patterns documentation.
      The title should help users identify apps in the launcher. Please refer to our Visual Design and User Interaction documentation for more information.
      был бы очень благодарен за рабочий пустой костяк с манифестом.
       
  • Последние посетители   0 пользователей онлайн

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

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