转自:http://www.eoeandroid.com/thread-28636-1-1.html
我做一个地图程序,想实现定位地址功能,据我所知,应该是用geocoder这个类进行编码的。但是我运行的时候报SocketException: Address family not supported by protocol这个错误,哪位朋友能帮忙解答一下,感激!$ ?6 s- Z8 c( Y1 y
' ~7 O6 l- G7 b+ @' s; Y
源代码如下:) n; X L. V# /+ k8 f
public void onCreate(Bundle savedInstanceState)
) }' U! v! R8 J9 a P0 d0 }
{
5 f" w/ p" p- Z6 y0 m
super.onCreate(savedInstanceState);
- l& a& q- T1 j& N
setContentView(R.layout.main);
J( h& U; X2 ]
// 从XML布局文件获得MapView对象# {2 C# O" b$ /& l
MapView mapView = (MapView) findViewById(R.id.mapview);
// 允许通过触摸拖动地图
0 g; ]" R/ U6 d7 L
mapView.setClickable(true);
6 y x$ x% q2 ]9 S% J
// 当触摸地图时在地图下方会出现缩放按钮,几秒后就会消失
mapView.setBuiltInZoomControls(true);
// 获得MapController对象,mapController是一个在类中定义的MapController类型变量3 B- w2 c; r- z
* _; t8 b$ T3 R3 c7 z
mapController = mapView.getController();
, g# t5 a+ // @, i
// 创建Geocoder对象,用于获得指定地点的地址: X6 E8 m1 P3 B' G7 R( ~
# H6 `& k( T0 }% ~: Q& K/ o4 T( q2 R
Geocoder gc = new Geocoder(this);
// 将地图设为Traffic模式
0 V6 l2 }3 w9 x3 ?: ~
mapView.setTraffic(true);
try8 E! H, K9 j8 b+ A$ R8 o
W- `* A' }% }5 @: H# J6 @2 {
{& W$ L% M, W- g) Y8 O1 M
// 查询指定地点的地址
: f- Y' b& p$ z* L: n4 A- ?/ q+ `
List<Address> addresses = gc.getFromLocationName("沈阳三好街", 5);( x4 c( o' u/ p! K' /; q
// 根据经纬度创建GeoPoint对象
geoPoint = new GeoPoint(
(int) (addresses.get(0).getLatitude() * 1E6),6 b- Z; A2 T$ J- @( e1 b" [- b
(int) (addresses.get(0).getLongitude() * 1E6));3 U. G: t: k: n9 p( i+ T$ Q
% T1 h3 r: L! L1 J& q
setTitle(addresses.get(0).getFeatureName());# C5 u2 A- L) q; {5 f8 ~# Z& y5 P2 K c
}7 I5 Z% u% u9 `4 l
catch (Exception e)1 S/ E8 L2 D0 /7 K
{( I1 H. t+ b' b0 c; h8 y
4 z' a& t( V; Y0 C+ S* G
}
// 创建MyOverlay对象,用于在地图上绘制图形
4 l: n- H4 D. ], T* M
MyOverlay myOverlay = new MyOverlay();6 o, _7 m7 q# D" p
// 将MyOverlay对象添加到MapView组件中
mapView.getOverlays().add(myOverlay);$ ?/ E( {- o P& a: ~
3 M6 @; Y6 z/ Q, d
// 设置地图的初始大小,范围在1和21之间。1:最小尺寸,21:最大尺寸' y$ b P) L0 P; V. R
: N$ E2 ]7 m* P7 a, z9 t9 u
mapController.setZoom(20);' @5 m* R. f9 t. C
! b5 D9 /' ?' T
// 以动画方式进行定位8 ~2 z7 /. `; Q9 y" x) Z3 D
mapController.animateTo(geoPoint);% c ` g! y5 T6 c4 H7 |( o; T2 v
. /* E5 X4 Z& C0 m% J2 J$ F
}4 y0 q* R% ]1 G! l: z, u
! O, A' b; E* x, n$ w& u
// 用于在地图上绘制图形的MyOverlay对象
class MyOverlay extends Overlay
{9 G( P+ I$ ~/ Q: F
@Override
public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when)/ S+ ]% B. J1 L' ?# F! d' q
. f, K3 |6 U5 q' m! ^9 X: Z' H2 Q; i
{8 K8 c/ X+ T. ?& l7 s
/, M, f& e0 l# V
Paint paint = new Paint();
paint.setColor(Color.RED);0 T# D, y1 P5 D" `. D3 l4 m
( T( f# Q4 `5 A. e8 } W3 Z* x7 P! J
Point screenPoint = new Point();
// 将“沈阳三好街”在地图上的位置转换成屏幕的实际坐标+ Z! H3 E9 c, {! W, Q6 Y
mapView.getProjection().toPixels(geoPoint, screenPoint);( i( R' l! l5 D0 L
/ A4 J4 H8 N; d4 `
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.flag);
3 n0 H( e, g3 ]6 k* [' x/ F1 x
// 在地图上绘制图像+ `& H9 n2 /7 Y4 k
- l6 v y' j, ?# /* j
canvas.drawBitmap(bmp, screenPoint.x, screenPoint.y, paint);
// 在地图上绘制文字
B9 P$ g6 z' e
canvas.drawText("三好街",screenPoint.x, screenPoint.y, paint);
return super.draw(canvas, mapView, shadow, when);
}
}
/***********************************************4 n) ^/ K* m# i: u
注: geoPoint = new GeoPoint(
' q( s% X3 z* E4 y7 e
(int) (addresses.get(0).getLatitude() * 1E6),
(int) (addresses.get(0).getLongitude() * 1E6));; P) A/ M T1 B! [6 J
mapController.animateTo(geoPoint);
应该是这里的问题,但是我不知道如何解决。' V+ a% C F/ E0 ?
*************************************************/