目前国内地图这部分相关功能的开发基本都是接的百度或者高德接口,其实总体来说百度比较使用于城市,高德的范围更加广,在郊外比百度好用
,不过总的来说两者都差不多,,开发文档写的也是一样的糟糕呀(二哈脸)。
高德AndroidSDK是一套地图开发调用接口,在他的帮助下,我们可以轻松(大概?)的进行相关功能的开发。基础上提供的功能大致常用的有:
地图的显示和对显示的一些绘制与操作(增删覆盖物,手势操作之类)
室内地图
兴趣点搜索与获得相应需求数据
定位
导航(包括行车,骑行,公交和步行)
//
地图,定位,导航是相互分出来的。各自有各自的独立的类库,感觉分开来挺不方便的毕竟一般都要用到,我也是不太懂官方【
地图这部分有分成3d矢量和2d栅格,2d开发包比较小。对机器性能要求不高,不过因为他是栅格的比较消耗流量。3d的图形渲染速度比较快,不过因为他要依靠一个矢量的渲染引擎,所以开发包比较大,对硬件的配置要求较高(不过一般的智能手机其实都可以).
//
初始配置也比较简单
注册-创建Dome-获取Key.这里需要SHA,在eclipse的配置里找找就有了很简单官方的开发文档都有详细步骤。
然后就是在eclipse里进行简单的配置,在lib里添加相应的jar 文件和 armeabi 文件夹。在AndroidManifest.xml里加入相应权限。
测试时注意最好用真机测试,androidSDK里的虚拟机很不好用,可能会出一些BUG。真机测试可以减去很多麻烦。
/
地图的显示需要布局xml文件中添加地图控件:com.amap.api.maps.MapView(3d的),而导航时则是需要布局xml文件中导航控件com.amap.api.navi.AMapNaviView,开发文档里也没写清楚,不过搞错的话就打不开。可以从高德的Android_Map_Doc里去查看所有的包,类和方法。给的还是很详细。同样也可以去看看官方给出的demo,虽然有点乱有点多。
项目中使用地图的时候,由于SDK并没有提供用于管理地图生命周期的Activity,因此需要用户继承Activity后管理地图的生命周期,防止内存泄露.这表现了我们要重新那四个方法,再加上我们要是设置监听又要实现一大堆方法,所以这时候我们应该来尽可能减少冗杂的代码,。
我的办法首先建一个Base_Activity,作为基类,在里面实现监听接口,继承生命周期,和定义一些变量,然后MianActivity继承该类,并重写一些回调的方法。这样就比较清晰。代码如下:
public class Base_Activity extends Activity implements OnClickListener,AMapLocationListener,AMap.OnMapClickListener ,OnPoiSearchListener{
protected MapView mMapView ;
// 要输入的poi搜索关键字
protected String keyWord = "";
// 城市
protected String cityCode = "北京";
// 搜索时进度条
private ProgressDialog progDialog = null;
// poi返回的结果
protected PoiResult poiResult;
// 当前页面,从0开始计数
protected int currentPage = 0;
// Poi查询条件类
protected PoiSearch.Query query;
// POI搜索
protected PoiSearch poiSearch;
//声明AMapLocationClient类对象
//定位发起端
AMapLocationClient mLocationClient = null;
//定位参数/** 声明mLocationOption对象 */
AMapLocationClientOption mLocationOption = null;
//定位监听器
OnLocationChangedListener mListener = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initLoction();
}
public void initLoction() {
// TODO 自动生成的方法存根
mLocationClient=new AMapLocationClient(this);
mLocationOption=new AMapLocationClientOption();
mLocationClient.setLocationListener(this);
//设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
mLocationOption.setLocationMode(AMapLocationMode.Hight_Accuracy);
//设置定位间隔,单位毫秒,默认为2000ms
mLocationOption.setInterval(36000);
//设置是否只定位一次,默认为false
mLocationOption.setOnceLocation(false);
//设置是否返回地址信息(默认返回地址信息)
mLocationOption.setNeedAddress(true);
//设置是否强制刷新WIFI,默认为强制刷新
mLocationOption.setWifiActiveScan(true);
//设置是否允许模拟位置,默认为false,不允许模拟位置
mLocationOption.setMockEnable(false);
//给定位客户端对象设置定位参数
mLocationClient.setLocationOption(mLocationOption);
//启动定位
mLocationClient.startLocation();
}
/**
* 显示进度框
*/
protected void showProgressDialog() {
if (progDialog == null)
progDialog = new ProgressDialog(this);
progDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progDialog.setIndeterminate(false);
progDialog.setCancelable(false);
progDialog.setMessage("正在搜索:\n" + keyWord);
progDialog.show();
}
/**
* 隐藏进度框
*/
protected void dissmissProgressDialog() {
if (progDialog != null) {
progDialog.dismiss();
}
}
@Override
protected void onResume() {
super.onResume();;
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onResume();;
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView.onPause (),实现地图生命周期管理
mMapView.onPause();
}
@Override
public void onLocationChanged(AMapLocation arg0) {
// TODO 自动生成的方法存根
}
@Override
public void onClick(View v) {
// TODO 自动生成的方法存根
}
@Override
public void onMapClick(LatLng arg0) {
// TODO 自动生成的方法存根
}
@Override
public void onPoiItemSearched(PoiItem arg0, int arg1) {
// TODO 自动生成的方法存根
}
@Override
public void onPoiSearched(PoiResult result, int rcode) {
// TODO 自动生成的方法存根
}
}
地图的定位,触碰,poi搜索等都要用相应的监听,具体操作开发文档里都有,不过给的很初略,还是看概览比较好 。地图这边也包括了路径规划,不过和导航使用的类和方法都不一样。
导航部分包括路径规划和多种导航方式
重点就是开启规划和规划成功后回调
@Override
public void onInitNaviSuccess() {
// TODO 自动生成的方法存根
Log.i(TAG,"navi");
Toast.makeText(getApplicationContext(),"成功开启导航",Toast.LENGTH_LONG).show();
Boolean isSuccess= mAMapNavi.calculateWalkRoute(new NaviLatLng(lat, lon), new NaviLatLng(lat+1, lon+1));
if(isSuccess==null)
Toast.makeText(getApplicationContext(),"失败",Toast.LENGTH_LONG).show();
}
@Override
public void onCalculateRouteSuccess() {
// TODO 自动生成的方法存根
// TODO 自动生成的方法存根
Toast.makeText(getApplicationContext(),"成功规划"
,Toast.LENGTH_LONG).show();
AMapNaviPath naviPath = mAMapNavi.getNaviPath();
if (naviPath == null){
Toast.makeText(getApplicationContext(),"fail"
,Toast.LENGTH_LONG).show();
return;
}
Log.i(TAG,"navi路径规划成功");
// 获取路径规划线路,显示到地图上
/* mRouteOverlay.setAMapNaviPath(naviPath);
mRouteOverlay.addToMap();
amap.moveCamera(CameraUpdateFactory.zoomTo(18.0f));*/
mAMapNavi.startNavi(NaviType.GPS);
mAMapNavi.startGPS();
}
高德还接了讯飞的语音接口,在配置了讯飞SDK的情况下可以用:
//实例化语音引擎
mTtsManager = TTSController.getInstance(getApplicationContext());
mTtsManager.init();
mTtsManager = TTSController.getInstance(getApplicationContext());
mAMapNavi.addAMapNaviListener(mTtsManager);
基本就是这样~希望官方能完善开发文档~大家也要加油哟