开启轨迹上报 最后更新时间: 2023年12月15日
使用猎鹰sdk前,需要在AndroidManifest.xml文件中进行相关权限设置,确保功能可以正常使用。
第一步,配置AndroidManifest.xml
首先,声明权限:
<!--用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!--用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!--获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!--这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!--用于访问网络-->
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<!--写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!--用于申请调用A-GPS模块-->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
<!--用于申请获取蓝牙信息进行室内定位-->
<uses-permission android:name="android.permission.BLUETOOTH"></uses-permission>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>
然后,设置高德Key
在application标签下加入如下内容:
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="您的Key"/>
在AndroidManifest.xml中声明Service:
<service android:name="com.amap.api.track.AMapTrackService" />
<service android:name="com.amap.api.location.APSService" />
第二步,初始化猎鹰sdk服务类
请在主线程中创建AMapTrackClient类对象,需要传Context类型的参数,推荐用getApplicationContext()方法获取全进程有效的Context。
final AMapTrackClient aMapTrackClient = new AMapTrackClient(getApplicationContext());
第三步,配置猎鹰sdk
配置定位采集周期和上报周期
猎鹰sdk默认的定位信息采集周期是2s,默认的上报周期是20s,也就是最快2s记录一次当前位置信息(若位置没有变化,这次位置信息会被忽略),20s上报一次记录下的这些信息。
可以使用AMapTrackClient的setInterval方法修改该配置,注意定位信息采集周期的范围应该是1s~60s,上报周期的范围是采集周期的5~50倍。
下面的代码将定位信息采集周期设置为5s,上报周期设置为30s:
aMapTrackClient.setInterval(5, 30);
配置本地缓存大小
猎鹰sdk会在无法正常上报轨迹点时将未成功上报的轨迹点缓存在本地,默认最多缓存50MB数据。
可以使用下面的代码修改缓存大小为20MB:
aMapTrackClient.setCacheSize(20);
配置定位模式
猎鹰sdk默认使用高精度定位模式进行定位,以此收集位置信息。
可以使用下面的代码修改定位模式为仅设备定位,既仅使用GPS定位:
aMapTrackClient.setLocationMode(LocationMode.DEVICE_SENSORS);
第四步,创建用于接收猎鹰sdk服务启停状态的监听器
要开启定位采集,需要首先启动轨迹上报服务,等服务启动成功后才能开启定位采集,下面创建的监听器在轨迹上报服务启动成功后立即开启了定位采集:
final OnTrackLifecycleListener onTrackLifecycleListener = new OnTrackLifecycleListener() {
...
@Override
public void onStartGatherCallback(int status, String msg) {
if (status == ErrorCode.TrackListen.START_GATHER_SUCEE ||
status == ErrorCode.TrackListen.START_GATHER_ALREADY_STARTED) {
Toast.makeText(TestDemo.this, "定位采集开启成功!", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(TestDemo.this, "定位采集启动异常," + msg, Toast.LENGTH_SHORT).show();
}
}
@Override
public void onStartTrackCallback(int status, String msg) {
if (status == ErrorCode.TrackListen.START_TRACK_SUCEE ||
status == ErrorCode.TrackListen.START_TRACK_SUCEE_NO_NETWORK ||
status == ErrorCode.TrackListen.START_TRACK_ALREADY_STARTED) {
// 服务启动成功,继续开启收集上报
aMapTrackClient.startGather(this);
} else {
Toast.makeText(TestDemo.this, "轨迹上报服务服务启动异常," + msg, Toast.LENGTH_SHORT).show();
}
}
};
第五步,获取终端id,启动上报
在启动轨迹上报服务时,需要提供服务id及终端id,创建一个TrackParam对象,使用该对象作为参数调用startTrack方法。
服务的创建请参考猎鹰rest api接口,猎鹰sdk不提供创建服务方法。
每个终端都对应您的业务中一个唯一的实体,在该终端第一次启动轨迹上报服务前,应该首先使用一个唯一标识该终端的名称创建该终端,获取终端id;若该终端不是第一次启动轨迹上报服务,则可以直接使用终端名称查询对应终端id。
下面的代码首先查询当前终端是否已经创建过,若没有则创建,然后使用终端id启动轨迹上报和定位采集服务。
final long serviceId = 2260; // 这里填入你创建的服务id
final String terminalName = "user-123"; // 唯一标识某个用户或某台设备的名称
aMapTrackClient.queryTerminal(new QueryTerminalRequest(serviceId, terminalName), new OnTrackListener() {
...
@Override
public void onQueryTerminalCallback(QueryTerminalResponse queryTerminalResponse) {
if (queryTerminalResponse.isSuccess()) {
if (queryTerminalResponse.getTid() <= 0) {
// terminal还不存在,先创建
aMapTrackClient.addTerminal(new AddTerminalRequest(terminalName, serviceId), new OnTrackListener() {
...
@Override
public void onCreateTerminalCallback(AddTerminalResponse addTerminalResponse) {
if (addTerminalResponse.isSuccess()) {
// 创建完成,开启猎鹰服务
long terminalId = addTerminalResponse.getTid();
aMapTrackClient.startTrack(new TrackParam(serviceId, terminalId), onTrackLifecycleListener);
} else {
// 请求失败
Toast.makeText(TestDemo.this, "请求失败," + addTerminalResponse.getErrorMsg(), Toast.LENGTH_SHORT).show();
}
}
});
} else {
// terminal已经存在,直接开启猎鹰服务
long terminalId = queryTerminalResponse.getTid();
aMapTrackClient.startTrack(new TrackParam(serviceId, terminalId), onTrackLifecycleListener);
}
} else {
// 请求失败
Toast.makeText(TestDemo.this, "请求失败," + queryTerminalResponse.getErrorMsg(), Toast.LENGTH_SHORT).show();
}
}
});