安卓百度地图LBS
实现目标
根据官方文档,开发百度地图定位APP,显示出当前位置坐标。
步骤
1.创建工程(Myapplication)
2.登录百度开发者账号创建应用
进入API控制台后,点击创建应用,开始填写相关信息,并最终获得AK。
使用 keytool(jdk自带工具)获取发布版SHA1(本机的安卓指纹码):
a. 打开Android Studio,进入Terminal工具:
b.输入命令(默认密码为android)
成功获取SHA1:
c. 获取PackageName
创建成功
3.添加SDK(jar + so)通过Gradle 集成sdk
SDK下载
sdk下载地址
导入jar包
添加so文件
至项目中:
4.添加AK
在清单文件里,在Activity组件注册的代码后,添加注册远程服务和配置应用Key的代码:
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="此处填写自己项目的AK" />
5.清单文件
在清单文件中,需要注册权限
<!-- 这个权限用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!-- 这个权限用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET"/>
6.activity_map_loc.xml
界面布局使用帧布局,包含有地图视图控件和单选控件,activity_map_loc.xml的完整代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical">
<RadioGroup
android:id="@+id/rg_id"
android:layout_width="match_parent"
android:layout_height="55dp"
android:gravity="center"
android:orientation="horizontal">
<RadioButton
android:id="@+id/rb_map1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/map1"/>
<RadioButton
android:id="@+id/rb_map2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/map2"/>
<RadioButton
android:id="@+id/rb_map3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/map3"/>
<RadioButton
android:id="@+id/rb_map4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/map4"/>
</RadioGroup>
<com.baidu.mapapi.map.MapView
android:id="@+id/mv_loc"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".map_locate.MapLocActivity">
</com.baidu.mapapi.map.MapView>
</LinearLayout>
7.MapLocActivity.java
百度地图应用,包含定位信息和地图显示
一般需要打开定位服务,选择高精度定位模式,有网络连接
需要在清单文件里使用百度云服务(参见清单文件service标签)
需要创建应用(模块)的Key,并写入清单文件(参见清单文件meta标签)
public class MapLocActivity extends AppCompatActivity {
public LocationClient mLocationClient = null;
private MapView mapView=null;
private BaiduMap baiduMap=null;
private MyLocationListner myListner = new MyLocationListner();
private RadioGroup rg;
private RadioButton rb_map1,rb_map2,rb_map3,rb_map4;
LocationClientOption option = new LocationClientOption();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map_loc);
judgePermission();
}
private void judgePermission() {
if(ActivityCompat.checkSelfPermission(this, Manifest
.permission.ACCESS_FINE_LOCATION)!= PackageManager
.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,new String[]
{Manifest.permission.ACCESS_FINE_LOCATION},1);
}
else{
requstLocation();
}
}
private void requstLocation() {
initLocation();
mLocationClient.start();
//mLocationClient为第二步初始化过的LocationClient对象
//调用LocationClient的start()方法,便可发起定位请求
}
private void initLocation() {
mLocationClient = new LocationClient(getApplicationContext());
//声明LocationClient类
mLocationClient.registerLocationListener(myListner);
//注册监听函数
SDKInitializer.initialize(getApplicationContext());
mapView = findViewById(R.id.mv_loc);
rg=findViewById(R.id.rg_id);
rb_map1=findViewById(R.id.rb_map1);
rb_map2=findViewById(R.id.rb_map2);
rb_map3=findViewById(R.id.rb_map3);
rb_map4=findViewById(R.id.rb_map4);
baiduMap = mapView.getMap();
baiduMap.setMyLocationEnabled(true);
rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup rg, int isChecked) {
selectMap();
}
});
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
//可选,设置定位模式,默认高精度
//LocationMode.Hight_Accuracy:高精度;
//LocationMode. Battery_Saving:低功耗;
//LocationMode. Device_Sensors:仅使用设备;
option.setCoorType("bd09ll");
//可选,设置返回经纬度坐标类型,默认GCJ02
//GCJ02:国测局坐标;
//BD09ll:百度经纬度坐标;
//BD09:百度墨卡托坐标;
//海外地区定位,无需设置坐标类型,统一返回WGS84类型坐标
option.setScanSpan(1000);
//可选,设置发起定位请求的间隔,int类型,单位ms
//如果设置为0,则代表单次定位,即仅定位一次,默认为0
//如果设置非0,需设置1000ms以上才有效
option.setOpenGps(true);
//可选,设置是否使用gps,默认false
//使用高精度和仅用设备两种定位模式的,参数必须设置为true
option.setLocationNotify(true);
//可选,设置是否当GPS有效时按照1S/1次频率输出GPS结果,默认false
option.setIgnoreKillProcess(false);
//可选,定位SDK内部是一个service,并放到了独立进程。
//设置是否在stop的时候杀死这个进程,默认(建议)不杀死,即setIgnoreKillProcess(true)
option.SetIgnoreCacheException(false);
//可选,设置是否收集Crash信息,默认收集,即参数为false
option.setWifiCacheTimeOut(5*60*1000);
//可选,V7.2版本新增能力
//如果设置了该接口,首次启动定位时,会先判断当前Wi-Fi是否超出有效期,若超出有效期,会先重新扫描Wi-Fi,然后定位
option.setEnableSimulateGps(false);
//可选,设置是否需要过滤GPS仿真结果,默认需要,即参数为false
option.setNeedNewVersionRgc(true);
//可选,设置是否需要最新版本的地址信息。默认需要,即参数为true
mLocationClient.setLocOption(option);
//mLocationClient为第二步初始化过的LocationClient对象
//需将配置好的LocationClientOption对象,通过setLocOption方法传递给LocationClient对象使用
//更多LocationClientOption的配置,请参照类参考中LocationClientOption类的详细说明
}
private void selectMap() {
RadioButton rb_map = (RadioButton)findViewById(rg.getCheckedRadioButtonId());
if (rb_map==rb_map1){// //普通地图 ,mBaiduMap是地图控制器对象
baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
baiduMap.setTrafficEnabled(false);
baiduMap.setBaiduHeatMapEnabled(false);
}
else if(rb_map==rb_map2){//卫星地图
baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
baiduMap.setTrafficEnabled(false);
baiduMap.setBaiduHeatMapEnabled(false);
}
else if(rb_map==rb_map3){//开启交通图
baiduMap.setTrafficEnabled(true);
baiduMap.setBaiduHeatMapEnabled(false);
}
else if(rb_map==rb_map4){//开启热力图
baiduMap.setTrafficEnabled(false);
baiduMap.setBaiduHeatMapEnabled(true);}
}
public class MyLocationListner extends BDAbstractLocationListener {
boolean isFirstLocate = true;
@Override
public void onReceiveLocation(BDLocation location) {
//此处的BDLocation为定位结果信息类,通过它的各种get方法可获取定位相关的全部结果
//以下只列举部分获取经纬度相关(常用)的结果信息
//更多结果信息获取说明,请参照类参考中BDLocation类中的说明
double latitude = location.getLatitude(); //获取纬度信息
double longitude = location.getLongitude(); //获取经度信息
float radius = location.getRadius(); //获取定位精度,默认值为0.0f
String coorType = location.getCoorType();
//获取经纬度坐标类型,以LocationClientOption中设置过的坐标类型为准
int errorCode = location.getLocType();
//获取定位类型、定位错误返回码,具体信息可参照类参考中BDLocation类中的说明
if (location.getLocType() == BDLocation.TypeGpsLocation || location.getLocType() == BDLocation.TypeNetWorkLocation) {
navigateTo(location);
}
}
private void navigateTo(BDLocation location) {
if(isFirstLocate){
LatLng ll = new LatLng(location.getLatitude(),location.getLongitude());
MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);
baiduMap.animateMapStatus(update);
isFirstLocate = false;
}
//显示位置信息
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(location.getDirection()).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
baiduMap.setMyLocationData(locData);
}
}
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mapView.onResume();
}
@Override
protected void onDestroy() {
super.onDestroy();
mLocationClient.stop();
mapView.onDestroy();
}
}
8.结果展示
安卓百度地图集成结果演示