Перейти к содержанию
  • 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 эмодзи.

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

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

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


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

    • От 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.
      был бы очень благодарен за рабочий пустой костяк с манифестом.
       
    • От krapotkin
      В процессе разработки столкнулся с очень странной ситуацией, корни которой до сих пор неясны, но решение нашлось.
      Итак. Делфи 10.3.3. Чистое приложение - пустая форма и кнопка. Отлично работает на разных устройствах кроме Samsung Galaxy Tab A (2016). Android 5.1.1
      Программа падает, не успев даже загрузиться. Любая. При этом она же, скомпилированная на другом компе, запускается нормально. И даже после изменения SDK/NDK на нем, ничего не падает.
      LogCat дает крайне странную картину
      java.lang.IllegalArgumentException: Unable to load native library: /data/app-lib/com.embarcadero.Project1-1/libProject1.so
      Начинаем экспериментировать с SDK, NDK и т.д. Поставил также хотфиксы для 10.3.3.
      Сразу скажу, SDK/NDK ставились отдельно через Android studio, не скачивались вместе с Delphi. Не торопитесь бросать чтение на этом месте!)) На другом компе, где все работает, все ставилось точно так же.
      Короче, очень много комбинаций версий SDK/NDK проверено.
      Результат такой. При постепенном понижении версии NDK все взлетело при NDK v22.

      При этом версия SDK видимо такого большого влияния не имеет, потому что этот вариант нормально работает

      Повторюсь. На других устройствах все работало и на более новых Ndk. Xiaomi Mi Pad4 , Samsung Galaxy Tab A (2019), Xiaomi Redmi 5 и 5Plus
       
      Спасибо за участие и помощь в разборе завалов @Andrey Efimov
       
    • От krapotkin
      У меня в работе два приложения, и оба они не предназначены для Play market, так как имеют ограниченный круг использования, по сути, чисто внутрикорпоративные. Так что нежелательно и выкладывание их и на альтернативные магазины приложений. 
      Автоматически возникает вопрос обновления. Если в  первый раз мы можем установить приложение сами при помощи админов, то обновлять их не так просто. А контингент пользователей не справится с "скачайте APK по ссылке, найдите, куда его скачал браузер, и запустите вручную именно последний скачанный, а не какой попало"...
      Простейший способ - дать приложению скачать свежую копию с сайта и натравить на полученный файл системный инсталлер.
      Вот только свежие Andoird делать это напрямик запрещают. Нужен filepropvider. Целый день шуровал по мануалам и YT,
      Вот то что получилось  в результате.
      Если у вас 10.3.3 как у меня, уже можно не вносить <provider>...</provider> в манифест и свой файл file_paths.xml (или как вам его советуют назвать в интернетах) в деплой.
      Теперь все это делается хоть несколько странно и однобоко, но автоматически, путем установки галочки Secure File Sharing

      после этого в манифесте автоматически пропишется один из вариантов размещения файлов, которые вы можете найти в интернете. Используется алиас external-path
      файл, показанный на рисунке, создается автоматически самой делфи.

      теперь остается отгадать, какой путь реально подставится вместо "."
      Как показала практика, все пути выглядят не так, как кажется, если исходить из простого здравого смысла. Целый день использования GetHomeDir и других полезных методов TPath завел меня совсем в тупик.
      Оказалось все проще (?)
      st:TMemoryStream; OutputDir: JFile; ApkFile: JFile; ApkUri: Jnet_Uri; path, filename: string; ... OutputDir := TAndroidHelper.Context.getExternalCacheDir(); path := JStringToString(OutputDir.getAbsolutePath); filename := path+'/ASDroid2.apk'; ApkFile := TJfile.JavaClass.init( StringToJstring(filename)); FApkUri := TAndroidHelper.JFileToJURI(ApkFile); st.Position := 0; st.SaveToFile(filename); обратите внимание, в provider_paths мы задаем external-paths, а в коде ищем ExternalCacheDir.!!!  (For.Unbelievably.Creative.Knowers!)
      Потом все просто. FApkUri передаем в интент и запускаем 
      итоговый код примерно таков. (скачивание в потоке с использованием небольшого собственного API, но там ничего важного, можно не обращать внимания)
      procedure TasdSettingsFrame.bDownloadClick(Sender: TObject); begin {$IFDEF ANDROID} bDownload.Enabled := False; DownloadAndRun(); {$ENDIF} end; {$IFDEF ANDROID} procedure TasdSettingsFrame.DownloadAndRun(); begin ttask.Run(procedure var aapi:TasdAPI; st:TMemoryStream; OutputDir: JFile; ApkFile: JFile; ApkUri: Jnet_Uri; path, filename: string; begin st := TMemoryStream.Create; aapi := TasdAPI.Clone(_API); try aapi.OnReceiveData := OnReceiveData; aapi.getApk(st); if aapi.Err.Code=0 then begin OutputDir := TAndroidHelper.Context.getExternalCacheDir(); path := JStringToString(OutputDir.getAbsolutePath); filename := path+'/ASDroid2.apk'; ApkFile := TJfile.JavaClass.init( StringToJstring(filename)); FApkUri := TAndroidHelper.JFileToJURI(ApkFile); st.Position := 0; st.SaveToFile(filename); TThread.Synchronize(nil,procedure begin bDownload.Enabled := true; StartActivity(FApkUri); end); end; finally st.Free; aapi.Free; end; end); end; procedure StartActivity(ApkUri: Jnet_Uri); var Intent: JIntent; begin Intent := TJIntent.Create(); Intent.setAction(TJIntent.JavaClass.ACTION_VIEW); Intent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK or TJIntent.JavaClass.FLAG_ACTIVITY_CLEAR_TOP or TJIntent.JavaClass.FLAG_GRANT_WRITE_URI_PERMISSION or TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION); Intent.setDataAndType(apkuri, StringToJString('application/vnd.android.package-archive')); TAndroidHelper.Activity.startActivity(Intent); end; procedure TasdSettingsFrame.OnReceiveData(const Sender: TObject; AContentLength: Int64; AReadCount: Int64; var Abort: Boolean); begin tthread.Synchronize(nil, procedure begin pb1.Max := AContentLength; pb1.Value := AReadCount; end); end; {$ENDIF} Вопросы остались конечно, почему так странно с каталогами, но выяснять пока нет желания. Работает - не трожь.
      Всем удачи.
      UPD.
      Для того, чтобы системный инсталлер запускался, нужно не забыть отметить еще одну галочку

       
       
       
       
       
    • От Дмитрий Потапов
      Приветствую. На просторах интернета нашел BASS-библиотеку для Android и соответственно обертку для нее под Delphi.

      Вроде бы все работает нормально, но вот при настройке библиотеки при помощи методов
      BASS_GetConfigPtr, BASS_SetConfigPtr для работы со строковыми параметрами возникает проблема.
      На Windows с этим я легко работал, там достаточно использовать такую конструкцию

       
      PAnsiChar(BASS_GetConfigPtr(configId)) и получаем значение. BASS_SetConfigPtr(configId, PAnsiChar(value)) и задаем значение. Но вот под Android такой способ не проходит, как минимум по одной причине - он не понимает, что такое PAnsiChar. На docwiki.emarcadero.com, есть вот такая статейка. В которой написано, что PAnsiChar нужно заменить одним из трех: System.String, System.MarshalledString или System.SysUtils.TStringBuiler
      Только вот, если использовать MarshalledString, то при попытке получить значение приложение просто намертво зависает и все.
      Потом я подумал, так как библиотека написана на Java (вероятно), то может стоит попробовать использовать JNI в работе с ней, так как в Java файле, который прилагался вместе с библиотекой. Там я нашел объявления этих функций и заметил, что тип возвращаемого значения Object (ну, не зная Java я просто предположил, что это тоже просто ссылка на значение, например как PAnsiChar в Delphi на Windows).

      Но, при попытке как-либо использовать это натыкаюсь на проблемы в виде ошибки компиляции, либо очередном зависании приложения.
      Так как возвращается Object, то решил попробовать вариант с JObject и JString, но ни один вариант не хочет работать, опять ошибки на стадии компиляции, либо зависание приложение. Может быть, я что-то не так делаю.

      В общем, буду признателен за помощь!
    • От Yarpda
      Доброго времени!
      Есть идея сделать возможность резервирования данных приложения на Google drive под текущим аккаунтом пользователя. Ничего подобного я на форуме не нашел, может быть кто-то уже пытался решать подобную задачу? Интересует работа с Gdrive  в первую очередь.
    • От Ali Ezzeddine
      65/5000       Уважаемые,
      Есть ли способ вызвать сервис Java из приложения Delphi FMX?
    • От Эрик Шакиров
      Привет всем! Кто нибудь может подсказать как реализовать анимацию переходов между формами в Android без использования TabControl? Или подсказать в какую сторону "рыть"
    • От Светлана
      Ну всё в принципе как всегда, либо я барашка, либо лыжи не едут)
      А всё просто - я хочу, чтобы пока данные с сервера загружались по клику кнопки, пользователю элементарно был отклик в виде крутящейся какой нибудь фигни и он видел, что процесс идёт и что прога не зависла и никуда лишний раз не тыкал.
      Пока что для тестов сделала элементарно кнопку Update (speedbutton с image), данные элементарно грузятся и отображаются в GridPanel, а поверх него, чтоб пользователь и не смог куда либо тыкнуть, замостила панелькой с Image, вращаемой по таймеру (всё это дело наверху Visible:=false). И когда клацаем по кнопке Update, то панельку сверху грида делаю отображаемой и запускаю таймер, потом этот же обработчик/процедура грузит данные, а по окончанию останавливаем таймер и скрываем полупрозрачну, еще кстати, панельку. Аля вот так:
      procedure TForm1.SB_DataUpdateClick(Sender: TObject); begin //отображаем лого загрузки P_showLoad.Visible := true; Timer_load_rotate.Enabled := true; //с запуском таймера GetDeD_List(DE_set.Date); //процедура загрузки и отображения чего нам надо, которая весьма долго выполняется //и скрывае лого загрузки Timer_load_rotate.Enabled := false; //уже в обратном порядке P_showLoad.Visible := false; end; иии... ни черта не происходит как я хочу(
      Это лого вообще в итоге не отображается, а если убрать его скрытие, то оно у нас отобразится уже только тогда, когда всё загрузится. Логика мне стала подсказывать, что следовало его как то отобразить выполнив в параллельном асинхронном потоке аля так:
      procedure TForm1.SB_DataUpdateClick(Sender: TObject); begin TThread.Queue(TThread.Current, //TThread.Queue TThread.Synchronize ForceQueue procedure() begin P_showLoad.Visible := true; Timer_load_rotate.Enabled := true; end); GetDeD_List(DE_set.Date); //процедура загрузки и отображения чего нам надо, которая весьма долго выполняется end; И опять оно отображается только после того, как всё загрузится и проработает вся процедура. И уже чего только не пробовала и Synchronize и ForceQueue; и через TTask.Run и |task := TTask.Create(procedure () ... и т.д.| ничего не подходит, вот хоть убейся это всё дело будет отображаться только после полной отработки процедуры клика. Может я не в том направлении вообще рою и это как то по другому делается? Может я еще пока отлаживаю на Win32, а не всё на android, а там вот пара вариантов и норм на нём работают? Но чтот я никак не могу понять, что к чему... должно же быть как то просто, а я чтот никак не могу понять как(
    • От ComAlex
      Goоgle Play перестает поддерживать 32-bit Android-приложения c 01.08.2019.
      А выкладывать в Goоgle Play новые УЖЕ нельзя.
      Последние же Delphi XE не позволяют создать 64-bit Android-приложения.
      Кто знает, когда появится новая версия с поддержкой 64 - bit? Говорили, что в конце лета, но лето кончилось
  • Последние посетители   0 пользователей онлайн

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

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