首页 > 代码库 > 百度地图(SDK v3.1.1)和百度定位(SDKv4.2)的实现!

百度地图(SDK v3.1.1)和百度定位(SDKv4.2)的实现!

</pre>需要使用百度地图的服务,你必须先创建一个百度开发者账号。每个账号就可以创建20个可以使用服务的应用。<p></p><p><span style="color:rgb(98,98,98); font-family:微软雅黑,Helvetica,Arial,sans-serif; line-height:20px">armeabi文件夹。</span>首先当然是导入库文件,在项目中建立libs文件夹,在libs文件夹下面建立</p><p><span style="color:rgb(98,98,98); font-family:微软雅黑,Helvetica,Arial,sans-serif; line-height:20px"><span style="color:rgb(98,98,98); font-family:微软雅黑,Helvetica,Arial,sans-serif; line-height:20px">将locSDK4.2.jar文件拷贝到工程的libs目录下,<span style="color:rgb(98,98,98); font-family:微软雅黑,Helvetica,Arial,sans-serif; line-height:20px">liblocSDK4d.so文件拷贝到libs/armeabi目录下。</span></span></span></p><p>每个应用需要一个密钥才能调用百度的服务,密钥的申请需要安全码。</p><p>安全码是由数字签名+ ; + 包名组成。 数字签名可以点击windows->preference->android->build查看。包名可以直接查看android程勋的 manifest文件的根目录的package:属性。</p><p>获的服务密钥之后放入application节点中:</p><p></p><pre code_snippet_id="492618" snippet_file_name="blog_20141022_2_6633639" name="code" class="html"><meta-data
 <span style="white-space:pre">	</span>android:name="com.baidu.lbsapi.API_KEY"
        android:value=http://www.mamicode.com/"你所获取的密钥" />
声明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();
	}







百度地图(SDK v3.1.1)和百度定位(SDKv4.2)的实现!