About Android; Geocoder, “the service is not available”

The documentation states : The Geocoder class requires a backend service that is not included in the core android framework, how/where can I obtain such a service?
It seems It's a bug in the emulator for 2.2 and there is a bug fix about it, for details see http://code.google.com/p/android/issues/detail?id=8816

I have found a workaround to the issue. I used the standard google api: http://code.google.com/apis/maps/documentation/geocoding/

I have created a method that received a String address like "220+victoria+square" and returns a JSONObject with the response of the HTTP Call
public static JSONObject getLocationInfo(String address) {

		HttpGet httpGet = new HttpGet("http://maps.google.
				+ "com/maps/api/geocode/json?address=" + address
				+ "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();
		try {
			jsonObject = new JSONObject(stringBuilder.toString());
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return jsonObject;
	}

After executing this, another method converts that JSONObject into a GeoPoint.
public static GeoPoint getGeoPoint(JSONObject jsonObject) {

		Double lon = new Double(0);
		Double lat = new Double(0);

		try {

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

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

		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return new GeoPoint((int) (lat * 1E6), (int) (lon * 1E6));

	}

However this solution is extremely nasty and coupled..
PS. you should add
<uses-library android:name="com.google.android.maps"></uses-library>
to AndroidManifest.xml or application could not find GeoPoint class.

你可能感兴趣的:(android,json,xml,Google)