百度地图使用记录

百度开发文档

获取密匙

参考官方文档

 

AS配置环境

添加SDK(jar + so)

注意,Android定位SDK提供了多种CPU架构的so文件(jar通用,只有一个),开发者可根据实际使用需求,放置所需so到对应的工程文件夹内。

下图为Android定位SDK文件结构示意图:

buildas1.png

下图为Android定位SDK放置到Android工程中的示意图,这里仅以armeabi为例:

buildas2.png

注意:

1. 如果开发的是系统应用,除了需要在工程中配置so文件,还需要手动把对应架构的so文件拷贝到/system/lib下,如果是64位系统,则需要将64位的so文件拷贝到/sytem/lib64下。

2. 新版本的定位SDK,开发者除了要更新jar包之外,同时需要关注so文件是否有更新。如果so文件名称改变,即so文件有更新,开发者要及时替换掉老版本,否则会导致定位失败。

 

配置build.gradle文件

配置build.gradle文件,注意设置sourceSets。

sourceSets{
        main{
                 jnilibs.srcDir 'libs'
                 jni.srcDirs = []    //disable automatic ndk-build
         }
}

dependencies {
        compile fileTree(dir:  'libs' , include: ['*.jar'])
        androidTestCompile ('com.android.support.test.espresso: espresso-core: 2.2.2', {
                  exclude group: 'com.android.support',  module: 'support-annotations'
         })
        compile 'com.android.support: appcompat-v7:25.1.0'
        testCompile 'junit: junit: 4.12'
}

添加AK

Android定位SDK自v4.0版本起,需要进行AK鉴权。开发者在使用SDK前,需完成AK申请,并在AndroidManifest.xml文件中,正确填写AK。

在Application标签中增加如下代码:

<meta-data
    android:name="com.baidu.lbsapi.API_KEY"
    android:value="AK" >
</meta-data>

添加定位权限

使用定位SDK,需在Application标签中声明service组件,每个App拥有自己单独的定位service,代码如下:

<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"> </service>

除添加service组件外,使用定位SDK还需添加如下权限:

    <!-- 这个权限用于进行网络定位-->
    <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.READ_PHONE_STATE"/>
    <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <!-- 访问网络,网络定位需要上网-->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- SD卡读取权限,用户写入离线定位数据-->
    <!--需要动态申请-->
    <!--<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />-->

动态申请权限处理


//    动态申请
public void checkPermission(Activity activity) {
        if (ContextCompat.checkSelfPermission(activity,Manifest.permission.ACCESS_FINE_LOCATION)!=PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},DataUtil.LOCATION_PERMISSION);
        }else {
           if (callBack!=null){
               callBack.startLocation();
           }
        }
    }

//    申请结果回调
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode==DataUtil.LOCATION_PERMISSION){
            if (grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
                Log.i(TAG, "onRequestPermissionsResult: true");
                if (callBack!=null){
                    callBack.startLocation();
                }
            }else {
                Log.i(TAG, "onRequestPermissionsResult: false");
                ToastUtil.showToast("请授权定位服务");
            }
        }
    }

初始化

 

//定位服务的客户端。宿主程序在客户端声明此类,并调用,目前只支持在主线程中启动
 LocationClient locationClient = new LocationClient(getApplicationContext());
//百度地图sdk初始化
SDKInitializer.initialize(getApplicationContext());

 

获取定位

注册监听

public LocationClient mLocationClient = null;
private MyLocationListener myListener = new MyLocationListener();
//BDAbstractLocationListener为7.2版本新增的Abstract类型的监听接口
//原有BDLocationListener接口暂时同步保留。具体介绍请参考后文第四步的说明
public void onCreate() {
    mLocationClient = new LocationClient(getApplicationContext());     
    //声明LocationClient类
    mLocationClient.registerLocationListener(myListener);    
    //注册监听函数
}

配置定位参数

LocationClientOption option = new LocationClientOption();

option.setLocationMode(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
	
mLocationClient.setLocOption(option);
//mLocationClient为第二步初始化过的LocationClient对象
//需将配置好的LocationClientOption对象,通过setLocOption方法传递给LocationClient对象使用
//更多LocationClientOption的配置,请参照类参考中LocationClientOption类的详细说明

实现BDAbstractLocationListener接口

 @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类中的说明
    }
}

获取定位经纬度

mLocationClient.start();
//mLocationClient为第二步初始化过的LocationClient对象
//调用LocationClient的start()方法,便可发起定位请求

start():启动定位SDK;stop():关闭定位SDK。调用start()之后只需要等待定位结果自动回调即可。

开发者定位场景如果是单次定位的场景,在收到定位结果之后直接调用stop()函数即可。

如果stop()之后仍然想进行定位,可以再次start()等待定位结果回调即可。

自V7.2版本起,新增LocationClient.reStart()方法,用于在某些特定的异常环境下重启定位。

如果开发者想按照自己逻辑请求定位,可以在start()之后按照自己的逻辑请求LocationClient.requestLocation()函数,会主动触发定位SDK内部定位逻辑,等待定位回调即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值