Таким образом, geocoder.getFromLocationName возвращает NULL / USE JSONObject - PullRequest
0 голосов
/ 18 ноября 2018

Хорошо, поэтому мы установили, что доза 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);

Это все хорошо, но я не понял, что будет дальше? Мне нужны эти последние для дальнейшей обработки, как я могу получить их после EXECUTING (ссылка)?

Любая помощь приветствуется, это ошеломляющая проблема. Геокодирование нуждается в бэкэнде, и не все устройства поддерживают.

1 Ответ

0 голосов
/ 18 ноября 2018

Это все хорошо, но что я не понял, что происходит дальше?Мне нужны эти последние для дальнейшей обработки, как мне их получить после ИСПОЛНЕНИЯ (ссылка)?

хорошо, вы получите результат: JSONObject locationGeo, используйте getDouble для анализа как удвоенное значение, еслиэто правильный тип.На самом деле, глядя в конце этой длинной линии на ее широту, поэтому вам также нужно получить долготу.Дальнейшая обработка должна быть в onPostExecute (он вызывается в потоке пользовательского интерфейса).

пример:

Чтобы предоставить lat своей деятельности, вы должны передать ссылку на нее в AsyncTask.:

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

Тогда в вас onPostExecute вы используете act следующим образом:

@ Переопределить защищенный 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");
        act.passLat(locationGeo.getDouble("Longitude")); // not sure if this is correct

затем внутри вашей деятельности выполните правильный конструктор:

GetLocationDownloadTask getLocation = new GetLocationDownloadTask(this);

Я бы предложил использовать здесь WeakReference, чтобы сохранить ссылку на активность в AsyncTask - но это более продвинутое, и вы не после этого - я полагаю,.

...