经过几天了解Android的工作方式,我决定构建我的第一个应用程序:一个简单的应用程序,它使用一个简单的EditText
小部件从用户提供的地址显示GMap。
我使用Geocoder
来做到这一点。
使用logcat进行一些小错误跟踪之后,这是adb返回的异常:
E/LocationMasfClient( 53): forwardGeocode(): RPC failed with status 1
W/System.err( 262): java.io.IOException: RPC failed with status 1
W/System.err( 262): at android.location.Geocoder.getFromLocationName(Geocoder.java:166)
W/System.err( 262): at fr.meetopia.tinymap.MapViewActivity.testGeoCoder(MapViewActivity.java:104)
W/System.err( 262): at fr.meetopia.tinymap.MapViewActivity.onCreate(MapViewActivity.java:38)
W/System.err( 262): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
W/System.err( 262): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
W/System.err( 262): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
W/System.err( 262): at android.app.ActivityThread.access$2200(ActivityThread.java:119)
W/System.err( 262): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
现在这里是堆栈跟踪指向的代码:
Geocoder geoCoder = new Geocoder(this);
MapView mapView = (MapView) findViewById(R.id.mapview);
MapController mc = mapView.getController();
GeoPoint p;
try {
List<Address> addresses = geoCoder.getFromLocationName("paris france", 50);
if (addresses.size() > 0) {
p = new GeoPoint(
(int) (addresses.get(0).getLatitude() * 1E6),
(int) (addresses.get(0).getLongitude() * 1E6));
mc.animateTo(p);
mapView.invalidate();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
显然,此代码是MapActivity
实例化的一部分。
我使用不同版本的Google APIS(8,7,4)和不同版本的Google进行了一些测试
SDK平台(2.2,2.1,1.6),但没有运气。我刚刚注意到Google API 8包含一个已知错误,并返回了Service Unavailable Exception
而不是RPC Failed 1
。
另一方面,我试图直接在我的设备上运行我的应用程序(HTC Desire 2.1),我注意到了同样的行为(也就是说:没有行为,一个以美国为中心的地图)。
以下是Android Manifest的用户权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
答案 0 :(得分:3)
请访问我的帖子 Can't mark while showing the current location in 'mapview' 我认为通过一些先前的修改,你可以做任何你想做的事情。
答案 1 :(得分:2)
我想,你有两个理由。
没有测试,但在模拟器中运行时Geocoder仍然不可用。即使geocoder.isPresent()返回true也是如此。网络上有解决方法,只需在评论21中阅读Issue 8816 - android获取getFromLocationName(..)并附上ReverseGeocoder.java
像Stefan所说:当在设备上启动时,需要api-key。必须添加到mapview的layout.xml中。
为我创建和测试mapview的最佳方法是像普通和日志一样实现它,如果“服务不可用”.equals(exception.getMessage()),请尝试解决方法。
答案 2 :(得分:1)
这就是我的地理编码功能,它在谷歌API 7上工作正常。希望它有用
public GeoPoint geoCoding(String name){
Geocoder geoCoder = new Geocoder(context, Locale.getDefault() );
GeoPoint p = null;
try {
List<Address> addresses = geoCoder.getFromLocationName(
name, 5);
if (addresses.size() > 0) {
p = new GeoPoint(
(int) (addresses.get(0).getLatitude() * 1E6),
(int) (addresses.get(0).getLongitude() * 1E6));
}
} catch (IOException e) {
e.printStackTrace();
}
return p;
}
答案 3 :(得分:1)
Geocoder课程有问题。它有时很奇怪。 我建议不要用于获取位置。而是使用本地搜索API和位置管理器来使用位置服务。