Как из Аndroid запустить JavaScript с запросом к Yandex.картам?
У меня есть GPS-координаты точек маршрута.
Нужно по ним вычислить длину и продолжительность маршрута.
Это можно сделать с помощью javascript-кода: сделать запрос к API Yandex.карт, пример здесь: https://yandex.ru/dev/maps/jsapi/doc/2.1/dg/concepts/router/multiRouter.html/#multiRouter__get-active-route
Я нашел способ запускать javascript-код из Android-а с помощью WebView: разместил на форме WebView с JavaScript-кодом, при загрузке WebView запускается javascript, запрос нормально отрабатывает.
Но я не нашёл способ передачи параметров (gps-координат) в JavaScript и взятия response-а сервера (response просто выводится в консоль).
Еще пытался запускать JavaScript-код через okhttp, но так и не понял можно ли это сделать.
Собственно вопрос:
- Как передать параметры в JavaScript?
- Как получить response сервера (при выполнении javascript-а)?
Код в xml-файле:
<WebView
android:id="@+id/web_view"
android:layout_width="match_parent"
android:layout_height="100dp"
app:layout_constraintTop_toTopOf="parent"
>
</WebView>
код во фрагменте:
web_view.settings.javaScriptEnabled = true
web_view.loadUrl("file:///android_asset/www/index.html")
файл assets/www/index.html:
<meta charset="utf-8">
<script src="https://api-maps.yandex.ru/2.1/?apikey=20cdc3d8-1eb7-4f99-839d-f2bf9456b2c1&lang=ru_RU" type="text/javascript"></script>
<div id="map" style="width:450px;height:300px"></div>
<script src="app.js"></script>
файл assets/www/app.js:
ymaps.ready(function () {
var myMap = new ymaps.Map('map', {
center: [55.753994, 37.622093],
zoom: 9,
controls: []
});
// Создание маршрута.
var multiRoute = new ymaps.multiRouter.MultiRoute({
referencePoints: [
[55.734876, 37.59308],
[55.761184, 37.57850]
]
}, {
boundsAutoApply: true
});
// Добавление маршрута на карту.
myMap.geoObjects.add(multiRoute);
// Подписка на событие обновления данных маршрута.
multiRoute.model.events.add('requestsuccess', function() {
// Получение ссылки на активный маршрут.
// В примере используется автомобильный маршрут,
// поэтому метод getActiveRoute() вернет объект multiRouter.driving.Route.
var activeRoute = multiRoute.getActiveRoute();
// Вывод информации о маршруте.
console.log("Длина: " + activeRoute.properties.get("distance").text);
console.log("Время прохождения: " + activeRoute.properties.get("duration").text);
// Для автомобильных маршрутов можно вывести
// информацию о перекрытых участках.
if (activeRoute.properties.get("blocked")) {
console.log("На маршруте имеются участки с перекрытыми дорогами.");
}
});
// Добавление маршрута на карту.
myMap.geoObjects.add(multiRoute);
});