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

Евгений Корепов

Пользователи
  • Постов

    738
  • Зарегистрирован

  • Посещение

  • Победитель дней

    100

Весь контент Евгений Корепов

  1. Протокол SNTP Помимо NTP, существует упрощенная версия этого протокола - SNTP (Simple Network Time Protocol). Он реализован для синхронизации времени конечным клиентом, поскольку все преимущества протокола NTP проявляются именно в сети серверов, а для получения показаний конечным пользователем NTP излишне сложен. Поэтому для синхронизации времени конечными компьютерами и серверами был предложен протокол SNTP (SNTPv3: 1992 г., RFC1361 и 1995 г., RFC1769; SNTPv4 включён как подпротокол в NTPv4). На самом деле SNTP - это не новый протокол, а способ использования NTP-пакетов и NTP-серверов в приложениях, где не требуется высокоточное время, либо оно недостижимо. В этом случае клиент использует только часть информации UDP-пакета NTP-сервера. SNTP-клиент может работать с любыми версиями NTP-серверов, и кроме них - с особыми SNTP-серверами, которые в откликах заполняют только необходимые данные UDP-пакета. Таким образом, "облегченный" SNTP образует не сеть синхронизирующихся серверов, а пары "клиент-сервер". Любой NTP-сервер является одновременно SNTP-сервером. Клиент, который не передаёт полученное время дальше, может работать как NTP- или SNTP-клиент, в зависимости от условий. Для SNTP, как и для NTP, зарезервирован 123-й UDP-порт. Uses IdSNTP, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient; .... procedure TForm1.Button2Click(Sender: TObject); Var IdSNTP: TIdSNTP; begin IdSNTP:=TIdSNTP.Create(Self); IdSNTP.Host := 'ntp1.stratum2.ru'; ShowMessage(DateTimeToStr(IdSNTP.DateTime)); IdSNTP.Free; end;
  2. Тогда все было несколько проще - видеопамять была просто частью оперативной памяти, и видеокарта просто отрисовывала на экране содержимое памяти начиная с заданного адреса. 1 байт = 1 пиксел. Ширина экрана 320 пикселей. Вы говорили видеокарте установить смещение в 1000 байт и она отрисовыла все начиная с тысячного байта. Потом вы устанавливали смещение видеобуфера в 1320 байт (+1 строка) - и вот уже кадр на экране сместился на 1 пиксель выше. Повторяем на каждый тик - и у вас картинка скроллится снизу вверх. Сейчас у видеокарт все организованно сложнее, но принимая во внимание их безумную производительность, вы можете 50 раз в секунду рисовать абсолютно новую картинку. Но рисовать приходится каждый кадр с нуля. И только заслуга программистов что вы видите скроллы, коридоры, бегущих монстров и т.д. Естественно все это рисуется с помощью специальных интерфейсов взаимодействия с GPU (CUDA, Vulkan, OpenCL). Для вашей задачи вы вполне можете использовать эти мощнейшие механизмы - грузить в видеопамять картинки (текстуры), аппаратно натягивать их на плоскость, аппаратно скроллить эту плоскость. Все инструменты для этого есть в стандартной палитре компонентов Delphi.
  3. Может вам пойти простым путем - написать web-приложение (карта OpenStreetMap, маркеры на карте, немного JS). Все будет в браузере, плавно. При желании сможете засунуть все это в приложение, загрузив в TWebBrowser. Со своим советом я исходил их предположения что вам нужна карта и двигающиеся по ней картинки троллейбусов ?
  4. Вот как то так: ShellExecute(0, 'C:\Program Files\Java\jre1.8.0_121\bin\javaw.exe', '-jar D:\file.jar', nil, nil, SW_SHOWNORMAL);
  5. Соблазн велик! Но не поддавайтесь ереси! ? Ну или поддавайтесь ? Сделав все самостоятельно, вы не только сэкономите деньги, но и получите бесценный опыт. И получите площадку для сотен приложений. Тот же myclouddata очень ограничен - бесплатный аккаунт 1000 записей в таблице это ниочем. Да и платный с миллионом записей тоже не поражает воображение. Одно из моих приложений за пару лет накидало в таблицу с регистрациями FCM 600 тысяч записей. Так что вы (или заказчик приложения) может упереться в ограничение в самый неподходящий момент и придется судорожно искать другой сервис.
  6. Вы всегда можете изменить max_execution_time (равный по умолчанию 30 сек) в runtime : ini_set('max_execution_time', '3600');
  7. 1) Не безопасно. Потому как авторизация нужна (хотя бы в виде ключа "xq34mt89o32834yt9148t87913" в параметрах запроса ? 2) Это точно не нужно - безумная на грузка на сервер, транспортный протокол и клинта. 3) FTP - можно но нафик. Во первых отдельная логика на стороне клиента, во вторых хостер обычно предоставляет FTP доступ ко всей площадке, а хранить логин/пароль от площадки на клиенте это - нельзя. К счастью у нас на стороне сервера есть PHP, который для этого и предназначен: <?php //@ini_set("display_errors", "1"); error_reporting(E_ALL); @ini_set("display_errors", "0"); error_reporting(0); $SecureToken = "ce48oltq38p94tv83"; // Ключ для доступа $FilesPath = "/usr/share/My_Secret_File_folder/"; // Место хранения бинарных файлов // Просто пример неких данных для передачи пользователю в формате JSON (но храним и оперируем мы ими в обычном массиве $ExampleUserData = array( "Овощи" => array( "Помидорка", ), "Фрукты" => array( "Яблочко", ), ); if (!isset($_GET['token']) or $_GET['token'] != $SecureToken) { echo "Ах ты хитрая жопа! Пожалуйста, не взламывай мой сервер!"; exit; } if (!isset($_GET['command'])) { echo "Нет команды, не знаю что делать..."; exit; } switch ($_GET['command']) { "get_file" : if (!isset($_GET['file_name'])) { echo "Не знаю какой файл ты хочешь..."; exit; } $BinatyFilePath = $FilesPath . $_GET['file_name']; if (!file_exists($BinatyFilePath)) { echo "Не угадал, нет такого файла..."; exit; } if (ob_get_level()) { ob_end_clean(); } header('Content-Description: File Transfer'); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($BinatyFilePath)); // читаем файл и отправляем его пользователю if ($fd = fopen($BinatyFilePath, 'rb')) { while (!feof($fd)) { print fread($fd, 1024); } fclose($fd); } break; "get_data" : $JSONData = json_encode($ExampleUserData, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); header('Content-Type: application/json; charset=utf-8'); echo $JSONData; break; default : echo "Не знаю такой комманды..."; } Вот это простой кусок кода сделает следующие вещи: http://my_server.com/api/?token=ce48oltq38p94tv83&command=get_data - отдаст JSON данные http://my_server.com/api/?token=ce48oltq38p94tv83&command=get_file&file_name=naked_girl.jpg - отдаст бинарный файл, предположительно с изображение голой девушки. Ну а на в приложении вам останется только: Var HTTPResponse : IHTTPResponse; begin HTTPResponse:=FHTTPClient.Get(AURL); HTTPResponse.ContentAsString или HTTPResponse.ContentStream, смотря что вы запрашивали.
  8. 1. Хостинг рекомендую https://masterhost.ru/service/hosting/individual/ , это один из старейших и надежнейших хостеров России, там вы получите сразу все вам необходимое - MySQL, PHP любимой версии, если проект попрет, то сможете добавлять процессоры, память и т.д. Так же сможете зарегить домен под это дело, и при надобности получить SSL сертификат на этот домен. Все остальные хостинги игнорируйте, по крайней мере Российские. За почти 20 лет использования, мастерхост ни разу не подвел, а только радовал новыми плюшками. Реализация в вашем случае примерно такая: 1. MySQL на хостере - обеспечит вам работу и 10 миллионов активных пользователей. Но важно правильно спланировать структуру базы, структуру таблиц и структуру индексов таблиц. Если вы в этом не профи, то лучше нанять профи - ибо это фундамент, который потом очень сложно будет изменить. 2. PHP на хостере - прокладка между базой и запросами/ответами приложения. Рекомендую использовать самую свежую версию PHP, чтоб потом не пришлось перекраивать код удаляя deprecated функции и конструкции. 3. Протокол обмена - REST. Не вздумайте погружаться в теорию, читать про RESTful и пытаться реализовывать, этим занимаются только люди под тяжелыми наркотиками и обычно без единого законченного реального проекта. Достаточно того что приложение будет отправлять на сервер GET запросы получать JSON ответы. Можете подогнать протокол под существующие в Delphi компоненты TRESTClient, а можете и сами на стороне приложения разгребать JSON и получать нужные данные. Это совсем не сложно. 4. Приложение - посылает на сервер HTTP GET (ну или POST) запросы посредством THTTPClient, получает ответы в виде JSON, парсит их и так далее. Все содержимое предыдущего предложения - в отдельном потоке. Ну или используйте готовый TRESTClient - если готовы разбираться в нюансах его работы. Вот как то так.
  9. Для этого есть событие TForm.OnSaveState http://docwiki.embarcadero.com/Libraries/Rio/en/FMX.Forms.TForm.OnSaveState
  10. Вам нужно перехватывать события браузера OnWebBrowserShouldStartLoadWithRequest(ASender: TObject; const URL: string); OnWebBrowserCanNavigateEvent(Sender: TObject; const iURL: String; var ioCanNavigate: Boolean); проверять URL и iURL, и если там ссылка на номер телефона, то самостоятельно ее открывать, к примеру так: procedure TFormMain.OpenURL(const AUrl: string); var Uri: Jnet_Uri; OpenLinkIntent: JIntent; begin Uri := StrToJURI(AUrl); OpenLinkIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, Uri); TAndroidHelper.Activity.startActivity(OpenLinkIntent); end; Андроид откроет звонилку с уже вбитым номером телефона (или предложит выбрать приложение, если есть варианты и не выбран какой то по умолчанию).
  11. Вот вам apk приложения для того чтоб потестить самостоятельно. UhtaBus.7z
  12. Я проверил. После патча все работает как задумано, браузер наследует разрешения приложения: Если приложению правильно даны разрешения на геолокацию, то браузер разрешения не спрашивает, геолокация нормально работает в браузере. Если пользователь не дал приложению разрешение на геолокацию, то в браузере она тоже работать не будет, причем браузер и не будет сообщать о том что нет разрешения - при тыке на кнопку мое положение ничего не происходит. Это вполне нормально - пользователь сознательно отказался и понимает что геолокация работать не будет. Приложение, если пользователь не дал разрешение, и не должно по идее открывать браузер, если геолокация важная составляющая сервиса. У меня к примеру выдается сообщение - мол вы не дали разрешение, приложение работать не может. И по идее нужно предлагать пользователю открыть настройки для того чтоб он дал разрешение. Кстати в каком то приложении видел что по кнопке открываются настройки приложений - удобно, но как интересно это сделать?
  13. Полностью готовое и верное решение тут https://gist.github.com/ashumkin/3e2e213d657162ae26d364a85c64b472 Главное правильно в батнике выставить все пути. P.S. Давно бы уже эмба создала систему перекомпиляции прямо в среде, чтоб не мучаться с батниками в винде.
  14. Создал Issue https://quality.embarcadero.com/browse/RSP-24039 проголосуйте господа.
  15. Бедные программисты java, сколько странных и не очевидных нюансов ((( А для release достаточно поменять пути? Никаких дополнительных опций не нужно?
  16. Алексей, позволь еще раз поблагодарить! И прошу прощения за то что я тупил и капризничал ?
  17. Где моё блюдечко!!! И чтоб с голубой каёмочкой!!! ? Просто никогда с этим не связывался, да и времени погружаться в нюансы просто нет ( Связал. Мой косяк. Дебильный путь от Эмбы сбил с толку. Вот первый раз решил SDK решил оставить по умолчанию (обычно он у меня в D:\PlatformSDKs) и теперь пожинаю плоды... Теперь гораздо-гораздо лучше! Куча предупреждений, но кто их читает ? D:\Embarcadero\Studio\20.0\source\rtl\androiddex\java\fmx\src>D:\Embarcadero\fmx.jar-rebuild.cmd D:\Embarcadero\Studio\20.0\source\rtl\androiddex\java\fmx\src>set JAVA_HOME=C:\Program Files\Java\jre1.8.0_121 D:\Embarcadero\Studio\20.0\source\rtl\androiddex\java\fmx\src>set SDK=C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms D:\Embarcadero\Studio\20.0\source\rtl\androiddex\java\fmx\src>if "xD:\Embarcadero\Studio\20.0" == "x" set BDS=D:\Embarcadero\Studio\20.0 D:\Embarcadero\Studio\20.0\source\rtl\androiddex\java\fmx\src>cd D:\Embarcadero\Studio\20.0\source\rtl\androiddex\java\fmx\src D:\Embarcadero\Studio\20.0\source\rtl\androiddex\java\fmx\src>PATH C:\Program Files\Java\jre1.8.0_121\bin\;C:\Program Files\Java\jre1.8.0_121\bin\;C:\Program Files\Java\jre1.8.0_121\bin\;C:\Program Files\Java\jre1.8.0_121\bin\;C:\Program Files\Java\jre1.8.0_121\bin\;d:\Embarcadero\Studio\20.0\bin;d:\Embarcadero\Studio\20.0\bin64;D:\Embarcadero\ Studio\20.0\bin;C:\Users\Public\Documents\Embarcadero\Studio\20.0\Bpl;D:\Embarcadero\Studio\20.0\bin64;C:\Users\Public\Documents\Embarcadero\Studio\20.0\Bpl\Win64;C:\Program Files\Microsoft MPI\Bin\;C:\ProgramData\Oracle\Java\javapath;D:\PlatformSDKs\Windows Kits\10\Windows Performance Toolkit\;C:\Program Files\Java\jdk1.7.0_71\bin;C:\WINDOWS\s ystem32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\OpenSSL-Win32\bin\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files\OpenVPN\bin;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\PHP\;C:\ProgramData\ ComposerSetup\bin;C:\ProgramData\ComposerSetup\bin;C:\Users\ekore\AppData\Local\Microsoft\WindowsApps;C:\Users\ekore\AppData\Local\GitHubDesktop\bin;C:\Users\ekore\AppData\Local\Microsoft\WindowsApps;C:\PHP\;C:\Users\ekore\AppData\Roaming\Composer\vendor\bin;C:\ProgramData\ComposerSetup\bin; & javac com\embarcadero\firemonkey\webbrowser\* .java -cp "C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar" warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/graphics/Bitmap.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/net/http/SslError.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/os/Message.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/view/KeyEvent.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/webkit/HttpAuthHandler.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/webkit/SslErrorHandler.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/webkit/WebView.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/content/Context.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/webkit/WebChromeClient.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/webkit/GeolocationPermissions.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/webkit/GeolocationPermissions$Callback.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/view/ViewTreeObserver.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/view/ViewTreeObserver$OnGlobalFocusChangeListener.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/view/ViewGroup.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/view/ViewGroup$OnHierarchyChangeListener.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/view/ViewParent.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/view/ViewManager.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/view/View.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/graphics/drawable/Drawable.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/graphics/drawable/Drawable$Callback.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/view/KeyEvent$Callback.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/os/Parcelable.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/view/InputEvent.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/view/accessibility/AccessibilityEventSource.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/widget/AbsoluteLayout.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/webkit/WebViewClient.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/view/ViewDebug.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/view/ViewDebug$ExportedProperty.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/view/ViewDebug$IntToString.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/view/ViewDebug$FlagToString.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/view/ViewGroupOverlay.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. warning: C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-26\android.jar(android/util/SparseArray.class): major version 52 is newer than 51, the highest major version supported by this compiler. It is recommended that the compiler be upgraded. Note: com\embarcadero\firemonkey\webbrowser\WebClient.java uses or overrides a deprecated API. Note: Recompile with -Xlint:deprecation for details. 32 warnings D:\Embarcadero\Studio\20.0\source\rtl\androiddex\java\fmx\src>rem copy "D:\Embarcadero\Studio\20.0\lib\android\debug\fmx.jar" "D:\Embarcadero\Studio\20.0\lib\android\debug\fmx.jar.bak" D:\Embarcadero\Studio\20.0\source\rtl\androiddex\java\fmx\src>jar -vuf "D:\Embarcadero\Studio\20.0\lib\android\debug\fmx.jar" com\embarcadero\firemonkey\webbrowser\OnWebViewListener.class com\embarcadero\firemonkey\webbrowser\WebBrowser.class com\embarcadero\firemonkey\webbrowser\WebBrowser$1.class com\embarcadero\firemonkey\webbrowser\WebClien t.class adding: com/embarcadero/firemonkey/webbrowser/OnWebViewListener.class(in = 1183) (out= 482)(deflated 59%) adding: com/embarcadero/firemonkey/webbrowser/WebBrowser.class(in = 1023) (out= 508)(deflated 50%) adding: com/embarcadero/firemonkey/webbrowser/WebClient.class(in = 2881) (out= 1151)(deflated 60%) adding: com/embarcadero/firemonkey/webbrowser/WebBrowser$1.class(in = 861) (out= 454)(deflated 47%) И в конце приз - все заработало! Геолокация в браузере работает. Браузер даже не спросил разрешения на геолокацию - в приложении разрешения есть, и как я понимаю теперь браузер использует разрешения приложения.
  18. Вот батник: set JAVA_HOME=C:\Program Files\Java\jre1.8.0_121 set SDK=C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms if "x%BDS%" == "x" set BDS=D:\Embarcadero\Studio\20.0 cd %BDS%\source\rtl\androiddex\java\fmx\src PATH %JAVA_HOME%\bin\;%PATH% & javac com\embarcadero\firemonkey\webbrowser\*.java -cp "%SDK%\android-sdk-windows\platforms\android-26\android.jar" rem copy "%BDS%\lib\android\debug\fmx.jar" "%BDS%\lib\android\debug\fmx.jar.bak" jar -vuf "%BDS%\lib\android\debug\fmx.jar" com\embarcadero\firemonkey\webbrowser\OnWebViewListener.class com\embarcadero\firemonkey\webbrowser\WebBrowser.class com\embarcadero\firemonkey\webbrowser\WebBrowser$1.class com\embarcadero\firemonkey\webbrowser\WebClient.class Вот результат его работы D:\>D:\Embarcadero\fmx.jar-rebuild.cmd D:\>set JAVA_HOME=C:\Program Files\Java\jre1.8.0_121 D:\>set SDK=C:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms D:\>if "xD:\Embarcadero\Studio\20.0" == "x" set BDS=D:\Embarcadero\Studio\20.0 D:\>cd D:\Embarcadero\Studio\20.0\source\rtl\androiddex\java\fmx\src D:\Embarcadero\Studio\20.0\source\rtl\androiddex\java\fmx\src>PATH C:\Program Files\Java\jre1.8.0_121\bin\;C:\Program Files\Java\jre1.8.0_121\bin\;C:\Program Files\Java\jre1.8.0_121\bin\;C:\Program Files\Java\jre1.8.0_121\bin\;d:\Embarcadero\Studio\20.0\bin;d:\Embarcadero\Studio\20.0\bin64;D:\Embarcadero\Studio\20.0\bin;C:\Users\Public\Document s\Embarcadero\Studio\20.0\Bpl;D:\Embarcadero\Studio\20.0\bin64;C:\Users\Public\Documents\Embarcadero\Studio\20.0\Bpl\Win64;C:\Program Files\Microsoft MPI\Bin\;C:\ProgramData\Oracle\Java\javapath;D:\PlatformSDKs\Windows Kits\10\Windows Performance Toolkit\;C:\Program Files\Java\jdk1.7.0_71\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\W bem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\OpenSSL-Win32\bin\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files\OpenVPN\bin;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\PHP\;C:\ProgramData\ComposerSetup\bin;C:\ProgramData\Compose rSetup\bin;C:\Users\ekore\AppData\Local\Microsoft\WindowsApps;C:\Users\ekore\AppData\Local\GitHubDesktop\bin;C:\Users\ekore\AppData\Local\Microsoft\WindowsApps;C:\PHP\;C:\Users\ekore\AppData\Roaming\Composer\vendor\bin;C:\ProgramData\ComposerSetup\bin; & javac com\embarcadero\firemonkey\webbrowser\*.java -cp "C:\Users\Public\Documents\Emb arcadero\Studio\20.0\CatalogRepository\AndroidSDK-2525_20.0.33219.4899\platforms\android-sdk-windows\platforms\android-26\android.jar" com\embarcadero\firemonkey\webbrowser\OnWebViewListener.java:3: error: package android.graphics does not exist import android.graphics.Bitmap; ^ com\embarcadero\firemonkey\webbrowser\OnWebViewListener.java:4: error: package android.net.http does not exist import android.net.http.SslError; ^ com\embarcadero\firemonkey\webbrowser\OnWebViewListener.java:5: error: package android.os does not exist import android.os.Message; ^ com\embarcadero\firemonkey\webbrowser\OnWebViewListener.java:6: error: package android.view does not exist import android.view.KeyEvent; ^ com\embarcadero\firemonkey\webbrowser\OnWebViewListener.java:7: error: package android.webkit does not exist import android.webkit.HttpAuthHandler; ^ com\embarcadero\firemonkey\webbrowser\OnWebViewListener.java:8: error: package android.webkit does not exist import android.webkit.SslErrorHandler; ^ com\embarcadero\firemonkey\webbrowser\OnWebViewListener.java:9: error: package android.webkit does not exist import android.webkit.WebView; ^ com\embarcadero\firemonkey\webbrowser\OnWebViewListener.java:12: error: cannot find symbol public void doUpdateVisitedHistory(WebView view, String url, ^ symbol: class WebView location: interface OnWebViewListener com\embarcadero\firemonkey\webbrowser\OnWebViewListener.java:15: error: cannot find symbol public void onFormResubmission(WebView view, Message dontResend, ^ symbol: class WebView location: interface OnWebViewListener com\embarcadero\firemonkey\webbrowser\OnWebViewListener.java:15: error: cannot find symbol public void onFormResubmission(WebView view, Message dontResend, ^ symbol: class Message location: interface OnWebViewListener com\embarcadero\firemonkey\webbrowser\OnWebViewListener.java:16: error: cannot find symbol Message resend); ^ symbol: class Message location: interface OnWebViewListener com\embarcadero\firemonkey\webbrowser\OnWebViewListener.java:18: error: cannot find symbol public void onLoadResource(WebView view, String url); ^ symbol: class WebView location: interface OnWebViewListener com\embarcadero\firemonkey\webbrowser\OnWebViewListener.java:20: error: cannot find symbol public void onPageFinished(WebView view, String url); ^ symbol: class WebView location: interface OnWebViewListener com\embarcadero\firemonkey\webbrowser\OnWebViewListener.java:22: error: cannot find symbol public void onPageStarted(WebView view, String url, Bitmap favicon); ^ symbol: class WebView location: interface OnWebViewListener com\embarcadero\firemonkey\webbrowser\OnWebViewListener.java:22: error: cannot find symbol public void onPageStarted(WebView view, String url, Bitmap favicon); ^ symbol: class Bitmap location: interface OnWebViewListener com\embarcadero\firemonkey\webbrowser\OnWebViewListener.java:24: error: cannot find symbol public void onReceivedError(WebView view, int errorCode, ^ symbol: class WebView location: interface OnWebViewListener com\embarcadero\firemonkey\webbrowser\OnWebViewListener.java:27: error: cannot find symbol public void onReceivedHttpAuthRequest(WebView view, ^ symbol: class WebView location: interface OnWebViewListener com\embarcadero\firemonkey\webbrowser\OnWebViewListener.java:28: error: cannot find symbol HttpAuthHandler handler, String host, String realm); ^ symbol: class HttpAuthHandler location: interface OnWebViewListener com\embarcadero\firemonkey\webbrowser\OnWebViewListener.java:30: error: cannot find symbol public void onReceivedSslError(WebView view, SslErrorHandler handler, ^ symbol: class WebView location: interface OnWebViewListener com\embarcadero\firemonkey\webbrowser\OnWebViewListener.java:30: error: cannot find symbol public void onReceivedSslError(WebView view, SslErrorHandler handler, ^ symbol: class SslErrorHandler location: interface OnWebViewListener com\embarcadero\firemonkey\webbrowser\OnWebViewListener.java:31: error: cannot find symbol SslError error); ^ symbol: class SslError location: interface OnWebViewListener com\embarcadero\firemonkey\webbrowser\OnWebViewListener.java:33: error: cannot find symbol public void onScaleChanged(WebView view, float oldScale, float newScale); ^ symbol: class WebView location: interface OnWebViewListener com\embarcadero\firemonkey\webbrowser\OnWebViewListener.java:35: error: cannot find symbol public void onUnhandledKeyEvent(WebView view, KeyEvent event); ^ symbol: class WebView location: interface OnWebViewListener com\embarcadero\firemonkey\webbrowser\OnWebViewListener.java:35: error: cannot find symbol public void onUnhandledKeyEvent(WebView view, KeyEvent event); ^ symbol: class KeyEvent location: interface OnWebViewListener com\embarcadero\firemonkey\webbrowser\OnWebViewListener.java:37: error: cannot find symbol public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event); ^ symbol: class WebView location: interface OnWebViewListener com\embarcadero\firemonkey\webbrowser\OnWebViewListener.java:37: error: cannot find symbol public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event); ^ symbol: class KeyEvent location: interface OnWebViewListener com\embarcadero\firemonkey\webbrowser\OnWebViewListener.java:39: error: cannot find symbol public boolean shouldOverrideUrlLoading(WebView view, String url); ^ symbol: class WebView location: interface OnWebViewListener com\embarcadero\firemonkey\webbrowser\WebBrowser.java:3: error: package android.content does not exist import android.content.Context; ^ com\embarcadero\firemonkey\webbrowser\WebBrowser.java:4: error: package android.webkit does not exist import android.webkit.WebChromeClient; ^ com\embarcadero\firemonkey\webbrowser\WebBrowser.java:5: error: package android.webkit does not exist import android.webkit.WebView; ^ com\embarcadero\firemonkey\webbrowser\WebBrowser.java:6: error: package android.webkit.GeolocationPermissions does not exist import android.webkit.GeolocationPermissions.Callback; ^ com\embarcadero\firemonkey\webbrowser\WebBrowser.java:8: error: cannot find symbol public class WebBrowser extends WebView { ^ symbol: class WebView com\embarcadero\firemonkey\webbrowser\WebClient.java:3: error: package android.graphics does not exist import android.graphics.Bitmap; ^ com\embarcadero\firemonkey\webbrowser\WebClient.java:4: error: package android.net.http does not exist import android.net.http.SslError; ^ com\embarcadero\firemonkey\webbrowser\WebClient.java:5: error: package android.os does not exist import android.os.Message; ^ com\embarcadero\firemonkey\webbrowser\WebClient.java:6: error: package android.view does not exist import android.view.KeyEvent; ^ com\embarcadero\firemonkey\webbrowser\WebClient.java:7: error: package android.webkit does not exist import android.webkit.HttpAuthHandler; ^ com\embarcadero\firemonkey\webbrowser\WebClient.java:8: error: package android.webkit does not exist import android.webkit.SslErrorHandler; ^ com\embarcadero\firemonkey\webbrowser\WebClient.java:9: error: package android.webkit does not exist import android.webkit.WebView; ^ com\embarcadero\firemonkey\webbrowser\WebClient.java:10: error: package android.webkit does not exist import android.webkit.WebViewClient; ^ com\embarcadero\firemonkey\webbrowser\WebClient.java:12: error: cannot find symbol public class WebClient extends WebViewClient { ^ symbol: class WebViewClient com\embarcadero\firemonkey\webbrowser\WebBrowser.java:11: error: cannot find symbol private WebChromeClient mWebChromeClient; ^ symbol: class WebChromeClient location: class WebBrowser com\embarcadero\firemonkey\webbrowser\WebBrowser.java:22: error: cannot find symbol public WebBrowser(Context context) { ^ symbol: class Context location: class WebBrowser com\embarcadero\firemonkey\webbrowser\WebClient.java:21: error: cannot find symbol public void doUpdateVisitedHistory(WebView view, String url, ^ symbol: class WebView location: class WebClient com\embarcadero\firemonkey\webbrowser\WebClient.java:30: error: cannot find symbol public void onFormResubmission(WebView view, Message dontResend, ^ symbol: class WebView location: class WebClient com\embarcadero\firemonkey\webbrowser\WebClient.java:30: error: cannot find symbol public void onFormResubmission(WebView view, Message dontResend, ^ symbol: class Message location: class WebClient com\embarcadero\firemonkey\webbrowser\WebClient.java:31: error: cannot find symbol Message resend) { ^ symbol: class Message location: class WebClient com\embarcadero\firemonkey\webbrowser\WebClient.java:39: error: cannot find symbol public void onLoadResource(WebView view, String url) { ^ symbol: class WebView location: class WebClient com\embarcadero\firemonkey\webbrowser\WebClient.java:47: error: cannot find symbol public void onPageFinished(WebView view, String url) { ^ symbol: class WebView location: class WebClient com\embarcadero\firemonkey\webbrowser\WebClient.java:55: error: cannot find symbol public void onPageStarted(WebView view, String url, Bitmap favicon) { ^ symbol: class WebView location: class WebClient com\embarcadero\firemonkey\webbrowser\WebClient.java:55: error: cannot find symbol public void onPageStarted(WebView view, String url, Bitmap favicon) { ^ symbol: class Bitmap location: class WebClient com\embarcadero\firemonkey\webbrowser\WebClient.java:63: error: cannot find symbol public void onReceivedError(WebView view, int errorCode, ^ symbol: class WebView location: class WebClient com\embarcadero\firemonkey\webbrowser\WebClient.java:72: error: cannot find symbol public void onReceivedHttpAuthRequest(WebView view, ^ symbol: class WebView location: class WebClient com\embarcadero\firemonkey\webbrowser\WebClient.java:73: error: cannot find symbol HttpAuthHandler handler, String host, String realm) { ^ symbol: class HttpAuthHandler location: class WebClient com\embarcadero\firemonkey\webbrowser\WebClient.java:81: error: cannot find symbol public void onReceivedSslError(WebView view, SslErrorHandler handler, ^ symbol: class WebView location: class WebClient com\embarcadero\firemonkey\webbrowser\WebClient.java:81: error: cannot find symbol public void onReceivedSslError(WebView view, SslErrorHandler handler, ^ symbol: class SslErrorHandler location: class WebClient com\embarcadero\firemonkey\webbrowser\WebClient.java:82: error: cannot find symbol SslError error) { ^ symbol: class SslError location: class WebClient com\embarcadero\firemonkey\webbrowser\WebClient.java:90: error: cannot find symbol public void onScaleChanged(WebView view, float oldScale, float newScale) { ^ symbol: class WebView location: class WebClient com\embarcadero\firemonkey\webbrowser\WebClient.java:98: error: cannot find symbol public void onUnhandledKeyEvent(WebView view, KeyEvent event) { ^ symbol: class WebView location: class WebClient com\embarcadero\firemonkey\webbrowser\WebClient.java:98: error: cannot find symbol public void onUnhandledKeyEvent(WebView view, KeyEvent event) { ^ symbol: class KeyEvent location: class WebClient com\embarcadero\firemonkey\webbrowser\WebClient.java:106: error: cannot find symbol public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) { ^ symbol: class WebView location: class WebClient com\embarcadero\firemonkey\webbrowser\WebClient.java:106: error: cannot find symbol public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) { ^ symbol: class KeyEvent location: class WebClient com\embarcadero\firemonkey\webbrowser\WebClient.java:114: error: cannot find symbol public boolean shouldOverrideUrlLoading(WebView view, String url) { ^ symbol: class WebView location: class WebClient com\embarcadero\firemonkey\webbrowser\WebBrowser.java:25: error: cannot find symbol this.setWebViewClient(mWebClient); ^ symbol: method setWebViewClient(WebClient) com\embarcadero\firemonkey\webbrowser\WebBrowser.java:26: error: cannot find symbol mWebChromeClient = new WebChromeClient() { ^ symbol: class WebChromeClient location: class WebBrowser com\embarcadero\firemonkey\webbrowser\WebBrowser.java:33: error: cannot find symbol this.setFocusable(true); ^ symbol: method setFocusable(boolean) com\embarcadero\firemonkey\webbrowser\WebClient.java:23: error: cannot find symbol super.doUpdateVisitedHistory(view, url, isReload); ^ symbol: variable super location: class WebClient com\embarcadero\firemonkey\webbrowser\WebClient.java:20: error: method does not override or implement a method from a supertype @Override ^ com\embarcadero\firemonkey\webbrowser\WebClient.java:32: error: cannot find symbol super.onFormResubmission(view, dontResend, resend); ^ symbol: variable super location: class WebClient com\embarcadero\firemonkey\webbrowser\WebClient.java:29: error: method does not override or implement a method from a supertype @Override ^ com\embarcadero\firemonkey\webbrowser\WebClient.java:40: error: cannot find symbol super.onLoadResource(view, url); ^ symbol: variable super location: class WebClient com\embarcadero\firemonkey\webbrowser\WebClient.java:38: error: method does not override or implement a method from a supertype @Override ^ com\embarcadero\firemonkey\webbrowser\WebClient.java:48: error: cannot find symbol super.onPageFinished(view, url); ^ symbol: variable super location: class WebClient com\embarcadero\firemonkey\webbrowser\WebClient.java:46: error: method does not override or implement a method from a supertype @Override ^ com\embarcadero\firemonkey\webbrowser\WebClient.java:56: error: cannot find symbol super.onPageStarted(view, url, favicon); ^ symbol: variable super location: class WebClient com\embarcadero\firemonkey\webbrowser\WebClient.java:54: error: method does not override or implement a method from a supertype @Override ^ com\embarcadero\firemonkey\webbrowser\WebClient.java:65: error: cannot find symbol super.onReceivedError(view, errorCode, description, failingUrl); ^ symbol: variable super location: class WebClient com\embarcadero\firemonkey\webbrowser\WebClient.java:62: error: method does not override or implement a method from a supertype @Override ^ com\embarcadero\firemonkey\webbrowser\WebClient.java:74: error: cannot find symbol super.onReceivedHttpAuthRequest(view, handler, host, realm); ^ symbol: variable super location: class WebClient com\embarcadero\firemonkey\webbrowser\WebClient.java:71: error: method does not override or implement a method from a supertype @Override ^ com\embarcadero\firemonkey\webbrowser\WebClient.java:83: error: cannot find symbol super.onReceivedSslError(view, handler, error); ^ symbol: variable super location: class WebClient com\embarcadero\firemonkey\webbrowser\WebClient.java:80: error: method does not override or implement a method from a supertype @Override ^ com\embarcadero\firemonkey\webbrowser\WebClient.java:91: error: cannot find symbol super.onScaleChanged(view, oldScale, newScale); ^ symbol: variable super location: class WebClient com\embarcadero\firemonkey\webbrowser\WebClient.java:89: error: method does not override or implement a method from a supertype @Override ^ com\embarcadero\firemonkey\webbrowser\WebClient.java:99: error: cannot find symbol super.onUnhandledKeyEvent(view, event); ^ symbol: variable super location: class WebClient com\embarcadero\firemonkey\webbrowser\WebClient.java:97: error: method does not override or implement a method from a supertype @Override ^ com\embarcadero\firemonkey\webbrowser\WebClient.java:110: error: cannot find symbol return super.shouldOverrideKeyEvent(view, event); ^ symbol: variable super location: class WebClient com\embarcadero\firemonkey\webbrowser\WebClient.java:105: error: method does not override or implement a method from a supertype @Override ^ com\embarcadero\firemonkey\webbrowser\WebClient.java:113: error: method does not override or implement a method from a supertype @Override ^ 89 errors D:\Embarcadero\Studio\20.0\source\rtl\androiddex\java\fmx\src>rem copy "D:\Embarcadero\Studio\20.0\lib\android\debug\fmx.jar" "D:\Embarcadero\Studio\20.0\lib\android\debug\fmx.jar.bak" D:\Embarcadero\Studio\20.0\source\rtl\androiddex\java\fmx\src>jar -vuf "D:\Embarcadero\Studio\20.0\lib\android\debug\fmx.jar" com\embarcadero\firemonkey\webbrowser\OnWebViewListener.class com\embarcadero\firemonkey\webbrowser\WebBrowser.class com\embarcadero\firemonkey\webbrowser\WebBrowser$1.class com\embarcadero\firemonkey\webbrowser\WebClien t.class com\embarcadero\firemonkey\webbrowser\OnWebViewListener.class : no such file or directory com\embarcadero\firemonkey\webbrowser\WebBrowser.class : no such file or directory com\embarcadero\firemonkey\webbrowser\WebBrowser$1.class : no such file or directory com\embarcadero\firemonkey\webbrowser\WebClient.class : no such file or directory
  19. Хм, и никакого fmx-dexed-.jar в либах у меня не наблюдается, есть fmx.dex.jar. Странно что при куче ошибок что даже создалось в fmx.jar. Но проблему не решило.
  20. Только с fmx.jar-rebuild.cmd явно что то не так. Смущает конструкция PATH %JAVA_HOME%\bin\;%PATH% & javac com\embarcadero\firemonkey\webbrowser\*.java -cp "%SDK%\android-sdk-windows\platforms\android-26\android.jar" Она ожидаемо выдает в консоль кучу мусора и результат javac: file not found: com\embarcadero\firemonkey\webbrowser\*.java Usage: javac <options> <source files> use -help for a list of possible options C:\Users\ekore>rem copy "D:\Embarcadero\Studio\20.0\lib\android\debug\fmx.jar" "D:\Embarcadero\Studio\20.0\lib\android\debug\fmx.jar.bak" C:\Users\ekore>jar -vuf "D:\Embarcadero\Studio\20.0\lib\android\debug\fmx.jar" com\embarcadero\firemonkey\webbrowser\OnWebViewListener.class com\embarcadero\firemonkey\webbrowser\WebBrowser.class com\embarcadero\firemonkey\webbrowser\WebBrowser$1.class com\embarcadero\firemonkey\webbrowser\WebClient.class com\embarcadero\firemonkey\webbrowser\OnWebViewListener.class : no such file or directory com\embarcadero\firemonkey\webbrowser\WebBrowser.class : no such file or directory com\embarcadero\firemonkey\webbrowser\WebBrowser$1.class : no such file or directory com\embarcadero\firemonkey\webbrowser\WebClient.class : no such file or directory
  21. Простое приложение для андроид - форма, на ней TWebBrowser. В WebBrowser открываем что то требующее разрешение на геолокацию. У примеру https://www.openstreetmap.org В обычном браузере, при тыке на "Показать мое местоположение" появится popup окно с запросом разрешения на "Доступ к данным о вашем местоположении". Но в Delphi приложении описанном выше никакого запроса не приходит. ? Нашел решение для java https://forums.fusetools.com/t/geolocation-not-enabled-in-webview-on-android/1374 В функцию создания WebView public static Object CreateWebView321(final boolean zoomEnabled,final boolean scrollEnabled) { ScrollableWebView wv = new ScrollableWebView(com.fuse.Activity.getRootActivity()); wv.getSettings().setJavaScriptEnabled(true); wv.getSettings().setUseWideViewPort(true); //enabled viewport meta tag wv.getSettings().setLoadWithOverviewMode(true); //mimic iOS Safari and Android Chrome wv.getSettings().setSupportZoom(zoomEnabled); wv.getSettings().setBuiltInZoomControls(zoomEnabled); wv.getSettings().setDomStorageEnabled(true); wv.setAllowScroll(scrollEnabled); return wv; } рекомендуется добавить следующий код wv.getSettings().setGeolocationEnabled(true); wv.setWebChromeClient(new WebChromeClient(){ @Override public void onGeolocationPermissionsShowPrompt(String origin, Callback callback) { callback.invoke(origin, true, false); } }); В модуле FMX.WebBrowser.Android.pas это выглядит так constructor TAndroidWebBrowserService.Create; var LayoutParams: JRelativeLayout_LayoutParams; begin FWebView := TJWebBrowser.JavaClass.init(TAndroidHelper.Activity); FWebView.getSettings.setJavaScriptEnabled(True); FListener := TWebBrowserListener.Create(Self); FWebView.SetWebViewListener(FListener); FFocusChangeListener := TFocusChangeListener.Create(Self); FWebView.setOnFocusChangeListener(FFocusChangeListener); FWebView.getSettings.setGeolocationEnabled(True); FWebView.getSettings.setAppCacheEnabled(True); FWebView.getSettings.setDatabaseEnabled(True); FWebView.getSettings.setDomStorageEnabled(True); FWebView.getSettings.setBuiltInZoomControls(True); FWebView.getSettings.setDisplayZoomControls(False); FWebViewContainer := TJRelativeLayout.JavaClass.init(TAndroidHelper.Context); FChildrenContainer := TJRelativeLayout.JavaClass.init(TAndroidHelper.Context); LayoutParams := TJRelativeLayout_LayoutParams.JavaClass.init(TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT, TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT); FWebViewContainer.addView(FWebView, LayoutParams); LayoutParams := TJRelativeLayout_LayoutParams.JavaClass.init(TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT, TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT); FWebViewContainer.addView(FChildrenContainer, LayoutParams); SetEnableCaching(True); end; Вот суть вопроса - добавить delphi код. Пробую что то вот такое, но закончить ума не хватает constructor TAndroidWebBrowserService.Create; var LayoutParams: JRelativeLayout_LayoutParams; begin FWebView := TJWebBrowser.JavaClass.init(TAndroidHelper.Activity); FWebView.getSettings.setJavaScriptEnabled(True); FListener := TWebBrowserListener.Create(Self); FWebView.SetWebViewListener(FListener); FFocusChangeListener := TFocusChangeListener.Create(Self); FWebView.setOnFocusChangeListener(FFocusChangeListener); FWebView.getSettings.setGeolocationEnabled(True); FWebView.setWebChromeClient( TJWebChromeClient.Create.onGeolocationPermissionsShowPrompt( origin: JString; callback: JGeolocationPermissions_Callback);..... FWebView.getSettings.setAppCacheEnabled(True); FWebView.getSettings.setDatabaseEnabled(True); FWebView.getSettings.setDomStorageEnabled(True); FWebView.getSettings.setBuiltInZoomControls(True); FWebView.getSettings.setDisplayZoomControls(False); FWebViewContainer := TJRelativeLayout.JavaClass.init(TAndroidHelper.Context); FChildrenContainer := TJRelativeLayout.JavaClass.init(TAndroidHelper.Context); LayoutParams := TJRelativeLayout_LayoutParams.JavaClass.init(TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT, TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT); FWebViewContainer.addView(FWebView, LayoutParams); LayoutParams := TJRelativeLayout_LayoutParams.JavaClass.init(TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT, TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT); FWebViewContainer.addView(FChildrenContainer, LayoutParams); SetEnableCaching(True); end;
  22. Стало гораздо-гораздо лучше. Больше 70% не грузит ядро. Может математику вычислений попробовать на другое ядро повесить, чтоб совсем хорошо было? И очень интересно на исходники взглянуть. Это возможно?
  23. Жрет проц не меньше первой версии. Еще заметил - если дать приложению побыть запущенным несколько минут, то изменение размеров становится почти не возможным, торможение увеличивается на порядок.
  24. Подобные задачи я решаю обычно следующим способом: 1. Разделяю приложение на две части: интерфейс и класс обеспечивающий непосредственно работу с внешним сервером. 2. Класс обеспечивает доступ к высокоуровневым методам управления со стороны интерфейса (т.е. интерфейс должен сказать классу - включи лампочку в туалете, а класс уже обеспечивает всю низкоуровневую работу, проверку состояния, отправку последовательности команд и т.д.). Класс можно сделать в контексте основного потока главной формы. 3. У класса должен быть потомок-поток, который обеспечивает непосредственно работу с TCP, обрабатывает полученные результаты и отдает классу-родителю ответы. Общение между классом и потоком лучше организовать по следующей схеме: 1. Из класса в поток - потоко-безопасная очередь TThreadQueue передающая Record к примеру такого вида TCommandRecord = Record CommandName : String; // или Integer Address : String; Command : TArray<Byte>; Parameter : TArray<Byte>; Error : Boolean; ErrorMessage : String; Result : TArray<Byte>; // или String UID : Integer; end; Это для примера. В реальности вам придется что то убрать, что то добавить. 2. Из потока в класс можно сделать или очередь TThreadQueue, или Event. Для вашего случая, обеспечения потока команд я бы следующую систему - у класса сделать список командных очередей TList. Перед началом отсылки команд, создаем очередь команд TQueue<TCommandRecord>, заполняем очередь из некоего шаблона (первая команда тип устройсва, вторая команда установка, третья команда старт и т.д.) и отдаем эту очередь в работу. Система отправляет из очереди первую команду в поток (снабженную идентификаторм очереди), поток отправляет ее в сеть, получает ответ, заполняет TCommandRecord (сохраняя идентификатор очереди) и отдает TCommandRecord в класс. Класс, по идентификатору находит нужную очередь, проверяет отсутствие ошибок и оправляет следующую команду из этой очереди.. Когда очередь команд пуста, удаляем ее из списка очередей. Вот как то так.
×
×
  • Создать...