Почему не рисуется маршрут в google maps direction api?
Я пытаюсь нарисовать маршрут между двумя координатами. Проект состоит из нескольких фрагментов, когда фрагмент с картой загружается, по координатам сразу должен отрисоваться маршрут.
fun setLatLng(origin: LatLng, destination: LatLng){
Log.d(TAG, "setLatLng: получение From: $origin, To: $destination")
this.origin = origin
this.destination = destination
val url: String = getDirectionsUrl(origin, destination)!!
val downloadTask = DownloadTask()
downloadTask.execute(url)
}
@Throws(IOException::class)
private fun downloadUrl(strUrl: String): String?{
var data = ""
var iStream: InputStream? = null
var urlConnection: HttpURLConnection? = null
try {
val url = URL(strUrl)
urlConnection = url.openConnection() as HttpURLConnection
urlConnection.connect()
iStream = urlConnection!!.inputStream
val br = BufferedReader(InputStreamReader(iStream))
val sb = StringBuffer()
var line: String? = ""
while (br.readLine().also { line = it } != null){
sb.append(line)
}
data = sb.toString()
br.close()
}catch (e: java.lang.Exception){
Log.d(TAG, "downloadUrl: ${e.toString()}")
}finally {
iStream!!.close()
urlConnection!!.disconnect()
}
return data
}
private fun getDirectionsUrl(origin: LatLng, dest: LatLng): String? {
val str_origin =
"origin=" + origin.latitude.toString() + "," + origin.longitude
val str_dest =
"destination=" + dest.latitude.toString() + "," + dest.longitude
val key = "key=$apiKey"
val parameters = "$str_origin&$str_dest&$key"
val output = "json"
return "https://maps.googleapis.com/maps/api/directions/$output?$parameters"
}
inner class DownloadTask: AsyncTask<String?, Void?, String?>(){
override fun onPostExecute(result: String?) {
super.onPostExecute(result)
val parserTask = ParserTask()
parserTask.execute(result)
}
override fun doInBackground(vararg url: String?): String? {
var data = ""
try{
data = downloadUrl(url[0].toString()).toString()
}catch (e: Exception){}
return data
}
}
inner class ParserTask: AsyncTask<String?, Int?, List<List<HashMap<String, String>>>?>(){
override fun doInBackground(vararg jsonData: String?): List<List<HashMap<String, String>>>? {
val jObject: JSONObject
var routes: List<List<HashMap<String, String>>>? = null
try{
jObject = JSONObject(jsonData[0])
val parser = DataParser()
routes = parser.parse(jObject)
}catch (e: java.lang.Exception){
e.printStackTrace()
}
return routes
}
override fun onPostExecute(result: List<List<HashMap<String, String>>>?) {
val points = ArrayList<LatLng?>()
val lineOptions = PolylineOptions()
for(i in result!!.indices){
val path = result[i]
for (j in path.indices){
val point = path[j]
val lat = point["lat"]!!.toDouble()
val lng = point["lng"]!!.toDouble()
val position = LatLng(lat, lng)
points.add(position)
}
lineOptions.addAll(points)
lineOptions.width(8f)
lineOptions.color(Color.RED)
lineOptions.geodesic(true)
}
if (points.size != 0) mMap.addPolyline(lineOptions)
builder()
}
}
Рисовать маршрут должна функция onPostExecute. Если в режиме дебага поставить на функию точку, то приложение не останавлиется, но, судя по тому, что срабатывает метод builder в конце функции, сама функия срабатывает.
Ответы (1 шт):
Автор решения: lian. lun
→ Ссылка
Написал дополнительные логи, обнаружилось, что при отправке url запроса приходил ответ
this ip, site or mobile application is not authorized to use this api key. request received from ip address ..., with empty referer
Помогла замена API ключа