Dienst beim Aufrufen von geoCoder.getFromLocation() nicht verfügbar

Lesezeit: 8 Minuten

Ich weiß, dass der Google-Back-End-Dienst manchmal nicht verfügbar ist.

Daher könnte eine Lösung darin bestehen, eine Schleife zu durchlaufen, bis ich die Daten erhalte.

private class getLocationDetails extends AsyncTask<String, Void, String> {

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

        Log.d("looping", "" + count + "");
        count++;
        double lat = Double.parseDouble(params[0]);
        double lng = Double.parseDouble(params[1]);
        List<Address> addresses = null;
        try {

            Geocoder gCoder = new Geocoder(ImageAndLocationActivity.this,
                    Locale.getDefault());
            addresses = gCoder.getFromLocation(lat, lng, 1);
            Address addr = addresses.get(0);
            user_country = addr.getCountryName();
            user_city = addr.getLocality();
            user_district = addr.getSubAdminArea();

            if (user_city == null) {

                user_city = user_district;
            }
        } catch (Exception e) {

            Log.e("Exception in getLocationDetails - ", e.getMessage());
            return null;
        }

        return "";
    }

    @Override
    protected void onPostExecute(String result) {

        if (result != null) {

            Log.d("user_city = ", "" + user_city);
        } else {

            new getLocationDetails().execute(CurrentLat + "", CurrentLng
                    + "");
        }
    }

    @Override
    protected void onPreExecute() {

    }

    @Override
    protected void onProgressUpdate(Void... values) {

    }
}

Aber ich kann den Ort überhaupt nicht finden:

LogCat:

02-27 16:29:49.568: D/looping(10966): 110355
02-27 16:29:49.568: E/Exception in getLocationDetails -(10966): Service not Available
02-27 16:29:49.573: D/looping(10966): 110356
02-27 16:29:49.573: E/Exception in getLocationDetails -(10966): Service not Available
02-27 16:29:49.573: D/looping(10966): 110357
02-27 16:29:49.573: E/Exception in getLocationDetails -(10966): Service not Available

und natürlich habe ich alle erforderlichen Berechtigungen hinzugefügt:

<uses-permission android:name="android.permission.INTERNET" />

Ich probiere das an Samsung Galaxy Note GT-N7000 (Version 4.0.4)

Fehlen mir irgendwelche Einstellungen? Bezogen auf das Gerät oder die Anwendung ? Oder passiert das meistens? Wenn ja, gibt es eine bessere Lösung, um dies zu beheben?

Danke schön

  • Nein. Ich sehe seit einigen Minuten Ausfälle. Versuchen Sie, Ihr Gerät neu zu starten?

    – Reno

    27. Februar 13 um 11:36 Uhr

  • isPresent() kehrt zurück True stets. Und doch sagt es Service not available. Aber nach dem Neustart des Geräts funktioniert es einwandfrei. Seltsam. Wie soll ein User das wissen 🙁

    – Archie.bpgc

    27. Februar 13 um 12:03 Uhr

  • Gab es jemals eine bessere Lösung als einen Neustart? Ich habe das gleiche Problem. Beim Testen sind wir auf dieses Problem auf zwei Telefonen gestoßen, und ein Neustart behebt das Problem. Ich denke nicht, dass es eine sehr gute Lösung ist, den Benutzer dazu zu bringen, sein Telefon neu zu starten. Gibt es eine andere Objektalternative zum GeoCoder-Objekt?

    – JohnathanKong

    29. November 13 um 22:16 Uhr

  • @JohnathanKong Verwenden Sie dies http://maps.google.com/maps/api/geocode/json?address=" + address + "&ka&sensor=false als Rückfall

    – Archie.bpgc

    30. November 13 um 5:40 Uhr


Dienst beim Aufrufen von geoCodergetFromLocation nicht verfugbar
Reno

Der eigentliche Grund dafür Geocoder nicht funktioniert hat, weil die NetworkLocator wurde im Einsatz getötet. Wahrscheinlich aufgrund von weniger Speicher oder vielleicht haben Sie den Task-Manager verwendet, um alle Dienste zu beenden?

Ich bin mir nicht sicher, aber das ist eine Vermutung. Ich habe das schon einmal gesehen. Letztes Jahr habe ich einen Reconnect-Mechanismus geschrieben, um die NetworkLocator.apk zu laden und an die zu binden GeocoderService. Ich denke, diese Änderung wurde nicht in JellyBean übernommen, sodass dieses Problem weiterhin besteht.

Es kann nur durch Neustart gelöst werden. (Der NetworkLocationService wird beim Booten geladen)

Bearbeiten: Sie werden dieses Problem in JBP oder KK nicht sehen, dieser Dienst wird in die Playstore-App verschoben.

  • Bußgeld. Aber ich habe andere kartenbezogene Apps wie z Karten, Lokal..etc, Sie alle funktionierten gut. Kann daran liegen, dass ich Basic verwende android.location.Geocoder und sie könnten verwenden some google service libraries?? Wenn das der Fall ist, habe ich gerade angefangen zu verwenden google-play-services.jar unterstützt das solche Methoden? Danke schön

    – Archie.bpgc

    27. Februar 13 um 12:53 Uhr


  • Ich meine. wenn es ein Problem mit NetworkLocationService wie du gesagt hast. Die anderen kartenbasierten Apps müssen sich genauso verhalten haben

    – Archie.bpgc

    27. Februar 13 um 13:03 Uhr

  • Google Maps hat ein eigenes eingebautes NLS. Das war eines der ersten Dinge, die ich überprüft habe

    – Reno

    27. Februar 13 um 19:14 Uhr

  • wie kann ich das explizit abschalten NetworkLocator? Weil ich eine Problemumgehung für mein oben genanntes Problem habe. Das will ich jetzt testen. Kann den Fall aber nicht reproduzieren.

    – Archie.bpgc

    11. März 13 um 13:38 Uhr

  • Sie können dies reproduzieren, indem Sie laufende Dienste beenden (ich habe das Linux-cmd für das Beenden von Prozessen verwendet). Um den Netzwerkanbieter zu deaktivieren, können Sie in den Einstellungen zu den Ortungsdiensten gehen.

    – Reno

    12. März 13 um 5:10 Uhr

1644070446 105 Dienst beim Aufrufen von geoCodergetFromLocation nicht verfugbar
Mugen

Problemumgehung mit direktem Zugriff auf Google Maps:

    public static LatLng getLocationFromString(String address)
        throws JSONException {

    HttpGet httpGet = new HttpGet(
            "http://maps.google.com/maps/api/geocode/json?address="
                    + URLEncoder.encode(address, "UTF-8") + "&ka&sensor=false");
    HttpClient client = new DefaultHttpClient();
    HttpResponse response;
    StringBuilder stringBuilder = new StringBuilder();

    try {
        response = client.execute(httpGet);
        HttpEntity entity = response.getEntity();
        InputStream stream = entity.getContent();
        int b;
        while ((b = stream.read()) != -1) {
            stringBuilder.append((char) b);
        }
    } catch (ClientProtocolException e) {
    } catch (IOException e) {
    }

    JSONObject jsonObject = new JSONObject(stringBuilder.toString());

    double lng = ((JSONArray) jsonObject.get("results")).getJSONObject(0)
            .getJSONObject("geometry").getJSONObject("location")
            .getDouble("lng");

    double lat = ((JSONArray) jsonObject.get("results")).getJSONObject(0)
            .getJSONObject("geometry").getJSONObject("location")
            .getDouble("lat");

    return new LatLng(lat, lng);
}

    public static List<Address> getStringFromLocation(double lat, double lng)
        throws ClientProtocolException, IOException, JSONException {

    String address = String
            .format(Locale.ENGLISH,                                 "http://maps.googleapis.com/maps/api/geocode/json?latlng=%1$f,%2$f&sensor=true&language="
                            + Locale.getDefault().getCountry(), lat, lng);
    HttpGet httpGet = new HttpGet(address);
    HttpClient client = new DefaultHttpClient();
    HttpResponse response;
    StringBuilder stringBuilder = new StringBuilder();

    List<Address> retList = null;

    response = client.execute(httpGet);
    HttpEntity entity = response.getEntity();
    InputStream stream = entity.getContent();
    int b;
    while ((b = stream.read()) != -1) {
        stringBuilder.append((char) b);
    }

    JSONObject jsonObject = new JSONObject(stringBuilder.toString());

    retList = new ArrayList<Address>();

    if ("OK".equalsIgnoreCase(jsonObject.getString("status"))) {
        JSONArray results = jsonObject.getJSONArray("results");
        for (int i = 0; i < results.length(); i++) {
            JSONObject result = results.getJSONObject(i);
            String indiStr = result.getString("formatted_address");
            Address addr = new Address(Locale.getDefault());
            addr.setAddressLine(0, indiStr);
            retList.add(addr);
        }
    }

    return retList;
}

  • Danke, es hat das Problem mit meinem s3 mini gelöst, das sich weigerte, den Geocoder-Dienst zu verwenden. Aber es funktioniert nur, wenn es in einer asynchronen Aufgabe verwendet wird.

    – Ruocco

    23. Mai ’15 um 14:33 Uhr

Starten Sie das Gerät neu und das Problem wird behoben.

  • Bestätigt! Natürlich, falls der Backend-Dienst auf dem Gerät präsentiert wird – Geocoder.isPresent()

    – Максим Петлюк

    21. Februar 18 um 15:48 Uhr

1644070446 252 Dienst beim Aufrufen von geoCodergetFromLocation nicht verfugbar
Semashko

Die API löst eine Ausnahme „Dienst nicht verfügbar“ aus, wenn ein solcher Dienst auf dem Gerät nicht verfügbar ist. Methode verwenden isPresent() um die Existenz des Dienstes zu überprüfen.

Siehe auch: http://developer.android.com/reference/android/location/Geocoder.html

Die beste Lösung für dieses Problem besteht darin, dieselbe Klasse wie Google Geocoder zu verwenden, wenn der ursprüngliche Geocoder fehlschlägt

List<Address> addresses = null;    
Geocoder geocoder = new Geocoder(this);
addresses = geocoder.getFromLocation(...);
if (addresses == null || addresses.isEmpty())
addresses = MyGeocoder.getFromLocation(...);


import android.location.Address;
import android.util.Log;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.params.AllClientPNames;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

public class MyGeocoder {

    public static List<Address> getFromLocation(double lat, double lng, int maxResult) {

        String address = String.format(Locale.ENGLISH, "http://maps.googleapis.com/maps/api/geocode/json?latlng=%1$f,%2$f&sensor=false&language=" + Locale.getDefault().getCountry(), lat, lng);
        HttpGet httpGet = new HttpGet(address);
        HttpClient client = new DefaultHttpClient();
        client.getParams().setParameter(AllClientPNames.USER_AGENT, "Mozilla/5.0 (Java) Gecko/20081007 java-geocoder");
        client.getParams().setIntParameter(AllClientPNames.CONNECTION_TIMEOUT, 5 * 1000);
        client.getParams().setIntParameter(AllClientPNames.SO_TIMEOUT, 25 * 1000);
        HttpResponse response;

        List<Address> retList = null;

        try {
            response = client.execute(httpGet);
            HttpEntity entity = response.getEntity();
            String json = EntityUtils.toString(entity, "UTF-8");

            JSONObject jsonObject = new JSONObject(json);

            retList = new ArrayList<Address>();

            if ("OK".equalsIgnoreCase(jsonObject.getString("status"))) {
                JSONArray results = jsonObject.getJSONArray("results");
                if (results.length() > 0) {
                    for (int i = 0; i < results.length() && i < maxResult; i++) {
                        JSONObject result = results.getJSONObject(i);
                        //Log.e(MyGeocoder.class.getName(), result.toString());
                        Address addr = new Address(Locale.getDefault());
                        // addr.setAddressLine(0, result.getString("formatted_address"));

                        JSONArray components = result.getJSONArray("address_components");
                        String streetNumber = "";
                        String route = "";
                        for (int a = 0; a < components.length(); a++) {
                            JSONObject component = components.getJSONObject(a);
                            JSONArray types = component.getJSONArray("types");
                            for (int j = 0; j < types.length(); j++) {
                                String type = types.getString(j);
                                if (type.equals("locality")) {
                                    addr.setLocality(component.getString("long_name"));
                                } else if (type.equals("street_number")) {
                                    streetNumber = component.getString("long_name");
                                } else if (type.equals("route")) {
                                    route = component.getString("long_name");
                                }
                            }
                        }
                        addr.setAddressLine(0, route + " " + streetNumber);

                        addr.setLatitude(result.getJSONObject("geometry").getJSONObject("location").getDouble("lat"));
                        addr.setLongitude(result.getJSONObject("geometry").getJSONObject("location").getDouble("lng"));
                        retList.add(addr);
                    }
                }
            }


        } catch (ClientProtocolException e) {
            Log.e(MyGeocoder.class.getName(), "Error calling Google geocode webservice.", e);
        } catch (IOException e) {
            Log.e(MyGeocoder.class.getName(), "Error calling Google geocode webservice.", e);
        } catch (JSONException e) {
            Log.e(MyGeocoder.class.getName(), "Error parsing Google geocode webservice response.", e);
        }

        return retList;
    }
}

1644070447 440 Dienst beim Aufrufen von geoCodergetFromLocation nicht verfugbar
Jithu

Verwenden Sie diesen Trick.

Bearbeiten Sie einfach die project.properties

# Project target
target=Google Inc.:Google APIs:16

Der Grund dafür ist, dass die Geocoder-Klasse im Kern-Android-Framework vorhanden ist, aber vom Code abhängt, der von den Google-APIs bereitgestellt wird, um ordnungsgemäß zu funktionieren. Selbst wenn Ihr AVD die Google-APIs enthält, muss Ihr Projekt dennoch für dieses spezifische Build-Ziel erstellt werden.

Dienst beim Aufrufen von geoCodergetFromLocation nicht verfugbar
dnocode

Dienst nicht verfügbar – Geocoder Android Wenn ich diesen Fehler in einigen gekochten Roms erhalte, habe ich diese Bibliothek geschrieben, von der ich hoffe, dass sie nützlich sein könnte. https://github.com/dnocode/gapis

.

784080cookie-checkDienst beim Aufrufen von geoCoder.getFromLocation() nicht verfügbar

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy