Перейти к содержанию
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. 3 часа назад, Letos сказал:

    Была такая приставка Famicom (Dendy). Процессор...  если не Z80, то не многим сильнее (или слабее). Был советский компьютер Вектор 06-Ц - проц ещё медленнее. И т.п. Но аппаратный сколлинг там был реализован. Те процессоры бы явно не потянули, если бы делали скроллинг они. Так что за магия?

    Тогда все было несколько проще - видеопамять была просто частью оперативной памяти, и видеокарта просто отрисовывала на экране содержимое памяти начиная с заданного адреса. 1 байт = 1 пиксел. Ширина экрана 320 пикселей. Вы говорили видеокарте установить смещение в 1000 байт и она отрисовыла все начиная с тысячного байта. Потом вы устанавливали смещение видеобуфера в 1320 байт (+1 строка) - и вот уже кадр на экране сместился на 1 пиксель выше. Повторяем на каждый тик - и у вас картинка скроллится снизу вверх.

    Сейчас у видеокарт все организованно сложнее, но принимая во внимание их безумную производительность, вы можете 50 раз в секунду рисовать абсолютно новую картинку. Но рисовать приходится каждый кадр с нуля. И только заслуга программистов что вы видите скроллы, коридоры, бегущих монстров и т.д. Естественно все это рисуется с помощью специальных интерфейсов взаимодействия с GPU (CUDA, Vulkan, OpenCL).

    Для вашей задачи вы вполне можете использовать эти мощнейшие механизмы - грузить в видеопамять картинки (текстуры), аппаратно натягивать их на плоскость, аппаратно скроллить эту плоскость. Все инструменты для этого есть в стандартной палитре компонентов Delphi.

  3. В 07.03.2019 в 18:35, Letos сказал:

    Игрушку не пишу , пишу приложение для диспетчера троллейбусного депо, где двигается карта мышью, и где, в принципе тот, метод, что привёл я, работает, и фризы почти не заметны (ибо, при скроллировании карты мышью задачи плавного скроллинга не стоит - всё равно не заметно). Но такое впечатление, что этот метод не самый быстрый. (Ну да, так же, хотелось бы владеть инструментом, чтобы можно было и игрушку написать.)

    Может вам пойти простым путем - написать web-приложение (карта OpenStreetMap, маркеры на карте, немного JS). Все будет в браузере, плавно. При желании сможете засунуть все это в приложение, загрузив в TWebBrowser. Со своим советом я исходил их предположения что вам нужна карта и двигающиеся по ней картинки троллейбусов ?

  4. 3 часа назад, Bob32 сказал:

    Библиотека компонентов = недетская! и цена вполне вменяемая.

    Минуточку, а что это фактически означает - допустим я покупаю хостинг на myclouddata, покупаю компоненты в этом пакете (включая ту, которая нужна для доступа на myclouddata) - и что, мне не надо париться со всяким огородом по получению доступа через rest/json ?

    что ты получаешь вместе с этой компонентой?

    Соблазн велик! Но не поддавайтесь ереси! ? Ну или поддавайтесь ? 

    Сделав все самостоятельно, вы не только сэкономите деньги, но и получите бесценный опыт. И получите площадку для сотен приложений. Тот же myclouddata очень ограничен - бесплатный аккаунт 1000 записей в таблице это ниочем. Да и платный с миллионом записей тоже не поражает воображение. Одно из моих приложений за пару лет накидало в таблицу с регистрациями FCM 600 тысяч записей. Так что вы (или заказчик приложения) может упереться в ограничение в самый неподходящий момент и придется судорожно искать другой сервис. 

  5. 2 часа назад, Barbanel сказал:

    То что нужно, респектищще!!!

    Я не силен в php, но меня этот момент смущает:

    В случае реально большого файла (пару гигабайт), не вылетит ли скрипт с превышением времени выполнения?
    Раньше для выполнения php скриптов был таймаут в 30 сек по дефолту, и если скрипт выполнялся более 30 сек то генерировалась ошибка и клиент получал эту ошибку.
    Как будет в этом случае?

    Или этот скрипт не рассчитан на большие бинарники?
    Заранее спасибо!

    Вы всегда можете изменить max_execution_time (равный по умолчанию 30 сек) в runtime :

    ini_set('max_execution_time', '3600');

     

  6. 1 час назад, Barbanel сказал:

    Евгений, спасибо за хостера!
    Мучаюсь примерно такими же размышлениями как и топикстартер. В смысле, хостер + скрипты + передача данных для (в теории) дофига клиентов.

    Заодно вопрос по JSON. Сегодня это почти де-факто стандарт обмена текстовыми данными. А вот каким образом будет лучше всего передавать с сервера на клиент изображения или бинарные данные? Вернее, что сейчас является наиболее общепринятым способом?
    Мысли такие:
    1) генерировать прямую ссылку
    2) кодировать в Base64 и передавать прямо в тексте JSON
    3) Для передачи больших данных - извращаться с FTP (звучит бредово, но такая мысль проскальзывала)
    4) ???

    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, смотря что вы запрашивали.
     

  7. 1. Хостинг рекомендую https://masterhost.ru/service/hosting/individual/ , это один из старейших и надежнейших хостеров России, там вы получите сразу все вам необходимое - MySQL, PHP любимой версии, если проект попрет, то сможете добавлять процессоры, память и т.д. Так же сможете зарегить домен под это дело, и при надобности получить SSL сертификат на этот домен. Все остальные хостинги  игнорируйте, по крайней мере Российские. За почти 20 лет использования, мастерхост ни разу не подвел, а только радовал новыми плюшками.

    image.thumb.png.f48d34640a05c0ed4ba428de3d6dccf4.png

    Реализация в вашем случае примерно такая:

    1. MySQL на хостере - обеспечит вам работу и 10 миллионов активных пользователей. Но важно правильно  спланировать структуру базы, структуру таблиц и структуру индексов таблиц. Если вы в этом не профи, то лучше нанять профи - ибо это фундамент, который потом очень сложно будет изменить.

    2. PHP на хостере - прокладка между базой и запросами/ответами приложения. Рекомендую использовать самую свежую версию PHP, чтоб потом не пришлось перекраивать код удаляя deprecated функции и конструкции.

    3. Протокол обмена - REST. Не вздумайте погружаться в теорию, читать про RESTful и пытаться реализовывать, этим занимаются только люди под тяжелыми наркотиками и обычно без единого законченного реального проекта. Достаточно того что приложение будет отправлять на сервер GET запросы получать JSON ответы. Можете подогнать протокол под существующие в Delphi компоненты TRESTClient, а можете и сами на стороне приложения разгребать JSON и получать нужные данные. Это совсем не сложно.

    4. Приложение - посылает на сервер HTTP GET (ну или POST) запросы посредством THTTPClient, получает ответы в виде JSON, парсит их и так далее. Все содержимое предыдущего предложения - в отдельном потоке. Ну или используйте готовый TRESTClient - если готовы разбираться в нюансах его работы.

    Вот как то так.

  8. В 14.03.2019 в 22:18, Avg сказал:

    Доброго времени суток и мое почтение Всем, кто хоть чем то может помочь!)

    [Android-iOS-Delphi]

    Кто в теме,, нет никакой четкой информации ни у разработчика,  ни на форумах.

    Во всех мобильных браузерах html-ссылки  типа  <span><a a href=tel:+7999xxx>8888</a></span>, а также почты, ватсап и тд, корректно работают.

    Вопрос тривиальный, что тут нужно исполнить, что бы моб.устройство при нажатии на такую ссылку в TWebBrowser  в открытом html(php), вставляло номер телефона в набор, сообщение ват сап-в приложение, и.тд., Options, код или что то еще??? 

    Вам нужно перехватывать события браузера

    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;

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

  9. 2 часа назад, Alexey Shumkin сказал:

    проблема и условия её возникновения описаны в первом сообщении ))
    встроенный браузер не использует разрешения приложения

    кстати, тут есть момент:
    если мы, например, запретим приложению использовать геолокацию, а браузеру в данном исполнении, получается, безусловно разрешаем )) неувязочка... это надо проверить )))
    вероятно, надо сложнее логику делать )

    Я проверил. После патча все работает как задумано, браузер наследует разрешения приложения:

    • Если приложению правильно даны разрешения на геолокацию, то браузер разрешения не спрашивает, геолокация нормально работает в браузере.
    • Если пользователь не дал приложению разрешение на геолокацию, то в браузере она тоже работать не будет, причем браузер и не будет сообщать о том что нет разрешения - при тыке на кнопку мое положение ничего не происходит. Это вполне нормально - пользователь сознательно отказался и понимает что геолокация работать не будет.

    Приложение, если пользователь не дал разрешение, и не должно по идее открывать браузер, если геолокация важная составляющая сервиса. У меня к примеру выдается сообщение - мол вы не дали разрешение, приложение работать не может. И по идее нужно предлагать пользователю открыть настройки для того чтоб он дал разрешение. Кстати в каком то приложении видел что по кнопке открываются настройки приложений - удобно, но как интересно это сделать?

     

  10. 19 минут назад, #WAMACO сказал:

    ДА! В конце в концов! Выложите готовое решение! :))

    Полностью готовое и верное решение тут https://gist.github.com/ashumkin/3e2e213d657162ae26d364a85c64b472 

    Главное правильно в батнике выставить все пути. 

    P.S. Давно бы уже эмба создала систему перекомпиляции прямо в среде, чтоб не мучаться с батниками в винде.

  11. 27 минут назад, Alexey Shumkin сказал:
    
    major version 52 is newer than 51, the highest major version supported by this compiler.
      It is recommended that the compiler be upgraded.

    это, вроде, убирается  by
     

    
    javac -source 1.7 -target 1.7 ...


    похоже, либы в android.jar скомпилены Java 7,  а тут Java 8
     

    Бедные программисты java, сколько странных и не очевидных нюансов ((( 

    А для release достаточно поменять пути? Никаких дополнительных опций не нужно?

  12. 9 минут назад, Alexey Shumkin сказал:

    ну тут опечатался

    всё вам на блюдечке надо...
     

    свяжи воедино

    с ошибками вида
     

    
    com\embarcadero\firemonkey\webbrowser\OnWebViewListener.java:3: error: package android.graphics does not exist
    

     

    Где моё блюдечко!!! И чтоб с голубой каёмочкой!!! ? Просто никогда с этим не связывался, да и времени погружаться в нюансы просто нет ( 

    Связал. Мой косяк. Дебильный путь от Эмбы сбил с толку. Вот первый раз решил 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%)

    И в конце приз - все заработало! Геолокация в браузере работает. Браузер даже не спросил разрешения на геолокацию - в приложении разрешения есть, и как я понимаю теперь браузер использует разрешения приложения. 

  13. 9 минут назад, Alexey Shumkin сказал:

    читал её текст?
    а коли приводишь лог вызова, весь приводи

    но подозреваю, что тебе надо задать set BDS=
    в правильное значение (у меня 32-битная ОС, у тебя наверняка 64-битная, и путь к Делфи отличается от твоего)

    Вот батник:

    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

     

  14. Только с 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

     

  15. Простое приложение для андроид - форма, на ней 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;

     

  16. 1 час назад, krapotkin сказал:

    Спасибо всем кто откликнулся!

    Прочистил все))  производительность вернулась в норму. Счетчики в верхней панели 

    Прокрутка гладкая. в примере 8 итемов раскопированы 200 раз.

    Средняя затрата времени на один Item - 0.2 мсек

     

     

     

    Screenshot_2019-03-13-18-03-08-864_ru.krapotkin.ListViewTest.png

    QIP Shot - Screen 211.png

    ListViewTest3.7z

    Стало гораздо-гораздо лучше. Больше 70% не грузит ядро. Может математику вычислений попробовать на другое ядро повесить, чтоб совсем хорошо было? 

    И очень интересно на исходники взглянуть. Это возможно?

  17. 51 минуту назад, krapotkin сказал:

    вторая версия демо

    -работа над ошибками

    -устранил утечки памяти

    -расширил функционал

    -добавил картинки

    -совместимость с Android

    Приложил EXE и APK

    Скорее всего, для 100500 записей не потянет, т.к. слишком много арифметики для раскладки каждого элемента на каждом итеме, но для сотни - хватает.

    ListViewTest2.7z

    pasFiles.rar

    Жрет проц не меньше первой версии. Еще заметил - если дать приложению побыть запущенным несколько минут, то изменение размеров становится почти не возможным, торможение увеличивается на порядок.

    image.thumb.png.b2736e8abf7e6d9c3b0cac3ef52be7e1.png

  18. 13 минут назад, gonzales сказал:

    Спасибо за поддержку!

    Суть в следующем,

    есть сервер (самописный TCP), крутится на микроконтроллере, есть клиенты (в основном Android, iOS). К серверу подключен ряд устройств. Клиенты управляют сервером посредством управляющих команд (конфигурируют устройства, настраивают логику работы и т.д), и получают ответы об изменениях в устройствах. Был разработан некий универсальный протокол общения (id адресата, id отправителя, id команды, параметры) в 15 байт. То есть клиент посылает пакет в 15 байт, и сервер отвечает пакетом в 15 байт. На текущий момент есть около 100 команд для общения. Например для конфигурирования устройства я посылаю команду с указанием типа устройства, после получения положительного ответа, посылаю команду с уставкой, после получения ответа посылаю команду на старт, и так далее. Также сервер рассылает информацию клиентам об изменениях в устройствах. В общем все работает в одном потоке, но если какое-то из устройств не ответит вовремя, то возникает задержка, из-за чего хочется запихнуть все общение на клиенте в поток. 

    Надеюсь понятно расписал, но мог что-то уточнить.  

    Подобные задачи я решаю обычно следующим способом:

    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 в класс. Класс, по идентификатору находит нужную очередь, проверяет отсутствие ошибок и оправляет следующую команду из этой очереди.. Когда очередь команд пуста, удаляем ее из списка очередей.

    Вот как то так. 

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