徐州艾克峰网络科技
最近在徐州开发APP的时候遇到需要使用定位的情况。考虑到该APP的使用范围还是在国内GOOGLE的定位服务由于众所周知的原因不能使用。所以还是使用百度的吧。
目前百度定位SDK已经升级到7.0了。使用过程大概如下。
0.申请一个key
1.引用相应的包
2.开始定位。
好了大家别打了,我知道这就像是要把大象装冰箱拢共分几步一样。下面我来详细的说一下每一步都是怎么做的。
0.申请key
0.0 去这个地址http://lbsyun.baidu.com/。点击申请秘钥回来到这样一个界面
这里面最难填的是SHA1了。因为百度官方讲的也不是很详细。我就多啰嗦几句。
我用的AS的环境。在 Android Studio下要想获得SHA1那么就必须要先给这个APP一个签名操作步骤如下:
点击这个Generate Signed APK 到这个界面
如果你程序从来没有过签名的话那么就点击Create New
点击OK以后输入密码NEXT
进入这一步了。刚才创建的签名所在的位置和编译的类型。这里有两个选项一个是debug一个是release 就是开发版和发布版的区别。记住你选择的选项,后面会用到。点击finish一般就成功签名了自己的APP了。好有成就感啊!感觉自己也是一个有身份证的人了!
下面就是最重要的步骤了咱们要获取SHA1签名了。看看这个APP的身份证号是多少吧。
在android studio的最下面有一个Terminal点一下就进入了神秘的命令行了。
在里面找到你JRE的目录
cd C:\Program Files\Java\jre7\bin 一般都是这么目录。看你安装到什么地方去了。
然后你就输入这个命令。我故意切图的。你们试着自己敲一下。-keystore 后面是我的这个秘钥所放的位置。就是前面你们设置的位置。
密钥库的口令默认是android
然后你们就能看到一大段乱七八糟的东西
找到SHA1这一行。把这一行复制一下。到目前为止我们就已经取到了签名的SHA1了。鼓掌!!!!!!!
找到了SHA1以后就填到刚才申请百度定位SDK的KEY时需要填写的地方。你很聪明。有两行一个是发布版一个是开发版。还记得刚才让大家记住的debug和release吗?就是对应这里的发布版和开发版,都填上一样的吧,我反正是这么做的。点击提交!很好。你已经获取了自己的KEY了!徐州 APP 开发 艾克峰
1.引用包
获取KEY以后当然就要开始用咯。还是以Android Studio为例。因为百度定位SDK包含了很多的SO文件。那么在配置的时候需要让AS明白去哪引用。那么就需要添加如下代码
找到这个位置点一下
然后在android {}下面添加如下代码
android{
...
sourceSets {
main() {
jniLibs.srcDirs = [
'libs']
}
}
...
}
完成as去哪找SO文件以后。把JAR包也拷贝进来引用。
然后设置AndroidManifest.xml
在application标签中声明service组件,每个app拥有自己单独的定位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
>
设置AcessKey
<meta
-data
android
:name="com.baidu.lbsapi.API_KEY"
android
:value
="key" /> //key:开发者申请的key
以上我们就把基本环境配置好了。下面我们开始写程序吧。
2.开始定位
在activity中我们需要做如下操作
public LocationClient mLocationClient
= null;
public BDLocationListener myListener
= new MyLocationListener
();
public void onCreate
() {
mLocationClient
= new LocationClient
(getApplicationContext
()); //声明LocationClient类
mLocationClient.
registerLocationListener( myListener
); //注册监听函数 initLocation(); //使用初始化
mLocationClient.start();开始定位
}
private void initLocation
(){
LocationClientOption option
= new LocationClientOption
();
option.
setLocationMode(LocationMode.
Hight_Accuracy
);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
option.
setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系
int span
=1000;
option.
setScanSpan(span
);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
option.
setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
option.
setOpenGps(true);//可选,默认false,设置是否使用gps
option.
setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
option.
setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
option.
setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
option.
setIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
option.
SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
option.
setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要
mLocationClient.
setLocOption(option
);
}
public class MyLocationListener
implements BDLocationListener
{
@Override
public void onReceiveLocation
(BDLocation location
) {
//Receive Location
StringBuffer sb
= new StringBuffer(256);
sb.
append("time : ");
sb.
append(location.
getTime());
sb.
append("\nerror code : ");
sb.
append(location.
getLocType());
sb.
append("\nlatitude : ");
sb.
append(location.
getLatitude());
sb.
append("\nlontitude : ");
sb.
append(location.
getLongitude());
sb.
append("\nradius : ");
sb.
append(location.
getRadius());
if (location.
getLocType() == BDLocation.
TypeGpsLocation){// GPS定位结果
sb.
append("\nspeed : ");
sb.
append(location.
getSpeed());// 单位:公里每小时
sb.
append("\nsatellite : ");
sb.
append(location.
getSatelliteNumber());
sb.
append("\nheight : ");
sb.
append(location.
getAltitude());// 单位:米
sb.
append("\ndirection : ");
sb.
append(location.
getDirection());// 单位度
sb.
append("\naddr : ");
sb.
append(location.
getAddrStr());
sb.
append("\ndescribe : ");
sb.
append("gps定位成功");
} else if (location.
getLocType() == BDLocation.
TypeNetWorkLocation){// 网络定位结果
sb.
append("\naddr : ");
sb.
append(location.
getAddrStr());
//运营商信息
sb.
append("\noperationers : ");
sb.
append(location.
getOperators());
sb.
append("\ndescribe : ");
sb.
append("网络定位成功");
} else if (location.
getLocType() == BDLocation.
TypeOffLineLocation) {// 离线定位结果
sb.
append("\ndescribe : ");
sb.
append("离线定位成功,离线定位结果也是有效的");
} else if (location.
getLocType() == BDLocation.
TypeServerError) {
sb.
append("\ndescribe : ");
sb.
append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因");
} else if (location.
getLocType() == BDLocation.
TypeNetWorkException) {
sb.
append("\ndescribe : ");
sb.
append("网络不同导致定位失败,请检查网络是否通畅");
} else if (location.
getLocType() == BDLocation.
TypeCriteriaException) {
sb.
append("\ndescribe : ");
sb.
append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");
}
sb.
append("\nlocationdescribe : ");
sb.
append(location.
getLocationDescribe());// 位置语义化信息
List
<Poi
> list
= location.
getPoiList();// POI数据
if (list
!= null) {
sb.
append("\npoilist size = : ");
sb.
append(list.
size());
for (Poi p
: list
) {
sb.
append("\npoi= : ");
sb.
append(p.
getId() + " " + p.
getName() + " " + p.
getRank());
}
}
Log.
i("BaiduLocationApiDem", sb.
toString());
}
然后你们就会在LOG中看到自己的定位。是不是很神奇?
转载请注明原文地址: https://ju.6miu.com/read-1304230.html