优势:解决使用高德地图,百度地图等,无法在app处于后台时持续定位(比如service中)或者在后台定位一段时间后app被杀死的问题。主要思路就是循环播放非常短的一段无声音乐(由音乐app受启发)。
#implementation 'com.github.BLiYing:GaodeLiabrary:v2.0.0'
<service
android:name="com.example.gaodelibrary.GaodeLibraryService"
android:enabled="true"
android:exported="false"
/>
<uses-permission android:name="android.permission.WAKE_LOCK" />
UtilsContextOfGaode.init(this);
GaodeEntity gaodeEntity = new GaodeEntity("上下文");
//初始化定位相关参数
gaodeEntity.initLocation();
//开始定位
gaodeEntity.startLocation();
//关闭定位
gaodeEntity.closeLocation();
//参数说明:context上下文;startClass点击通知栏跳转的页面;resIdIcon通知栏图标;
//因为需要持续采集,所以用到了后台服务,必须告知用户;
GaodeEntity gaodeEntity = new GaodeEntity(Context context, Class<?> startClass,int resIdIcon);
//开始采集轨迹,此方法中处理了手机休眠和切换应用后app可能被杀死导致应用无法持续采集轨迹问题;
gaodeEntity.startTrace();
//停止采集
gaodeEntity.stopTrace();
OnGaodeLibraryListen.LocationListen得到AMapLocation对象;
获取AMapLocation后,可以过滤掉你不需要的点,比如
//速度为0时不进行业务运算
float speed = aMapLocation.getSpeed();
if (speed == 0) {
return;
}
//精度大于100米的点不进行业务运算
float accuracy = aMapLocation.getAccuracy();
if (accuracy > 100) {
return;
}
如果需要实时画线,声明一个List<LatLng>数组变量trackPoints来容纳轨迹点LatLng;
画线方法:
trackPoints.add(currentLatLng);
//库中自带setUpMap(trackPoints)方法可参考,由于v2.0.0版本去掉了2d和3d地图包,只能自己单独实现;
距离方法:
//计算上一个经纬度和下一个经纬度距离然后叠加
float distance = AMapUtils.calculateLineDistance(lastLatLng, currentLatLng);
/**
* 道格拉斯-普克算法抽稀之后上传,可以显著压缩采集点数量同时不影响轨迹显示,
* 节约一定的上传流量,保持手持端和web端显示一致
*/
Douglas douglas = new Douglas(new ArrayList<>(trackPoints), 2);
ArrayList<LatLng> latLngs_compress = douglas.compress();
boolean is_xiaomi = OSUtils.ROM_TYPE.MIUI.name().equals(OSUtils.getRomType().name());
boolean hasset = SPUtils.getInstance(ResUtils.getContext()).getBoolean("go_set", false);
if (is_xiaomi && !hasset) {
android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder(this);
builder.setTitle(R.string.xiaomiMind);
builder.setMessage(“为了不影响您的应用使用轨迹功能时退到后台无法使用定位功能,小米手机需要手动开启后台配置--选择 无限制”);
builder.setCancelable(false);
builder.setPositiveButton(R.string.go_set, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
SPUtils.getInstance(ResUtils.getContext()).putBoolean("go_set", true);
XiaomiDeviceUtil.toConfigApp(StartInspectionActivity.this, XiaomiDeviceUtil.getAppProcessName(ResUtils.getContext()), getString(R.string.app_name));
}
});
builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
builder.create().show();
}