示例中心
功能在线体验
控制台

高德 开发 Android 猎鹰SDK 开发指南 轨迹上报 开启轨迹上报

更新时间:2018年09月17日

使用猎鹰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.READ_PHONE_STATE"></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"/>

点我获取Key

点我查看Key注册时必要数据SHA1和包名的获取方法

在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();
        }
    }
});


示例中心 功能
在线体验
常见问题