Android开发 百度地图之传送一个详细地址获取在地图上的位置

      要求点击一个地址,直接调用百度地图,将地址显示到百度地图上,参数只有一个地址,没有对应的坐标,这就想到了以前做的地图是传送一个坐标,将该地址显示到地图上,就有了这样的思路:怎么将一个详细地址转换成坐标,然后再传送给百度地图,但是这样做好像是虽然能把详细地址转换成坐标,但是这个是在显示地址之后转换的所以就出现了空指针,具体就没再研究,觉得再换一种思路,就在网上看到了百度地图的api上面有一个输入地址点击搜索就会在将该地址显示到了地图上,觉得这个应该就可以,于是好好看了一下百度demo中的GeoCoder这个java文件,这个就是输入一个地址,点击搜索按钮直接显示将地址显示在地图上的,点击搜索是调用的MKSearch的geocode("详细地址","具体城市"),然后我就在我的调用地图的那个界面 初始化地图之后就调用了这个方法,点击进入之后,就一直在加载,显示不出来位置,我这里跟他的唯一区别就是百度地图demo是点击触发这个事件,而我是初始化地图后就调用该方法。但是这是为什么呢,我的为什么一直就加载中,但是不显示呢。

 一下代码是百度地图demo的代码

// 初始化搜索模块,注册事件监听
        mSearch = new MKSearch();
        mSearch.init(app.mBMapMan, new MKSearchListener() {
            @Override
            public void onGetPoiDetailSearchResult(int type, int error) {
            }
            
			public void onGetAddrResult(MKAddrInfo res, int error) {
				if (error != 0) {
					String str = String.format("错误号:%d", error);
					Toast.makeText(GeoCoder.this, str, Toast.LENGTH_LONG).show();
					return;
				}

				mMapView.getController().animateTo(res.geoPt);
					
				String strInfo = String.format("纬度:%f 经度:%f\r\n", res.geoPt.getLatitudeE6()/1e6, 
							res.geoPt.getLongitudeE6()/1e6);

				Toast.makeText(GeoCoder.this, strInfo, Toast.LENGTH_LONG).show();
				Drawable marker = getResources().getDrawable(R.drawable.iconmarka);  //得到需要标在地图上的资源
				marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker
						.getIntrinsicHeight());   //为maker定义位置和边界
				mMapView.getOverlays().clear();
				mMapView.getOverlays().add(new OverItemT(marker, GeoCoder.this, res.geoPt, res.strAddr));
			}
			public void onGetPoiResult(MKPoiResult res, int type, int error) {
				if (error != 0 || res == null) {
					Toast.makeText(GeoCoder.this, "解析失败", Toast.LENGTH_LONG).show();
					return;
				}
				if (res != null && res.getCurrentNumPois() > 0) {
					GeoPoint ptGeo = res.getAllPoi().get(0).pt;
					// 移动地图到该点:
					mMapView.getController().animateTo(ptGeo);
					
					String strInfo = String.format("纬度:%f 经度:%f\r\n", ptGeo.getLatitudeE6()/1e6, 
							ptGeo.getLongitudeE6()/1e6);
					strInfo += "\r\n附近有:";
					for (int i = 0; i < res.getAllPoi().size(); i++) {
						strInfo += (res.getAllPoi().get(i).name + ";");
					}
					Toast.makeText(GeoCoder.this, strInfo, Toast.LENGTH_LONG).show();
				}
			}
			public void onGetDrivingRouteResult(MKDrivingRouteResult res,
					int error) {
			}
			public void onGetTransitRouteResult(MKTransitRouteResult res,
					int error) {
			}
			public void onGetWalkingRouteResult(MKWalkingRouteResult res,
					int error) {
			}
			public void onGetBusDetailResult(MKBusLineResult result, int iError) {
			}
			@Override
			public void onGetSuggestionResult(MKSuggestionResult res, int arg1) {
				// TODO Auto-generated method stub
				
			}
            @Override
            public void onGetRGCShareUrlResult(String arg0, int arg1) {
                // TODO Auto-generated method stub
                
            }

        });

 

EditText editCity = (EditText)findViewById(R.id.city);
			EditText editGeoCodeKey = (EditText)findViewById(R.id.geocodekey);
			mSearch.geocode(editGeoCodeKey.getText().toString(), editCity.getText().toString());



 

        后来网友就说该方法是被动的方法,要主动调用,建议用一个线程去调用,我就在初始化地图之后,写了一个线程,在线程里调用MKSearch的geocode("详细地址","具体城市")方法,果然加载成功了。但是有一个问题是,我必须的点击一下屏幕,地图才刷新,有开始在网上搜,说是把AndroidMainfest.xml文件中的androidmanifest <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="10" />的android:targetSdkVersion="10"去掉就可以了,果然成功了!

       在说一下,这个是成功了,但是还有一个问题,让地址显示到地图上之后,还想弹出一个详细地址,一直放到地图上,现在是可以将地标放到地图上,如下代码,该代码写到监听事件中MKSearchListener()

Drawable marker = getResources().getDrawable(R.drawable.point_start);  //得到需要标在地图上的资源
				marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker
						.getIntrinsicHeight());   //为maker定义位置和边界
				View mPopView = getLayoutInflater().inflate(R.layout.popview2, null);
				OverItemT overItemT = new OverItemT(marker, LocationActivity.this, res.geoPt, res.strAddr);


但是我想弹出个详细地址的泡泡,这该怎么做呢,百度地图demo中还有一个ItemizedOverlayDemo这个Java类是可以显示泡泡的,但是这个是点击地标之后会弹出泡泡,如下代码如下

// 处理当点击事件
	protected boolean onTap(int i) {
		setFocus(mGeoList.get(i));
		// 更新气泡位置,并使之显示
		GeoPoint pt = mGeoList.get(i).getPoint();
		ItemizedOverlayDemo.mMapView.updateViewLayout( ItemizedOverlayDemo.mPopView,
                new MapView.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
                		pt, MapView.LayoutParams.BOTTOM_CENTER));
		ItemizedOverlayDemo.mPopView.setVisibility(View.VISIBLE);
		Toast.makeText(this.mContext, mGeoList.get(i).getSnippet(),
				Toast.LENGTH_SHORT).show();
		return true;
	}


哈哈,我把改代码写到了

我把以上代码写到了MKSearchListener()这个监听事件里,但是这时会报错,原来是因为我没有将弹出气泡添加到地图里就update了,应该在MKSearchListener()这个监听事件加上如下代码

// 创建点击mark时的弹出泡泡
		mPopView=super.getLayoutInflater().inflate(R.layout.popview, null);
		mMapView.addView( mPopView,
                new MapView.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
                		null, MapView.LayoutParams.TOP_LEFT));
		mPopView.setVisibility(View.GONE);


 

加上代码之后就可以在地标的图片位置有弹出的详细地址泡泡了,但是这时候就是弹出的泡泡跟地标图片重叠了,刚开始我想在update处改一下泡泡的位置,但是这个不是简单的

point,所以后来我想到了修改泡泡的layout文件,哈哈,最后就成功了。

 

代码下载地址如下:http://download.csdn.net/detail/ladyweiwei1234/7129687

参考百度地图demo下载地址如下(1.3.5版本):http://download.csdn.net/detail/ladyweiwei1234/7129701


 

 

Android开发 百度地图之传送一个详细地址获取在地图上的位置,布布扣,bubuko.com

Android开发 百度地图之传送一个详细地址获取在地图上的位置

上一篇:Android视频录制命令screenrecord


下一篇:《ios开发工程师 零基础到app上线(完)》