高德API的使用Ps: demo具体实现了1.定位;2.自定义位置小蓝点(弃系统提供的);3.点击地图弹marker;4.点marker弹infowindow,infowindow包括3块,点击1弹dialog输入兴趣点搜附近,点击2查看具体信息,点击3跳转到路线查询界面(默认从兴趣点到当前位置)开发过程如下:1.进入高德官网申请map api key ,这一步不能少,否则无法获取地图。
像百度也需要。
2.在Manifest中添加必要权限:<uses-permission android:name="android.permission.INTERNET"/><uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"/><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permissionandroid:name="android.permission.CHANGE_CONFIGURATION"/>---------------------------------------------分割线-------------------------------------------3.代码具体实现过程:A.导入jar包:从官网下载最新的jarB.在Main.xml中添加fragment用来显示地图。
<fragmentandroid:id="@+id/map"android:layout_width="match_parent"android:layout_height="fill_parent"class="com.amap.api.maps.SupportMapFragment"/>---------------------------------------------分割线-------------------------------------------C.MainActivity继承FragmentActivity,使用以下代码来初始化地图以及对地图添加监听,启动定位等操作:if (aMap == null) {aMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();//获取地图实例if (aMap!=null) {setCenterPoi();//最初显示的可视区域setUpMap();//显示系统定位小蓝点setMapListener();//对aMap添加监听器}}---------------------------------------------分割线------------------------------------------- 上述代码中的3个方法如下:private void setCenterPoi(){LatLng latLng=new LatLng(31.23, 121.47);//默认城市经纬度CameraPosition position=new CameraPosition(latLng,9, 0, 0);//相机位置,参数分别代表经纬度坐标,地图缩放级别4-20,可视区域倾斜角0-45°,可视区域指向的方向,以角度为单位,正北方向到地图方向逆时针旋转的角度0-360°CameraUpdate cameraUpdate=CameraUpdateFactory.newCameraPosition(position);//定义了一个可视区域的移动,具体参考apiaMap.moveCamera(cameraUpdate);//移动相机到可视区域}---------------------------------------------分割线------------------------------------------- private void setUpMap() {// 自定义系统定位小蓝点MyLocationStyle myLocationStyle = new MyLocationStyle();myLocationStyle.myLocationIcon(BitmapDescriptorFactory .fromResource(R.drawable.location_marker));myLocationStyle.strokeColor(Color.BLUE);myLocationStyle.strokeWidth(1);aMap.setMyLocationStyle(myLocationStyle);mAMapLocManager= LocationManagerProxy.getInstance(this);aMap.setLocationSource(this);//提供位置数据,必须实现LocationSource接口,里面有两个方法:启动和销毁,具体详情见下文。
aMap.setMyLocationEnabled(true);// 设置为true表示系统定位按钮显示并响应点击,false表示隐藏,默认是false}---------------------------------------------分割线-------------------------------------------监听器里的具体操作,可以自己完成。
private void setMapListener(){aMap.setOnMapClickListener(new OnMapClickListener() {……});aMap.setOnMarkerClickListener(new OnMarkerClickListener() {……});aMap.setInfoWindowAdapter(new InfoWindowAdapter() {//个性化定制信息窗口marker对象@Overridepublic View getInfoWindow(final Marker marker) {……} aMap.setOnInfoWindowClickListener(newOnInfoWindowClickListener() {……});}---------------------------------------------分割线-------------------------------------------Ⅰ.上面setUpMap()方法代码中提到LocationSource接口两个方法,下面是具体实现:@Overridepublic void activate(OnLocationChangedListener arg0) { mListener = arg0;// OnLocationChangedListener接口用于获取位置改变信息if (mAMapLocManager == null) {mAMapLocManager = LocationManagerProxy.getInstance(this); }// LocationManagerProxy mAMapLocManager定位服务类。
这个定位类允许应用定时更新获取设备的地理位置,或者当这个设备进入指定的地理位置时,启动一个应用指定的Intent。
mAMapLocManager.requestLocationUpdates(LocationProviderP roxy.AMapNetwork, 5000*3, 20, this);//注册监听,参数依次代表:注册监听的provider 名称,位置变化的通知时间,位置变化通知的距离,AMapLocationListener(MainActivity实现的接口:当位置改变时接收LocationManagerProxy 发来的信息提示。
如果AMapLocationListener 已经使用LocationManagerProxy 的requestLocationUpdates(String, long,float, AMapLocationListener) 方法进行了注册,那么它的方法才能被调用。
)}/**释放资源*/@Overridepublic void deactivate() {mListener = null;if (mAMapLocManager != null) {mAMapLocManager.removeUpdates(this);mAMapLocManager.destory();}mAMapLocManager = null;}---------------------------------------------分割线-------------------------------------------Ⅱ.上面代码中包含的AMapLocationListener接口,所实现的方法(只需一个,包含低版本的方法均已废弃):@Overridepublic void onLocationChanged(AMapLocation location) {// if (mListener != null) {// 位置改变递归调用// mListener.onLocationChanged(location);// }/**通过返回的location可以获取具体的位置信息,由于该方法是异步的,*主线程需要的位置信息需要通过消息队列传递*/if (location != null) {Double geoLat = location.getLatitude();Double geoLng = location.getLongitude();String cityCode = "";String desc = "";Bundle locBundle = location.getExtras();if (locBundle != null) {cityCode = locBundle.getString("citycode");desc = locBundle.getString("desc");System.out.println("bundlekey=="+locBundle.keySet());}String str = ("定位成功:(" + geoLng + "," + geoLat + ")"+ "\n精度 :" + location.getAccuracy() + "米"+ "\n定位方式:" + location.getProvider() + "\n 城市编码:"+ cityCode + "\n位置描述:" + desc+ "\n定位时间:"+new SimpleDateFormat("yyyy-MM-ddHH:mm:ss").format(new Date(location.getTime()))+"\n省:"+ location.getProvince() + "\n市:" + location.getCity()+ "\n区(县):" + location.getDistrict() + "\n城市编码:"+ location.getCityCode() + "\n区域编码:" + location.getAdCode());Message msg = new Message();msg.obj = str;Bundle b=new Bundle();b.putDouble("lat", geoLat);b.putDouble("lng", geoLng);msg.setData(b);msg.what=0;if (handler != null) {handler.sendMessage(msg);//将经纬度传回主线程,画位置图层:aMap.addMarker,aMap.addCircle}}}---------------------------------------------分割线-------------------------------------------Ⅲ.搜附近的主要代码,写在aMap.setInfoWindowAdapter的第一个方法里,对view中的某个控件绑定监听,回调时所执行的操作如下,该方法返回view (也就是infowindow信息窗口):int radius=3000;//搜索附近的半径final PoiSearch poiSearch=new PoiSearch(AMapMainActivity.this, new Query(selectString, PoiTypeDef.All,Constants.CITYCODE));//参数依次为:context,兴趣点,搜索结果类型,城市编码,如北京010,上海021等SearchBound searchBound=new SearchBound(newLatLonPoint(marker.getPosition().latitude,marker.getPosition().longitude),radius);//定义矩形搜索区域poiSearch.setBound(searchBound);poiSearch.setPageSize(10);//设置返回结果页数new Thread( new Runnable() {public void run() {try {PoiPagedResultresult=poiSearch.searchPOI();if (result!=null) {list=result.getPage(1);if (list!=null&&list.size()>0) { handler.sendMessage(Message.obtain(handler, 1));//传回主线程,在地图上标注出搜索结果}}} catch (AMapException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();---------------------------------------------分割线-------------------------------------------显示搜索兴趣点返回所有的结果:private void addMarkers(List<PoiItem> poiItems) {if (listBitmap==null) {listBitmap=new ArrayList<BitmapDescriptor>();//用来存储系统marker图片}if (listBitmap.size()<=0) {listBitmap.add(BitmapDescriptorFactory.defaultMarker(Bitmap DescriptorFactory.HUE_AZURE));listBitmap.add(BitmapDescriptorFactory.defaultMarker(Bitmap DescriptorFactory.HUE_BLUE));listBitmap.add(BitmapDescriptorFactory.defaultMarker(Bitmap DescriptorFactory.HUE_CYAN));listBitmap.add(BitmapDescriptorFactory.defaultMarker(Bitmap DescriptorFactory.HUE_GREEN));listBitmap.add(BitmapDescriptorFactory.defaultMarker(Bitmap DescriptorFactory.HUE_MAGENTA));listBitmap.add(BitmapDescriptorFactory.defaultMarker(Bitmap DescriptorFactory.HUE_ORANGE));listBitmap.add(BitmapDescriptorFactory.defaultMarker(Bitmap DescriptorFactory.HUE_RED));listBitmap.add(BitmapDescriptorFactory.defaultMarker(Bitmap DescriptorFactory.HUE_ROSE));listBitmap.add(BitmapDescriptorFactory.defaultMarker(Bitmap DescriptorFactory.HUE_YELLOW));listBitmap.add(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_VIOLET));}for (int i = 0; i < poiItems.size(); i++) {aMap.addMarker(new MarkerOptions().position(newLatLng( poiItems.get(i).getPoint().getLatitude(),poiItems.get(i).getPoint().getLongitude())).title(poiItems.get(i).getTitle()).snippet(poiItems.get(i).getSnippet()).icon(listBitmap.get((int)(Math.random()*9))));}}---------------------------------------------分割线-------------------------------------------Ⅳ.乘车路线查询具体实现,代码写的地方与搜附近类似,换一个控件绑定。