我正在尝试使用"位置名称"在 MapView 中为一个位置设置动画。这是一个国家名称"。我得到了例外:
如果您无法看到图片,那么例外是:: IOException:服务不可用,错误无法获得连接工厂客户端。
我使用的代码如下:
public class ShowMapView extends MapActivity
{
MapView mapView;
MapController mapController;
String Country;
@Override
public void onCreate(Bundle bundleMap)
{
super.onCreate(bundleMap);
setContentView(R.layout.show_map);
mapView = (MapView)findViewById(R.id.MapView);
LinearLayout zoomLayout = (LinearLayout)findViewById(R.id.zoom);
View zoomView = mapView.getZoomControls();
zoomLayout.addView(zoomView,
new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
mapView.setBuiltInZoomControls(true);
Intent intent = this.getIntent();
Country = intent.getStringExtra("Country");
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
Log.v("GEOCODER", geocoder.toString());
try
{
Log.v("MAP", "TRY BLOCK");
List<Address> address = geocoder.getFromLocationName(Country, 2);
Log.v("MAP", "Country: " + Country);
if(address.size() > 0)
{
Log.v("MAP", "GeoPoint p");
GeoPoint p = new GeoPoint((int)(address.get(0).getLatitude() * 1E6),
(int)(address.get(0).getLongitude() * 1E6));
Log.v("MAP", "L&L done");
mapController.animateTo(p); Log.v("MAP", "Animate to P");
mapView.invalidate(); Log.v("MAP", "Invalidate()");
}
}
catch(IOException e)
{
Log.v("MAP", "CATCH BLOCK");
e.printStackTrace();
}
}
@Override
protected boolean isRouteDisplayed()
{
Log.v("MAP", "ROUTE: false");
return false;
}
}
清单文件如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.project.LawSource"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="10" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<uses-library android:name="com.google.android.maps"/>
<activity
android:name=".GetCountry"
android:label="@string/app_label" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="ShowMapView"
android:label="@string/app_name">
</activity>
</application>
</manifest>
我已根据this tutorial工作,但它无法正常工作。
如果我遗失了某些内容,请告诉我。
我遇到的问题与this blog
中的问题相同希望找到解决方案。
提前致谢,
HAPS。
答案 0 :(得分:5)
StackOverflow上关于该异常的许多帖子,例如:Service not Available - Geocoder Android。它根本不是您的代码的问题,Geocoder会根据服务器可用性不时抛出此异常。您需要处理该例外,可能会回到使用Google Places API,如以下评论所示:https://stackoverflow.com/a/9173488/429047
获得GeoPoint后,可以使用MapController.animateTo(Geopoint) - http://code.google.com/android/add-ons/google-apis/reference/com/google/android/maps/MapController.html
一个简单的例子:
清单:
<uses-sdk android:minSdkVersion="10" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<uses-library android:name="com.google.android.maps"/>
<activity
android:name=".TestGeocoderActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
main.xml中:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<com.google.android.maps.MapView
android:id="@+id/mapview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:apiKey="<YOUR API KEY HERE>"
android:clickable="true"
android:drawingCacheQuality="auto"
android:enabled="true" >
</com.google.android.maps.MapView>
</LinearLayout>
TestGeocoderActivity.java
package com.rd.TestGeocoder;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
import android.content.Intent;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.util.Log;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
public class TestGeocoderActivity extends MapActivity {
/** Called when the activity is first created. */
MapView mapView;
MapController mapController;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String country = "Australia";
mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
mapController = mapView.getController();
Intent intent = this.getIntent();
if (intent.getStringExtra("country") != null) {
country = intent.getStringExtra("country");
}
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
Log.v("GEOCODER", geocoder.toString());
try {
Log.v("MAP", "TRY BLOCK");
List<Address> address = geocoder.getFromLocationName(country, 2);
Log.v("MAP", "Country: " + country);
if (address.size() > 0) {
Log.v("MAP", "GeoPoint p");
GeoPoint p = new GeoPoint(
(int) (address.get(0).getLatitude() * 1E6),
(int) (address.get(0).getLongitude() * 1E6));
Log.v("MAP", "L&L done:"+p.toString());
mapController.animateTo(p);
Log.v("MAP", "Animate to P");
mapView.invalidate();
Log.v("MAP", "Invalidate()");
}
} catch (IOException e) {
Log.v("MAP", "CATCH BLOCK");
e.printStackTrace();
}
}
@Override
protected boolean isRouteDisplayed() {
Log.v("MAP", "ROUTE: false");
return false;
}
}
显然你需要更改包名并填写api密钥
答案 1 :(得分:2)
最后它起作用了,我能够动画到一个位置, 这是完整的代码。
public class MapShowUsingJson extends MapActivity
{
MapView mapView;
MapController mapController;
String country; // Value of country is coming from other activity using Intent.
@Override
public void onCreate(Bundle bundle)
{
super.onCreate(bundle);
setContentView(R.layout.show_map);
mapView = (MapView)findViewById(R.id.MapView);
//mapView.setBuiltInZoomControls(true);
mapController = mapView.getController();
Intent intent = this.getIntent();
if(intent.getStringExtra("Country") != null)
country = intent.getStringExtra("Country");
else
Log.v("Intent Value", "Country:NULL");
Log.v("Country=", country);
JSONObject object = getLocationInfo(country);
GeoPoint p = getGeoPoint(object);
mapController.animateTo(p);
mapController.setZoom(4);
mapView.invalidate();
}
@Override
protected boolean isRouteDisplayed()
{
return false;
}
public static JSONObject getLocationInfo(String address)
{
address = address.replaceAll(" ","%20");
HttpGet httpGet = new HttpGet("http://maps.google."
+ "com/maps/api/geocode/json?address=" + address
+ "&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)
{
e.printStackTrace();
}
return jsonObject;
}
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)
{
e.printStackTrace();
}
return new GeoPoint((int) (lat * 1E6), (int) (lon * 1E6));
}
}
使用此java代码并使用 Mo Kargas的答案中的所有xml文件代码。