Kotlin 中的距离矩阵请求 Android

Distance Matrix Request in Kotlin Android

我在这里没有找到任何类似的东西,所以我提出了这个问题。 如何向 Distance Matrix 发送 GET 请求 像这样:

https://maps.googleapis.com/maps/api/distancematrix/json?origins=&destinations=&units=metric&key=

并获得 JSON 结果

我试过这个但是应用程序在使用时死机了:

    val url = URL("https://maps.googleapis.com/maps/api/distancematrix/json?origins=$origen&destinations=$destino&units=metric&key=KEY")


    with(url.openConnection() as HttpURLConnection) {
        setRequestProperty("Accept","application/json")
        requestMethod = "GET"
        println("\nSent 'GET' request to URL : $url; Response Code : $responseCode")

        inputStream.bufferedReader().use {
            it.lines().forEach { line ->
                println(line)
            }
        }

    }

非常感谢!

编辑 单击自动完成时调用 myFunction 时的错误日志

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.x.y, PID: 7168
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1316088539, result=-1, data=Intent { (has extras) }} to activity {com.x.y/com.x.y.MainActivity}: android.os.NetworkOnMainThreadException
    at android.app.ActivityThread.deliverResults(ActivityThread.java:4901)
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:4942)
    at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2069)
    at android.os.Handler.dispatchMessage(Handler.java:107)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7417)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:980)
 Caused by: android.os.NetworkOnMainThreadException
    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1565)
    at com.android.org.conscrypt.Platform.blockGuardOnNetwork(Platform.java:430)
    at com.android.org.conscrypt.ConscryptEngineSocket$SSLOutputStream.writeInternal(ConscryptEngineSocket.java:666)
    at com.android.org.conscrypt.ConscryptEngineSocket$SSLOutputStream.access0(ConscryptEngineSocket.java:625)
    at com.android.org.conscrypt.ConscryptEngineSocket.drainOutgoingQueue(ConscryptEngineSocket.java:594)
    at com.android.org.conscrypt.ConscryptEngineSocket.close(ConscryptEngineSocket.java:489)
    at com.android.okhttp.internal.Util.closeQuietly(Util.java:91)
    at com.android.okhttp.internal.http.StreamAllocation.deallocate(StreamAllocation.java:258)
    at com.android.okhttp.internal.http.StreamAllocation.connectionFailed(StreamAllocation.java:295)
    at com.android.okhttp.internal.http.HttpEngine.close(HttpEngine.java:469)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:513)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:411)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:542)
    at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getResponseCode(DelegatingHttpsURLConnection.java:106)
    at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:30)
    at com.x.MainActivity.myfunction(MainActivity.kt:127)
    at com.x.y.MainActivity$onCreate.onPlaceSelected(MainActivity.kt:91)
    at com.google.android.libraries.places.widget.AutocompleteSupportFragment.onActivityResult(com.google.android.libraries.places:places@@2.5.0:6)
    at androidx.fragment.app.FragmentManager.onActivityResult(FragmentManager.java:2905)
    at androidx.fragment.app.FragmentManager.onActivityResult(FragmentManager.java:2885)
    at androidx.activity.result.ActivityResultRegistry.doDispatch(ActivityResultRegistry.java:392)
    at androidx.activity.result.ActivityResultRegistry.dispatchResult(ActivityResultRegistry.java:351)
    at androidx.activity.ComponentActivity.onActivityResult(ComponentActivity.java:647)
    at androidx.fragment.app.FragmentActivity.onActivityResult(FragmentActivity.java:164)
    at android.app.Activity.dispatchActivityResult(Activity.java:8125)
    at android.app.ActivityThread.deliverResults(ActivityThread.java:4894)
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:4942) 
    at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2069) 
    at android.os.Handler.dispatchMessage(Handler.java:107) 
    at android.os.Looper.loop(Looper.java:214) 
    at android.app.ActivityThread.main(ActivityThread.java:7417) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:980) 

单击自动完成时调用 myFunction 时的错误日志

已解决! 我 post 如果有人需要解决方案

    val origen = "36.000001"
    val destino = "120.000001"

    val urlMap = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=$origen&destinations=$destino&units=metric&key=YOUR_API_KEY"
    val request = Request.Builder()
        .url(urlMap)
        .build()
    client.newCall(request).enqueue(object : Callback {
        override fun onFailure(call: Call, e: IOException) {
            e.printStackTrace()
        }

        override fun onResponse(call: Call, response: Response) {
            response.use {
                if (!response.isSuccessful) throw IOException("Unexpected code $response")

                var json = JSONObject(response.body!!.string())
                val rows = json["rows"] as JSONArray
                val elements = rows[0] as JSONObject
                val distance = elements["elements"] as JSONArray
                val distanceArray = distance[0] as JSONObject
                val distanceData = distanceArray["distance"] as JSONObject

                val dist = distanceData["value"].toString().toDouble()
                val distKm = (dist/1000)

                if (distKm != null) {

                    val textview: TextView = findViewById(R.id.textview)
                    textview(Runnable { textview.setText(distKm.toString()) })

                }


            }
        }
    })