在日益创新的网络技术促进下,我国的通讯技术早已经进入第四代,4G时代的到来,让人们享受到了更快速的网络传输速度和便捷的移动通讯。在现在的社会,手机已经成为了人们日常生活中不可缺少的一部分。随着现代科技的进步和人们生活质量的不断地提高,普通只可以打电话发信息手机已经无法满足人们的要求。从人们对智能手机的使用率反复的调查研究来看,可以说智能手机使用率在现代社会已经达到了90%以上,智能手机的功能也被开发得越来越人性化,人们可以通过手机完成很多的需求,可以说人们的生活已经离不开智能手机了。现在人们更多地使用Android Store上的APP应用来帮助人们解决问题,因此由我的这个基于高德地图开发的移动APP拓展开来,延伸并广泛的使用在高德地图API对Android系统的结合中,由于对地址查询最原始方式是使用PC版的百度地图,相比之下,显得就很麻烦,人们不可能随身携带电脑,并且不能保证电脑随时随地都能够用有线或WIFI的方式上网,但是在手机上,人们只需要在自己手机的Android Store上下载这个APP,就能通过在线定位、位置查询、位置信息检索等功能,解决生活中的一些问题。
本移动APP应用基于高德地图开发,基于高德地图官方提供的架包,主要的实现的功能有:定位、位置查询、位置信息检索;
软件:具有APP开发能力的Eclipse、Android手机模拟器;
硬件:系统为Android4.0以上的Android真机。
其他:高德地图API账号、密码、AppKey等;
推荐模拟器:海马玩 (http://droid4x.haimawan.com/)
Genymotion (http://www.genymotion.net/)。
i. 在高德地图开放平台(http://lbs.amap.com)上注册成为开发者
ii. 在控制台创建移动APP应用
iii. 添加APP应用后,获取对应的key
Windows--->Prefences--->Android--->Build,获取安全码SHA1
获取报名Package Name
i. 新建一个Android工程
ii. 添加 jar 包和 so 库
iii. 添加高德 Key
项目的“AndroidManifest.xml”文件中,添加如下代码
android:icon="@drawable/icon" android:label="@string/app_name" > android:name="com.amap.api.v2.apikey" android:value="请输入您的用户Key"/> ……
|
iv. 配置权限
在AndroidManifest.xml中配置权限:
//地图包、搜索包需要的基础权限
<uses-permissionandroid:name="android.permission.INTERNET"/>
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/>
<uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"> uses-permission>
<uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"> uses-permission>
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"> uses-permission>
<uses-permissionandroid:name="android.permission.INTERNET"> uses-permission>
<uses-permissionandroid:name="android.permission.READ_PHONE_STATE"> uses-permission> android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"> uses-permission>
<uses-permissionandroid:name="android.permission.BLUETOOTH"> uses-permission> <uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN"> uses-permission> |
i. 地图显示
ii. 实时定位
iii. 位置蓝点标记
iv. 位置信息显示
v. 周边POI搜索
i. 地图显示
利用官方提供的接口,对定位点进行监听,声明locationClient对象,并对对象进行初始化,将实时的经纬度位置显示出来。
mMapView = (MapView) findViewById(R.id.map); // 在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),创建地图 mMapView.onCreate(savedInstanceState); if (aMap ==null) { aMap = mMapView.getMap(); // aMap.moveCamera(arg0); // 设置定位监听 } // 声明mlocationClient对象 AMapLocationClient mlocationClient; // 声明mLocationOption对象 AMapLocationClientOption mLocationOption = null; // AMapLocationClientOption mLocationOption = null; mlocationClient = new AMapLocationClient(this); // 初始化定位参数 mLocationOption = new AMapLocationClientOption(); // 设置定位监听 mlocationClient.setLocationListener(this); // 设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式 mLocationOption.setLocationMode(AMapLocationMode.Hight_Accuracy); // 设置定位间隔,单位毫秒,默认为2000ms mLocationOption.setInterval(2000); // 设置定位参数 mlocationClient.setLocationOption(mLocationOption); // 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗, // 注意设置合适的定位时间的间隔(最小间隔支持为1000ms),并且在合适时间调用stopLocation()方法来取消定位请求 // 在定位结束后,在合适的生命周期调用onDestroy()方法 // 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除 // 启动定位 mlocationClient.startLocation(); |
实时定位
重写onLocationChanged()方法,在定位成功后实时回调定位信息,并将获取到的经纬度等位置信息通过Activity传值跳转到MessageActivity或者PoiSearchActivity页面,如定位不成功,则日志打印错误信息,防止程序报错或闪退。
@Override public void onLocationChanged(AMapLocation amapLocation) { // TODO Auto-generated method stub if (amapLocation !=null) { if (amapLocation.getErrorCode() == 0) { // 定位成功回调信息,设置相关消息 amapLocation.getLocationType(); // //获取当前定位结果来源,如网络定位结果,详见定位类型表 amapLocation.getLatitude();//获取纬度 x = amapLocation.getLatitude(); Log.i("TAG","纬度:" + amapLocation.getLatitude()); amapLocation.getLongitude();//获取经度 y = amapLocation.getLongitude(); Log.i("TAG","经度:" + amapLocation.getLongitude()); accuracy = amapLocation.getAccuracy();//获取精度信息 Log.i("TAG","地址::" + amapLocation.getAddress()); address = amapLocation.getAddress(); // 地址,如果option中设置isNeedAddress为false,则没有此结果, 网络定位结果中会有地址信息,GPS定位不返回地址信息。 country = amapLocation.getCountry();//国家信息 province = amapLocation.getProvince();//省信息 city = amapLocation.getCity();//城市信息 amapLocation.getDistrict();//城区信息 amapLocation.getStreet();//街道信息 amapLocation.getStreetNum();//街道门牌号信息 cityCode = amapLocation.getCityCode();//城市编码 Adcode = amapLocation.getAdCode();//地区编码 SimpleDateFormat df = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); Date date = new Date(amapLocation.getTime()); df.format(date);// 定位时间 } else { // 显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。 Log.e("AmapError", "location Error, ErrCode:" + amapLocation.getErrorCode() + ", errInfo:" + amapLocation.getErrorInfo()); } } } |
iii. 位置蓝点标记
通过onLocationChanged()方法获取经纬度值,然后调用moveCamera()来将地图位置显示移动到定位点,并用蓝点进行标记。
aMap.moveCamera(CameraUpdateFactory.changeLatLng(new LatLng(x,y))); // 标记点 try { locationMarker = aMap.addMarker(new MarkerOptions() .anchor(0.5f, 0.5f) .icon(BitmapDescriptorFactory .fromBitmap(BitmapFactory.decodeResource( getResources(), R.drawable.point4))) .position(new LatLng(x,y))); locationMarker.showInfoWindow(); } catch (Exception e) { // TODO: handle exception } |
iv. 位置信息显示
监听定位按钮,获取经纬度值,再监听显示按钮,将全局变量的经纬度值传给MessageActivity进行显示。
// 显示监听、 findViewById(R.id.show).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this,MessageActivity.class); intent.putExtra("mess_key","经度:" +y + "\n" + "纬度:" +x + "\n" + "定位精度:" +accuracy + "\n" +"国家:" +country + "\n" + "省份:" +province + "\n" +"城市:" +city + "\n" + "城市编号:" +cityCode + "\n" +"地区编号:" +Adcode + "\n" + "详细地址:" +address + "\n"); startActivity(intent); } }); |
public class MessageActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.message); String message = getIntent().getStringExtra("mess_key"); TextView show = (TextView) findViewById(R.id.message); show.setText(message); } } |
周边POI搜索
监听搜索按钮,通过定位点的经纬度的实时数据,检索周边5公里的信息,并将检索结果用标记标出,若没有搜索结果,则用Toast输出,其中需要写一个ToastUtil类来设置定位点的标记设置。
ToastUtil.java
public class ToastUtil { public static void show(Context context, String info) { Toast.makeText(context, info, Toast.LENGTH_LONG).show(); } public static void show(Context context,int info) { Toast.makeText(context, info, Toast.LENGTH_LONG).show(); } public static void showerror(Context context,int rCode) { try { switch (rCode) { // 服务错误码 …………………………(标记显示) } } catch (Exception e) { Toast.makeText(context, e.getMessage(), Toast.LENGTH_LONG).show(); } } } |
PoiSearchActivity.java
// AMap对象的初始化 private void init() { if (mAMap ==null) { mAMap = mapView.getMap(); // AMap对象的监事件 mAMap.setOnMapClickListener(this); mAMap.setOnMarkerClickListener(this); mAMap.setOnInfoWindowClickListener(this); mAMap.setInfoWindowAdapter(this); // 获取相关控件 TextView searchButton = (TextView) findViewById(R.id.btn_search); searchButton.setOnClickListener(this); x = getIntent().getDoubleExtra("x_key",x); y = getIntent().getDoubleExtra("y_key",x); lp=new LatLonPoint(x,y);//初始化位置 // 初始位置标记 locationMarker = mAMap .addMarker(new MarkerOptions() .anchor(0.5f, 0.5f) .icon(BitmapDescriptorFactory .fromBitmap(BitmapFactory.decodeResource( getResources(), R.drawable.point4))) .position( new LatLng(lp.getLatitude(),lp .getLongitude()))); locationMarker.showInfoWindow(); } setup(); // 显示摄像头的大小 mAMap.moveCamera(CameraUpdateFactory.newLatLngZoom( new LatLng(lp.getLatitude(),lp.getLongitude()), 14)); } private void setup() { mPoiDetail = (RelativeLayout) findViewById(R.id.poi_detail); mPoiDetail.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { } }); mPoiName = (TextView) findViewById(R.id.poi_name); mPoiAddress = (TextView) findViewById(R.id.poi_address); mSearchText = (EditText) findViewById(R.id.input_edittext); } protected void doSearchQuery() { // Trim() 函数的功能是去掉首尾空格 keyWord = mSearchText.getText().toString().trim(); currentPage = 0; // 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国) query = newPoiSearch.Query(keyWord,"", "孝感市"); query.setPageSize(20);// setting howmang itmes to return; query.setPageNum(currentPage);// setup query the first page; if (lp !=null) { poiSearch = new PoiSearch(this, query); poiSearch.setOnPoiSearchListener(this); // 设置搜索区域为以lp点为圆心,其周围5000米范围 poiSearch.setBound(newPoiSearch.SearchBound(lp, 5000,true)); poiSearch.searchPOIAsyn();//asyn search } } |