【问题标题】:So geocoder.getFromLocationName returns NULL / USE JSONObject所以 geocoder.getFromLocationName 返回 NULL / USE JSONObject
【发布时间】:2018-11-18 19:17:11
【问题描述】:

好的,所以我们确定 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);

这一切都很好,但我不明白接下来会发生什么?我需要那些 lat lng 进一步处理,在 EXECUTING(link) 之后如何获取它们?

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

【问题讨论】:

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


    【解决方案1】:

    这一切都很好,但我不明白接下来会发生什么?我需要那些 lat lng 进一步处理,在 EXECUTING(link) 之后如何获取它们?

    好吧,你的结果是: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

    @覆盖 受保护的无效onPostExecute(字符串结果){ super.onPostExecute(结果);

    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);
    

    我建议在这里使用 Wea​​kReference 来保持 AsyncTask 中的活动引用 - 但这是更高级的,你不是在那之后 - 我想。

    【讨论】:

    • 谢谢你的回答,但我仍然需要处理 lat lng 例如我不能使用 JSONObject locationGeo 。 . . . getLocation.execute(链接); Toast.makeText(this, locationGeo, Toast.LENGTH_SHORT).show();
    • “我不能使用”是什么意思?
    • 我的意思是在执行 getLocation.execute(link); 后如何在我的 Activity 中调用“lat”值;
    • 我的问题还是没有找到答案,谁能帮帮我
    • @Naderco-jo 我已经更新了我的答案,实际上这是相反的 - 你从 onPostExecute 执行你的 Activity-s 方法 - 在这个方法的参数中你可以传递任何数据。
    猜你喜欢
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多