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

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.

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;
}
Starten Sie das Gerät neu und das Problem wird behoben.

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

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.

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
.
7840800cookie-checkDienst beim Aufrufen von geoCoder.getFromLocation() nicht verfügbaryes
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ückTrue
stets. Und doch sagt esService 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