相关概念
service
一个Service(即鹰眼轨迹服务)对应一个轨迹管理系统,一个service里可管理多个终端设备(即entity),service的唯一标识符是service_id。例如,针对某出租车公司的轨迹管理系统,可以创建一个service,在其中管理所有出租车的轨迹。
entity
一个entity代表现实中一个被追踪轨迹的终端设备,它可以是一个人、一辆车或者任何运动物体。同一个service中,entity以entity_name作为唯一标识。查询轨迹也是通过entity_name来获取对应的轨迹数据。
track
entity移动所产生的连续轨迹被称为track,track由一系列轨迹点(point)组成。一个轨迹称为一个track。
前置准备
主要是创建应用获取对应的AK以及创建鹰眼管理服务。
获取AK
创建输入应用名,包名,以及发布版的SHA1值。
通过命令来获取发布版的SHA1值
1.打开Android Studio的命令窗口
2.输入
keytool -list -v -keystore 签名文件的路径
命令
demo:keytool -list -v -keystore sign.jks
点击提交后,就可以看到应用对应的AK的,后面代码部分会用到的。
创建鹰眼服务
创建鹰眼服务地址
点击地址进入百度鹰眼服务管理,点击创建服务,输入对应的数据。
创建成功后,会生成一个Service ID,后面代码部分会用到。
工程配置
Android 鹰眼轨迹SDK下载地址
1.解压下载的SDK文件,将各架构的SO文件置于APP对应架构下的文件夹中,将jar文件拷贝到工程的libs目录下
注意:若使用鹰眼的图像存储功能,需导入bos-android-sdk-1.0.2.jar,如果只使用轨迹,只需要BaiduTraceSDK_v3_0_7.jar
2.配置AndroidManifest.xml
声明service组件
<!--鹰眼轨迹服务-->
<service
android:name="com.baidu.trace.LBSTraceService"
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>
<!-- 写入扩展存储,向扩展卡写入数据,用于写入对象存储BOS数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!-- 访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<!-- SD卡读取权限,用于写入对象存储BOS数据-->
设置AccessKey
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="AK" /> 上面创建应用生成的的Key
3.代码实现
/**
* Trace管理工具类
*/
object TraceManager {
private val serviceId : Long = 205748
//轨迹的唯一标识
private var entityName : String = "myTrace"
// 定位周期(单位:秒)
private val gatherInterval = 5
//打包回传周期(单位:秒)
private val packInterval = 10
// 是否需要对象存储服务,默认为:false,关闭对象存储服务。
private val isNeedObjectStorage = false
//轨迹服务是否开启,false:关闭;true:开启
private var isTraceStart = false
private lateinit var mTrace : Trace
private lateinit var mTraceClient : LBSTraceClient
private lateinit var mTraceListener: OnTraceListener
/**
* 初始化操作
* @param context Context
*/
fun init(context: Context){
mTraceClient = LBSTraceClient(context)
mTraceClient.setInterval(gatherInterval, packInterval)
mTraceClient.setLocationMode(LocationMode.High_Accuracy)
mTraceClient.setProtocolType(ProtocolType.HTTP)
mTrace = Trace(serviceId, entityName, isNeedObjectStorage)
initTraceListener()
}
/**
* 初始化轨迹监听接口
*/
private fun initTraceListener() {
mTraceListener = object : OnTraceListener {
override fun onStartGatherCallback(status: Int, message: String) {
}
override fun onBindServiceCallback(status: Int, message: String) {
}
override fun onInitBOSCallback(status: Int, message: String) {
}
override fun onStopGatherCallback(status: Int, message: String) {
}
override fun onPushCallback(status: Byte, message: PushMessage) {
}
override fun onStartTraceCallback(status: Int, message: String) {
//启动Trace服务成功
if(status == StatusCodes.SEARCHING || status >= StatusCodes.START_TRACE_NETWORK_CONNECT_FAILED){
//开始采集轨迹数据,只有Trace服务启动成功后,才能开始采集,否则轨迹功能不成功
isTraceStart = true
mTraceClient.startGather(mTraceListener)
}
}
override fun onStopTraceCallback(status: Int, message: String) {
//CACHE_TRACK_NOT_UPLOAD:服务停止成功,但是没有轨迹数据没有上传
if(status == StatusCodes.SUCCESS || status == StatusCodes.CACHE_TRACK_NOT_UPLOAD){
isTraceStart = false
}
}
}
}
/**
* 开始轨迹记录
*/
fun startTrace(){
mTraceClient.startTrace(mTrace, mTraceListener)
}
/**
* 结束轨迹记录
*/
fun stopTrace(){
if(isTraceStart){//服务已经开启
mTraceClient.stopTrace(mTrace, mTraceListener)
mTraceClient.stopGather(mTraceListener)
}
}
}
注意:mTraceClient.startGather(mTraceListener)
采集必须开启轨迹服务成功后才能启动,否则采集失败。把该代码放入监听回调中。
可能会遇到错误码=10001的情况,一般是AK校验失败,还有一种情况就是当天的配额已用完(如果使用的是个人的)
网友评论