因此geocoder.getFromLocationName返回NULL / USE JSONObject

时间:2018-11-18 19:17:11

标签: android google-maps google-places-api geocoding

好,所以我们确定GEOCODER在某些手机上不起作用

所以我喜欢一个叫@Filip的人的这种解决方案,这似乎是合法的解决方案

package com.something.something;

import android.os.AsyncTask;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;


public class GetLocationDownloadTask extends AsyncTask<String, Void, String> {

@Override
protected String doInBackground(String... strings) {

    String result = "";
    URL url;
    HttpURLConnection urlConnection;
    try {
        url = new URL(strings[0]);
        urlConnection = (HttpURLConnection) url.openConnection();
        InputStream is = urlConnection.getInputStream();
        InputStreamReader inputStreamReader = new InputStreamReader(is);

        int data = inputStreamReader.read();
        while(data != -1){
            char curr = (char) data;
            result += curr;
            data = inputStreamReader.read();
        }

        return result;

    } catch (Exception e) {
        e.printStackTrace();
    }

    return null;
}

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);

    if (result != null) {
        try {

            JSONObject locationObject = new JSONObject(result);
            JSONObject locationGeo = locationObject.getJSONArray("results").getJSONObject(0).getJSONObject("geometry").getJSONObject("location").getJSONObject("lat");




        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}
}

我必须通过以下编码从我的MapsActivity中运行它:

String searchString = mSearchText.getText().toString(); 

String link = "https://maps.googleapis.com/maps/api/geocode/json?address=" + 
searchString + "&key=MY API KEY";

    GetLocationDownloadTask getLocation = new GetLocationDownloadTask();

    getLocation.execute(link);

这很好,但是我不知道接下来会发生什么?我需要这些经纬度进一步处理,如何在执行(链接)后得到它们?

感谢您的帮助,这是令人难以置信的问题。地理编码需要一个后端,并且并非所有设备都支持。

1 个答案:

答案 0 :(得分:1)

  

这很好,但是我不知道接下来会发生什么?我需要这些经纬度进一步处理,如何在执行(链接)后得到它们?

好吧,您得到的结果是:JSONObject locationGeo,如果正确的类型,则使用getDouble来解析为double。实际上是在这条长线的末端查找其纬度,因此您也需要获得经度。您的进一步处理应在onPostExecute(在UI线程上调用)。

示例:

为了向您的活动提供lat,您应该将对它的引用传递给AsyncTask。

public class GetLocationDownloadTask extends AsyncTask<String, Void, 
String> {
    MapsActivity act;
    GetLocationDownloadTask(MapsActivity act) {
       this.act = act;
    }

然后在您onPostExecute中使用act就像这样:

@Override 受保护的void onPostExecute(字符串结果){     super.onPostExecute(result);

if (result != null) {
    try {

        JSONObject locationObject = new JSONObject(result);
        JSONObject locationGeo = locationObject.getJSONArray("results").getJSONObject(0).getJSONObject("geometry").getJSONObject("location").getJSONObject("lat");
        act.passLat(locationGeo.getDouble("Longitude")); // not sure if this is correct

然后在您的活动中执行正确的构造函数:

GetLocationDownloadTask getLocation = new GetLocationDownloadTask(this);

我建议在这里使用WeakReference来在AsyncTask中保留活动参考-但这是更高级的,我想您还没有。