Обратное геокодирование не работает, возвращает IOException и NullPointerException

Я получаю широту и долготу, но не могу выполнить обратное геокодирование, я видел так много руководств, и они работают правильно, а мой нет!

Вот мой код:

    if (mLastLocation != null) {
        double latitude = mLastLocation.getLatitude();
        double longitude = mLastLocation.getLongitude();
        txtCoordinates.setText(latitude + " / " + longitude);


        Geocoder geoCoder = new Geocoder(getBaseContext(), Locale.getDefault());
        try {
            List<Address> addresses = geoCoder.getFromLocation(latitude, longitude, 1);

            String strCompleteAddress= "";
            if (addresses.size() > 0)
            {
                for (int i=0; i<addresses.get(0).getMaxAddressLineIndex();i++)
                    strCompleteAddress+= addresses.get(0).getAddressLine(i) + "\n";
            }
            Log.i("MyLocTAG => ", strCompleteAddress);
            Toast.makeText(getBaseContext(), strCompleteAddress, Toast.LENGTH_LONG).show();
        }
        catch (IOException e) {
            Log.i("MyLocTAG => ", "this is the exception part");
            e.printStackTrace();
        }

Это мое IOException!

W/System.err: java.io.IOException: Timed out waiting for response from server
W/System.err:     at android.location.Geocoder.getFromLocation(Geocoder.java:136)
W/System.err:     at com.example.beultimate.location.MainActivity.displayLocation(MainActivity.java:136)
W/System.err:     at com.example.beultimate.location.MainActivity.onLocationChanged(MainActivity.java:227)
W/System.err:     at com.google.android.gms.internal.zzart$zzb$1.zza(Unknown Source:2)
W/System.err:     at com.google.android.gms.internal.zzart$zzb$1.zzs(Unknown Source:2)
W/System.err:     at com.google.android.gms.internal.zzaaz.zzb(Unknown Source:8)
W/System.err:     at com.google.android.gms.internal.zzaaz$zza.handleMessage(Unknown Source:14)
W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:106)
W/System.err:     at android.os.Looper.loop(Looper.java:164)
W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6494)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
W/System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
I/Choreographer: Skipped 300 frames!  The application may be doing too much work on its main thread.

У меня также есть другая версия этого кода, в которой я получаю nullpointerexception, потому что список пуст!


person Erika    schedule 22.02.2018    source источник
comment
Возможный дубликат Android Geocoder ведет себя по-разному на некоторых устройствах   -  person ישו אוהב אותך    schedule 26.02.2018


Ответы (2)


Иногда класс Geocoder не может возвращать значения, чтобы решить эту проблему, используйте

        //Get address from Google api
        //Log.e("Else","else");
        try {
            JSONObject jsonObj = getJSONfromURL("http://maps.googleapis.com/maps/api/geocode/json?latlng=" + latitude + ","
                    + longitude + "&sensor=true");// to getting address form latitude and longitude
            String Status = jsonObj.getString("status");
            if (Status.equalsIgnoreCase("OK")) {
                JSONArray Results = jsonObj.getJSONArray("results");
                JSONObject location = Results.getJSONObject(0);
                finalAddress = location.getString("formatted_address");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

Этот URL возвращает результат JSON.

person RoHiT    schedule 22.02.2018

Попробуйте что-то вроде этого:

public String getAddress(double lat, double lng) {
    Geocoder geocoder = new Geocoder(this, Locale.getDefault());
    try {
        List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);
        Address obj = addresses.get(0);
        return obj.getSubLocality();
    } catch (Exception e) {
        e.printStackTrace();
        Toast.makeText(this, "Could not get address, please try again later", Toast.LENGTH_SHORT).show();
        return null;
    }
}

Надеюсь, поможет!

person amit srivastava    schedule 22.02.2018