需要使用百度地图的服务,你必须先创建一个百度开发者账号。每个账号就可以创建20个可以使用服务的应用。
首先当然是导入库文件,在项目中建立libs文件夹,在libs文件夹下面建立armeabi文件夹。
将locSDK4.2.jar文件拷贝到工程的libs目录下,liblocSDK4d.so文件拷贝到libs/armeabi目录下。
每个应用需要一个密钥才能调用百度的服务,密钥的申请需要安全码。安全码是由数字签名+ ; + 包名组成。
数字签名可以点击windows->preference->android->build查看。包名可以直接查看android程勋的 manifest文件的根目录的package:属性。
获的服务密钥之后放入application节点中:
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="你所获取的密钥" />
声明service组件:
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote">
</service>
声明所需要的权限:
<!-- 这个权限用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!-- 这个权限用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!-- 用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!-- 访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET" />
<!—SD卡读取权限,用户写入离线定位数据-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
<!--允许应用读取低级别的系统日志文件 -->
<uses-permission android:name="android.permission.READ_LOGS"></uses-permission>
通过这些配置之后就可以编写定位代码了。
LocationClient定位功能主要的实现类是LocationClient类,调用LocationClient.start()方法, 开始定位,调用LocationClient.stop()方法结束定位。
当然没这么简单,还需要几个辅助类对LocationClient进行配置。
mLocationClient = ((LocationApplication)getApplication()).mLocationClient;
LocationMode tempMode = LocationMode.Hight_Accuracy; //定位模式精度
String tempcoor="gcj02"; //返回坐标类型
LocationClientOption option = new LocationClientOption(); //定位功能主要的配置类
option.setLocationMode(tempMode);<span style="white-space:pre"> </span>//设置定位模式
option.setCoorType(tempcoor);<span style="white-space:pre"> </span>//设置坐标返回类型
option.setScanSpan(1000);<span style="white-space:pre"> </span>//定位的间隔时间
option.setIsNeedAddress(true);<span style="white-space:pre"> </span>//返回结果是否包含地址信息
mLocationClient.setLocOption(option);<span style="white-space:pre"> </span>//把<span style="font-family: Arial, Helvetica, sans-serif;">LocationClientOption 放入LocationClient中</span>
或许已经发现LocationClient实例mLocationClient并不是通过新建获取的。
这是因为新建了LocationApplication类,此类继承了Application便于管理应用级别的变量。
获取LocationApplication中变量的方法((LocationApplication)getApplication());
使用前必须在manifest中添加相应的声明。
<application
android:name="com.example.unicom.LocationApplication"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
LocationApplication中新建LocationClient以及实现返回数据的监听(只要开始定位了,每隔设置的一段时间就会回调MyLocationListener,location为返回的数据类)。
mLocationClient = new LocationClient(this.getApplicationContext());
mMyLocationListener = new MyLocationListener();
mLocationClient.registerLocationListener(mMyLocationListener);
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
String longiAndLati = ""+location.getLongitude() +"," + location.getLatitude(); //经纬度
String address = location.getAddrStr(); //地址
Log.i("mapTest", "经纬度:" + longiAndLati + "\n地址:" + address);
LocationTask loginTask = new LocationTask();
}
}
地图功能的实现:
建立百度map组件:
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" />
使用SDKInitializer.initialize(getApplicationContext());初始化地图的组件。必须的,而且要在setContentView前面调用。(其实调用到这里就已经可以显示百度地图了)
但我这个项目需要根据经纬度显示位置,所以还有以下的操作。
初始化:
//地图初始化
mMapView = (MapView)findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
//搜索模块
mSearch = GeoCoder.newInstance();
mSearch.setOnGetGeoCodeResultListener(this); //设置监听事件
根据经纬度查询地址:
//先放纬度再放经度
LatLng ptCenter = new LatLng((Float.valueOf(LocaY)), (Float.valueOf(LocaX))); //使用经纬度初始化LaLng对象
// 反Geo搜索
mSearch.reverseGeoCode(new ReverseGeoCodeOption().location(ptCenter));<span style="white-space:pre"> </span>//开始搜索
实现的回调方法:
<span style="white-space:pre"> </span>@Override
public void onGetGeoCodeResult(GeoCodeResult arg0) {
// TODO Auto-generated method stub
}
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(EquipQueryActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG).show();
return;
}
mBaiduMap.clear();
mBaiduMap.addOverlay(new MarkerOptions().position(result.getLocation()).icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_marka));
mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(resultgetLocation()));
Toast.makeText(EquipQueryActivity.this, result.getAddress(),Toast.LENGTH_LONG).show();
}