fix: 修改定位方式

This commit is contained in:
2022-12-14 10:50:55 +08:00
parent f04b2a5892
commit 390d3d435c
12 changed files with 307 additions and 116 deletions

View File

@@ -12,7 +12,7 @@ android {
applicationId "com.navinfo.outdoor" applicationId "com.navinfo.outdoor"
minSdkVersion 24 minSdkVersion 24
targetSdkVersion 30 targetSdkVersion 30
versionCode 36 versionCode 38
versionName "8.221207" versionName "8.221207"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
} }

View File

@@ -196,8 +196,6 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic
private TextureMapView tvMapView; private TextureMapView tvMapView;
private SystemTTS systemTTS; private SystemTTS systemTTS;
private List<Removable> trackLocRemovables/*用户轨迹图标marker*/; private List<Removable> trackLocRemovables/*用户轨迹图标marker*/;
private GPSUtils gpsUtils;
private Location gpsLocation;
private boolean isMapSlide = false; // 地图是否为靠在侧边的小图模式 private boolean isMapSlide = false; // 地图是否为靠在侧边的小图模式
private ImageView ivZoomAdd/*zoom放大*/, ivZoomDel/*zoom缩小*/, ivLocation/*定位按钮*/, private ImageView ivZoomAdd/*zoom放大*/, ivZoomDel/*zoom缩小*/, ivLocation/*定位按钮*/,
ivPicRoadImage/*道路拍摄水平线*/, ivPicVideoImage/*视频拍摄水平线*/; ivPicRoadImage/*道路拍摄水平线*/, ivPicVideoImage/*视频拍摄水平线*/;
@@ -308,13 +306,6 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic
ivPicVideoImage.setVisibility(View.GONE); ivPicVideoImage.setVisibility(View.GONE);
trackLocRemovables = new ArrayList<>(); trackLocRemovables = new ArrayList<>();
gpsUtils = new GPSUtils(AutoTakePictureActivity.this);
gpsUtils.setOnClickGPSStatus(new GPSUtils.OnClickGPSStatus() {
@Override
public void onGpsCount(int count) {
satelliteCount = count;
}
});
// 清空所有匹配的数据 // 清空所有匹配的数据
btnClearMatch.setOnClickListener(new View.OnClickListener() { btnClearMatch.setOnClickListener(new View.OnClickListener() {
@@ -585,7 +576,7 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic
recorder.setTime(Long.parseLong(file.getName())); recorder.setTime(Long.parseLong(file.getName()));
recorder.setTencentLocationX(Constant.currentLocation.getLongitude()); recorder.setTencentLocationX(Constant.currentLocation.getLongitude());
recorder.setTencentLocationY(Constant.currentLocation.getLatitude()); recorder.setTencentLocationY(Constant.currentLocation.getLatitude());
gpsLocation = gpsUtils.getLocation(); gpsLocation = GPSUtils.getInstance(AutoTakePictureActivity.this).getLocation();
if (gpsLocation!=null) { if (gpsLocation!=null) {
recorder.setGpsLocationX(gpsLocation.getLongitude()); recorder.setGpsLocationX(gpsLocation.getLongitude());
recorder.setGpsLocationY(gpsLocation.getLatitude()); recorder.setGpsLocationY(gpsLocation.getLatitude());
@@ -597,7 +588,7 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic
} }
recorder.setImgFileName(file.getAbsolutePath()); recorder.setImgFileName(file.getAbsolutePath());
recorder.setRssi(Constant.currentLocation.getGPSRssi()); recorder.setRssi(Constant.currentLocation.getGPSRssi());
recorder.setSatelliteCount(satelliteCount); recorder.setSatelliteCount(GPSUtils.getInstance(AutoTakePictureActivity.this).getSateliteCount());
Observable.just(recorder).observeOn(Schedulers.io()) Observable.just(recorder).observeOn(Schedulers.io())
.filter(roadMatchEntity -> roadMatchEntity!=null) .filter(roadMatchEntity -> roadMatchEntity!=null)
.subscribe(new Consumer<LocationRecorder>() { .subscribe(new Consumer<LocationRecorder>() {
@@ -1766,7 +1757,7 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic
*/ */
public void addTrackMarker() { public void addTrackMarker() {
LatLng latLng = null; LatLng latLng = null;
if (Constant.currentLocation.getGPSRssi() == 0) { if (Constant.currentLocation.getGPSRssi() != 0) {
latLng = new LatLng(Constant.currentLocation.getLatitude(), Constant.currentLocation.getLongitude()); latLng = new LatLng(Constant.currentLocation.getLatitude(), Constant.currentLocation.getLongitude());
} else { } else {
if (gpsLocation == null) { if (gpsLocation == null) {

View File

@@ -104,8 +104,6 @@ public class HomeActivity extends BaseActivity {
return false; return false;
} }
}); });
private LocationLifeCycle locationLifeCycle;
@Override @Override
protected int getLayout() { protected int getLayout() {
return R.layout.activity_home; return R.layout.activity_home;
@@ -116,9 +114,9 @@ public class HomeActivity extends BaseActivity {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
DialogSettings.style = DialogSettings.STYLE.STYLE_IOS; DialogSettings.style = DialogSettings.STYLE.STYLE_IOS;
DialogSettings.init(); DialogSettings.init();
locationLifeCycle = new LocationLifeCycle(this); LocationLifeCycle.getInstance().init(HomeActivity.this);
// 注册位置更新的lifeCycle // 注册位置更新的lifeCycle
getLifecycle().addObserver(locationLifeCycle); getLifecycle().addObserver(LocationLifeCycle.getInstance());
if (Constant.USHERED != null) { if (Constant.USHERED != null) {
Constant.initRootFolder(Constant.USHERED); Constant.initRootFolder(Constant.USHERED);
// 检测用户是否为虚拟定位 // 检测用户是否为虚拟定位
@@ -565,6 +563,6 @@ public class HomeActivity extends BaseActivity {
// 清空登录信息 // 清空登录信息
Constant.clearLoginInfo(); Constant.clearLoginInfo();
// 注册位置更新的lifeCycle // 注册位置更新的lifeCycle
getLifecycle().removeObserver(locationLifeCycle); getLifecycle().removeObserver(LocationLifeCycle.getInstance());
} }
} }

View File

@@ -680,21 +680,21 @@ public class PictureActivity extends BaseActivity implements View.OnClickListene
} }
} }
@Subscribe(threadMode = ThreadMode.MAIN) // @Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMessageMainThread(Message msg) { // public void onEventMessageMainThread(Message msg) {
if (msg.what == Constant.EVENT_WHAT_LOCATION_CHANGE) { // 用户位置更新 // if (msg.what == Constant.EVENT_WHAT_LOCATION_CHANGE) { // 用户位置更新
if (tencentMap != null && !isMapSlide) { // if (tencentMap != null && !isMapSlide) {
TencentLocation tencentLocation = (TencentLocation) msg.obj; // TencentLocation tencentLocation = (TencentLocation) msg.obj;
CameraUpdate cameraSigma = // CameraUpdate cameraSigma =
CameraUpdateFactory.newCameraPosition(new CameraPosition( // CameraUpdateFactory.newCameraPosition(new CameraPosition(
new LatLng(Constant.currentLocation.getLatitude(), Constant.currentLocation.getLongitude()), //中心点坐标,地图目标经纬度 // new LatLng(Constant.currentLocation.getLatitude(), Constant.currentLocation.getLongitude()), //中心点坐标,地图目标经纬度
tencentMap.getCameraPosition().zoom, //目标缩放级别 // tencentMap.getCameraPosition().zoom, //目标缩放级别
0, //目标倾斜角 // 0, //目标倾斜角
0)); //目标旋转角 0~360° (正北方为0) // 0)); //目标旋转角 0~360° (正北方为0)
tencentMap.animateCamera(cameraSigma); // tencentMap.animateCamera(cameraSigma);
} // }
} // }
} // }
/** /**
* 记录视频拍摄的时间及经纬度 * 记录视频拍摄的时间及经纬度

View File

@@ -10,6 +10,7 @@ import android.graphics.BitmapFactory;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.Matrix; import android.graphics.Matrix;
import android.location.Location; import android.location.Location;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.Message; import android.os.Message;
@@ -31,6 +32,7 @@ import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import com.github.lazylibrary.util.FileUtils; import com.github.lazylibrary.util.FileUtils;
import com.kongzue.dialog.interfaces.OnDialogButtonClickListener; import com.kongzue.dialog.interfaces.OnDialogButtonClickListener;
@@ -79,6 +81,7 @@ import com.tencent.tencentmap.mapsdk.maps.model.MarkerOptions;
import com.tencent.tencentmap.mapsdk.maps.model.MyLocationStyle; import com.tencent.tencentmap.mapsdk.maps.model.MyLocationStyle;
import com.tencent.tencentmap.mapsdk.maps.model.Polyline; import com.tencent.tencentmap.mapsdk.maps.model.Polyline;
import com.tencent.tencentmap.mapsdk.maps.model.PolylineOptions; import com.tencent.tencentmap.mapsdk.maps.model.PolylineOptions;
import com.tencent.tencentmap.mapsdk.maps.model.TencentMapGestureListener;
import com.umeng.commonsdk.internal.crash.UMCrashManager; import com.umeng.commonsdk.internal.crash.UMCrashManager;
import com.umeng.umcrash.UMCrash; import com.umeng.umcrash.UMCrash;
import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.Geometry;
@@ -146,7 +149,6 @@ public class PicturesActivity extends BaseActivity implements View.OnClickListen
private boolean isOration = true; // 当前是否为自动拍照模式 private boolean isOration = true; // 当前是否为自动拍照模式
private boolean isTerminus = false; private boolean isTerminus = false;
private boolean isBack = true; private boolean isBack = true;
private int initCount;
private int type = 0; private int type = 0;
private int radioPicture = 0; private int radioPicture = 0;
private int videoIndex = -1; private int videoIndex = -1;
@@ -229,12 +231,6 @@ public class PicturesActivity extends BaseActivity implements View.OnClickListen
ivPicVideoImage = findViewById(R.id.iv_pic_video); ivPicVideoImage = findViewById(R.id.iv_pic_video);
ImageView btnSwitch = findViewById(R.id.btn_switch); ImageView btnSwitch = findViewById(R.id.btn_switch);
btnSwitch.setOnClickListener(this); btnSwitch.setOnClickListener(this);
gpsUtils.setOnClickGPSStatus(new GPSUtils.OnClickGPSStatus() {
@Override
public void onGpsCount(int count) {
initCount = count;
}
});
RadioGroup radioGroupPicture = findViewById(R.id.radio_group_picture); RadioGroup radioGroupPicture = findViewById(R.id.radio_group_picture);
RadioButton radioBtnHand = findViewById(R.id.radio_btn_hand); RadioButton radioBtnHand = findViewById(R.id.radio_btn_hand);
RadioButton radioBtnAuto = findViewById(R.id.radio_btn_auto); RadioButton radioBtnAuto = findViewById(R.id.radio_btn_auto);
@@ -342,7 +338,53 @@ public class PicturesActivity extends BaseActivity implements View.OnClickListen
uiSettings.setRotateGesturesEnabled(false);//禁止地图旋转手势. uiSettings.setRotateGesturesEnabled(false);//禁止地图旋转手势.
uiSettings.setTiltGesturesEnabled(false);//禁止倾斜手势. uiSettings.setTiltGesturesEnabled(false);//禁止倾斜手势.
setLocMarkerStyle(LOCATION_TYPE_LOCATION_ROTATE); setLocMarkerStyle(LOCATION_TYPE_LOCATION_ROTATE);
tencentMap.setLocationSource(new MyTecentLocationSource(this));
tencentMap.setMyLocationEnabled(true);
initLine(); initLine();
tencentMap.addTencentMapGestureListener(new TencentMapGestureListener() {
@Override
public boolean onDoubleTap(float v, float v1) {
return false;
}
@Override
public boolean onSingleTap(float v, float v1) {
return false;
}
@Override
public boolean onFling(float v, float v1) {
return false;
}
@Override
public boolean onScroll(float v, float v1) {
return false;
}
@Override
public boolean onLongPress(float v, float v1) {
return false;
}
@Override
public boolean onDown(float v, float v1) {
setLocMarkerStyle(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER);
return false;
}
@Override
public boolean onUp(float v, float v1) {
return false;
}
@Override
public void onMapStable() {
}
});
camera.addCameraListener(new CameraListener() { camera.addCameraListener(new CameraListener() {
@Override @Override
public void onPictureTaken(@NonNull PictureResult result) { public void onPictureTaken(@NonNull PictureResult result) {
@@ -633,11 +675,13 @@ public class PicturesActivity extends BaseActivity implements View.OnClickListen
picturesBuilder.append(TimestampUtil.time()).append(",").append("onClick 点击了放大 ,"); picturesBuilder.append(TimestampUtil.time()).append(",").append("onClick 点击了放大 ,");
CameraUpdate cameraUpdateIn = CameraUpdateFactory.zoomIn(); CameraUpdate cameraUpdateIn = CameraUpdateFactory.zoomIn();
tencentMap.animateCamera(cameraUpdateIn); tencentMap.animateCamera(cameraUpdateIn);
setLocMarkerStyle(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER);
break; break;
case R.id.iv_zoom_del://缩小 case R.id.iv_zoom_del://缩小
picturesBuilder.append(TimestampUtil.time()).append(",").append("onClick 点击了缩小 ,"); picturesBuilder.append(TimestampUtil.time()).append(",").append("onClick 点击了缩小 ,");
CameraUpdate cameraUpdateOut = CameraUpdateFactory.zoomOut(); CameraUpdate cameraUpdateOut = CameraUpdateFactory.zoomOut();
tencentMap.animateCamera(cameraUpdateOut); tencentMap.animateCamera(cameraUpdateOut);
setLocMarkerStyle(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER);
break; break;
case R.id.iv_location://定位: case R.id.iv_location://定位:
picturesBuilder.append(TimestampUtil.time()).append(",").append("onClick 点击了定位 ,"); picturesBuilder.append(TimestampUtil.time()).append(",").append("onClick 点击了定位 ,");
@@ -649,6 +693,7 @@ public class PicturesActivity extends BaseActivity implements View.OnClickListen
0)); //目标旋转角 0~360° (正北方为0) 0)); //目标旋转角 0~360° (正北方为0)
tencentMap.animateCamera(cameraSigma); tencentMap.animateCamera(cameraSigma);
} }
setLocMarkerStyle(LOCATION_TYPE_LOCATION_ROTATE);
break; break;
} }
} }
@@ -669,8 +714,6 @@ public class PicturesActivity extends BaseActivity implements View.OnClickListen
/*设置定位图标样式*/ /*设置定位图标样式*/
private void setLocMarkerStyle(int type) { private void setLocMarkerStyle(int type) {
tencentMap.setLocationSource(new MyTecentLocationSource(this));
tencentMap.setMyLocationEnabled(true);
MyLocationStyle locationStyle = new MyLocationStyle(); MyLocationStyle locationStyle = new MyLocationStyle();
//LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER //LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER
locationStyle = locationStyle.myLocationType(type); locationStyle = locationStyle.myLocationType(type);
@@ -681,6 +724,11 @@ public class PicturesActivity extends BaseActivity implements View.OnClickListen
locationStyle.fillColor(getResources().getColor(android.R.color.transparent)); locationStyle.fillColor(getResources().getColor(android.R.color.transparent));
locationStyle.strokeWidth(1); locationStyle.strokeWidth(1);
tencentMap.setMyLocationStyle(locationStyle); tencentMap.setMyLocationStyle(locationStyle);
if (LOCATION_TYPE_LOCATION_ROTATE == type) {
ivLocation.setEnabled(false);
} else {
ivLocation.setEnabled(true);
}
} }
public void benSwitch() { public void benSwitch() {
@@ -740,7 +788,7 @@ public class PicturesActivity extends BaseActivity implements View.OnClickListen
ivZoomAdd.setVisibility(View.VISIBLE); ivZoomAdd.setVisibility(View.VISIBLE);
ivZoomDel.setVisibility(View.VISIBLE); ivZoomDel.setVisibility(View.VISIBLE);
ivLocation.setVisibility(View.VISIBLE); ivLocation.setVisibility(View.VISIBLE);
setLocMarkerStyle(LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER); setLocMarkerStyle(LOCATION_TYPE_LOCATION_ROTATE);
// 道路水平方向图标显示 // 道路水平方向图标显示
ivPicRoadImage.setVisibility(View.GONE); ivPicRoadImage.setVisibility(View.GONE);
} }
@@ -852,26 +900,24 @@ public class PicturesActivity extends BaseActivity implements View.OnClickListen
if (EventBus.getDefault().isRegistered(this)) { if (EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().unregister(this); EventBus.getDefault().unregister(this);
} }
if (gpsUtils!=null) {
gpsUtils.unRegisterAllListener();
}
} }
@Subscribe(threadMode = ThreadMode.MAIN) // @Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMessageMainThread(Message msg) { // public void onEventMessageMainThread(Message msg) {
if (msg.what == Constant.EVENT_WHAT_LOCATION_CHANGE) { // 用户位置更新 // if (msg.what == Constant.EVENT_WHAT_LOCATION_CHANGE) { // 用户位置更新
if (tencentMap != null && !isMapSlide) { // if (tencentMap != null && !isMapSlide) {
TencentLocation tencentLocation = (TencentLocation) msg.obj; // TencentLocation tencentLocation = (TencentLocation) msg.obj;
CameraUpdate cameraSigma = CameraUpdateFactory.newCameraPosition(new CameraPosition( // CameraUpdate cameraSigma = CameraUpdateFactory.newCameraPosition(new CameraPosition(
new LatLng(tencentLocation.getLatitude(), tencentLocation.getLongitude()), //中心点坐标,地图目标经纬度 // new LatLng(tencentLocation.getLatitude(), tencentLocation.getLongitude()), //中心点坐标,地图目标经纬度
17, //目标缩放级别 // 17, //目标缩放级别
0, //目标倾斜角 // 0, //目标倾斜角
tencentLocation.getBearing())); //目标旋转角 0~360° (正北方为0) // tencentLocation.getBearing())); //目标旋转角 0~360° (正北方为0)
tencentMap.animateCamera(cameraSigma); // tencentMap.animateCamera(cameraSigma);
} // }
} // }
} // }
@RequiresApi(api = Build.VERSION_CODES.N)
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
public void initMarkerPaper(int index) { public void initMarkerPaper(int index) {
int endVideoIndex = index == -1 ? 0 : index; int endVideoIndex = index == -1 ? 0 : index;
@@ -910,9 +956,9 @@ public class PicturesActivity extends BaseActivity implements View.OnClickListen
sb.append(""); sb.append("");
sb.append(","); sb.append(",");
} }
sb.append(initCount); sb.append(GPSUtils.getInstance(PicturesActivity.this).getSateliteCount());
sb.append(","); sb.append(",");
gpsLocation = gpsUtils.getLocation(); gpsLocation = GPSUtils.getInstance(PicturesActivity.this).getLocation();
if (gpsLocation != null) { if (gpsLocation != null) {
// double[] doubles = Gps.toGCJ02Point(gpsLocation.getLatitude(), gpsLocation.getLongitude()); // double[] doubles = Gps.toGCJ02Point(gpsLocation.getLatitude(), gpsLocation.getLongitude());
sb.append(gpsLocation.getLatitude()); sb.append(gpsLocation.getLatitude());

View File

@@ -159,7 +159,6 @@ public class Constant {
/* /*
用户当前位置 用户当前位置
*/ */
public static TencentLocation currentLocation;
public static LatLng markerLacing; public static LatLng markerLacing;
public static JobSearchBean jobSearchBean;//数 public static JobSearchBean jobSearchBean;//数
public static MapView treasureMap; public static MapView treasureMap;

View File

@@ -7,14 +7,6 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.StrictMode; import android.os.StrictMode;
import android.util.Log; import android.util.Log;
import android.widget.RemoteViews;
import androidx.core.app.NotificationCompat;
import androidx.lifecycle.ProcessLifecycleOwner;
import com.elvishew.xlog.LogLevel;
import com.elvishew.xlog.XLog;
import com.google.gson.Gson;
import com.lzy.okgo.OkGo; import com.lzy.okgo.OkGo;
import com.lzy.okgo.cache.CacheEntity; import com.lzy.okgo.cache.CacheEntity;
import com.lzy.okgo.cache.CacheMode; import com.lzy.okgo.cache.CacheMode;

View File

@@ -14,18 +14,26 @@ import android.location.Location;
import android.location.LocationListener; import android.location.LocationListener;
import android.location.LocationManager; import android.location.LocationManager;
import android.location.LocationProvider; import android.location.LocationProvider;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Message;
import android.provider.Settings; import android.provider.Settings;
import android.util.Log; import android.util.Log;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import com.navinfo.outdoor.api.Constant;
import org.greenrobot.eventbus.EventBus;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
@SuppressLint("MissingPermission") @SuppressLint("MissingPermission")
@RequiresApi(api = Build.VERSION_CODES.N)
public class GPSUtils { public class GPSUtils {
private LocationManager mLocationManager; private LocationManager mLocationManager;
@@ -38,6 +46,8 @@ public class GPSUtils {
private static GPSUtils instance; private static GPSUtils instance;
private int sateliteCount; // 卫星颗数
public static GPSUtils getInstance(Activity mContext) { public static GPSUtils getInstance(Activity mContext) {
if (instance == null) { if (instance == null) {
instance = new GPSUtils(mContext); instance = new GPSUtils(mContext);
@@ -87,15 +97,15 @@ public class GPSUtils {
// 设置定位精确度 Criteria.ACCURACY_COARSE比较粗略Criteria.ACCURACY_FINE则比较精细 // 设置定位精确度 Criteria.ACCURACY_COARSE比较粗略Criteria.ACCURACY_FINE则比较精细
criteria.setAccuracy(Criteria.ACCURACY_FINE); criteria.setAccuracy(Criteria.ACCURACY_FINE);
// 设置是否要求速度 // 设置是否要求速度
criteria.setSpeedRequired(false); criteria.setSpeedRequired(true);
// 设置是否允许运营商收费 // 设置是否允许运营商收费
criteria.setCostAllowed(false); criteria.setCostAllowed(true);
// 设置是否需要方位信息 // 设置是否需要方位信息
criteria.setBearingRequired(false); criteria.setBearingRequired(true);
// 设置是否需要海拔信息 // 设置是否需要海拔信息
criteria.setAltitudeRequired(false); criteria.setAltitudeRequired(true);
// 设置对电源的需求 // 设置对电源的需求
criteria.setPowerRequirement(Criteria.POWER_LOW); criteria.setPowerRequirement(Criteria.POWER_MEDIUM);
return criteria; return criteria;
} }
@@ -153,6 +163,12 @@ public class GPSUtils {
Log.i(TAG, "经度:" + location.getLongitude()); Log.i(TAG, "经度:" + location.getLongitude());
Log.i(TAG, "纬度:" + location.getLatitude()); Log.i(TAG, "纬度:" + location.getLatitude());
Log.i(TAG, "海拔:" + location.getAltitude()); Log.i(TAG, "海拔:" + location.getAltitude());
Message currentLocationMsg = Message.obtain();
currentLocationMsg.what = Constant.EVENT_WHAT_LOCATION_CHANGE;
currentLocationMsg.arg1 = LocationLifeCycle.LOCATION_FROM.ORIGIN.ordinal(); // 设置定位来源
currentLocationMsg.obj = location;
EventBus.getDefault().post(currentLocationMsg);
} }
//GPS状态变化时触发 //GPS状态变化时触发
@@ -228,19 +244,14 @@ public class GPSUtils {
return; return;
} }
Log.i(TAG, "卫星状态改变"); Log.i(TAG, "卫星状态改变");
if (onClickGPSStatus != null) { if (status != null) {
onClickGPSStatus.onGpsCount(status.getSatelliteCount()); sateliteCount = status.getSatelliteCount();
} }
} }
}; };
public OnClickGPSStatus onClickGPSStatus;
public void setOnClickGPSStatus(OnClickGPSStatus onClickGPSStatus) { public int getSateliteCount() {
this.onClickGPSStatus = onClickGPSStatus; return sateliteCount;
}
public interface OnClickGPSStatus {
void onGpsCount(int count);
} }
public void unRegisterAllListener() { public void unRegisterAllListener() {

View File

@@ -2,30 +2,167 @@ package com.navinfo.outdoor.util;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.location.Location;
import android.os.Message;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.lifecycle.DefaultLifecycleObserver; import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LifecycleOwner;
import com.navinfo.outdoor.api.Constant;
import com.tencent.map.geolocation.TencentLocation;
import com.tencent.tencentmap.mapsdk.maps.LocationSource;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.util.ArrayList;
import java.util.List;
public class LocationLifeCycle implements DefaultLifecycleObserver { public class LocationLifeCycle implements DefaultLifecycleObserver {
private Activity mContext; private Activity mContext;
private LOCATION_FROM mainLocationFrom = LOCATION_FROM.ORIGIN/*主要位置源*/, referenceLocationFrom = LOCATION_FROM.TENCENT/*参考位置源*/;
private TencentLocation tencentLocation; // 腾讯定位获取到的最新位置信息
private Location gpsLocation; // 原生系统获取到的最新位置
private List<LocationSource.OnLocationChangedListener> locationChangedListenerList;
private static LocationLifeCycle instance;
public LocationLifeCycle(Activity mContext) { public static LocationLifeCycle getInstance() {
if (instance == null) {
instance = new LocationLifeCycle();
}
return instance;
}
public void init(Activity mContext) {
this.mContext = mContext; this.mContext = mContext;
} }
@Override @Override
public void onCreate(@NonNull LifecycleOwner owner) { public void onCreate(@NonNull LifecycleOwner owner) {
DefaultLifecycleObserver.super.onCreate(owner); DefaultLifecycleObserver.super.onCreate(owner);
locationChangedListenerList = new ArrayList<>();
// 开启腾讯定位 // 开启腾讯定位
TalentLocationUtils.getInstance(mContext).startLocation(mContext); TalentLocationUtils.getInstance(mContext).startLocation(mContext);
// 开启原生定位 // 开启原生定位
GPSUtils.getInstance(mContext).startLocation(); GPSUtils.getInstance(mContext).startLocation();
if (!EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().register(this);
}
} }
@Override @Override
public void onDestroy(@NonNull LifecycleOwner owner) { public void onDestroy(@NonNull LifecycleOwner owner) {
DefaultLifecycleObserver.super.onDestroy(owner); DefaultLifecycleObserver.super.onDestroy(owner);
locationChangedListenerList.clear();
locationChangedListenerList = null;
TalentLocationUtils.getInstance(mContext).stopLocation();
GPSUtils.getInstance(mContext).unRegisterAllListener(); GPSUtils.getInstance(mContext).unRegisterAllListener();
if (EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().unregister(this);
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMessageMainThread(Message msg) {
Location mapLocation;
if (msg.what == Constant.EVENT_WHAT_LOCATION_CHANGE) { // 用户位置更新
if (msg.arg1 == LOCATION_FROM.ORIGIN.ordinal()) {
gpsLocation = (Location) msg.obj;
if (msg.arg1 == mainLocationFrom.ordinal()) { // 如果当前定位方式是主要定位方式
if (locationChangedListenerList!=null) {
for (LocationSource.OnLocationChangedListener locationChangedListener:locationChangedListenerList) {
locationChangedListener.onLocationChanged(gpsLocation);
}
}
}
} else if (msg.arg1 == LOCATION_FROM.TENCENT.ordinal()) {
tencentLocation = (TencentLocation) msg.obj;
if (msg.arg1 == mainLocationFrom.ordinal()) { // 如果当前定位方式是主要定位方式
MyLocation location = new MyLocation(tencentLocation.getProvider(), tencentLocation);
//设置经纬度以及精度
location.setLatitude(tencentLocation.getLatitude());
location.setLongitude(tencentLocation.getLongitude());
location.setAccuracy(tencentLocation.getAccuracy());
if (locationChangedListenerList!=null) {
for (LocationSource.OnLocationChangedListener locationChangedListener:locationChangedListenerList) {
locationChangedListener.onLocationChanged(location);
}
}
}
}
}
}
public List<LocationSource.OnLocationChangedListener> getLocationChangedListenerList() {
return locationChangedListenerList;
}
/**
* 设置主要可用的定位来源
* */
public void setMainLocationFrom(LOCATION_FROM mainLocationFrom) {
this.mainLocationFrom = mainLocationFrom;
}
/**
* 设置次要可用的定位来源
* */
public void setReferenceLocationFrom(LOCATION_FROM referenceLocationFrom) {
this.referenceLocationFrom = referenceLocationFrom;
}
/**
* 获取主要位置信息
* */
public MyLocation getMainLocation() {
switch (mainLocationFrom) {
case ORIGIN:
if (gpsLocation!=null) {
return new MyLocation(gpsLocation.getProvider(), gpsLocation);
}
break;
case TENCENT:
if (tencentLocation!=null) {
return new MyLocation(tencentLocation.getProvider(), tencentLocation);
}
break;
}
return null;
}
/**
* 获取参考位置信息
* */
/**
* 获取主要位置信息
* */
public MyLocation getReferenceLocation() {
switch (referenceLocationFrom) {
case ORIGIN:
if (gpsLocation!=null) {
return new MyLocation(gpsLocation.getProvider(), gpsLocation);
}
break;
case TENCENT:
if (tencentLocation!=null) {
return new MyLocation(tencentLocation.getProvider(), tencentLocation);
}
break;
}
return null;
}
public enum LOCATION_FROM {
ORIGIN, TENCENT, BAIDU, AMAP
}
private boolean checkInit() throws Exception {
if (this.mContext == null) {
throw new Exception("LocationLifeCycle 没有初始化!");
}
return true;
} }
} }

View File

@@ -0,0 +1,39 @@
package com.navinfo.outdoor.util;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import com.tencent.map.geolocation.TencentLocation;
import java.util.List;
import java.util.Locale;
public class MyLocation extends Location {
private String city;
private String cityCode;
private String cityPhoneCode;
public MyLocation(String provider, TencentLocation tencentLocation) {
super(provider);
this.city = tencentLocation.getCity();
this.cityCode = tencentLocation.getCityCode();
this.cityPhoneCode = tencentLocation.getCityPhoneCode();
this.setAccuracy(tencentLocation.getAccuracy());
this.setAltitude(tencentLocation.getAltitude());
if (tencentLocation.getBearing()!=0) {
this.setBearing(tencentLocation.getBearing());
} else {
this.setBearing((float) tencentLocation.getDirection());
}
this.setElapsedRealtimeNanos(tencentLocation.getElapsedRealtime());
this.setLatitude(tencentLocation.getLatitude());
this.setLongitude(tencentLocation.getLongitude());
this.setSpeed(tencentLocation.getSpeed());
this.setTime(tencentLocation.getTime());
}
public MyLocation(String provider, Location location) {
super(location);
}
}

View File

@@ -20,13 +20,13 @@ public class MyTecentLocationSource implements LocationSource{
@Override @Override
public void activate(OnLocationChangedListener onLocationChangedListener) { public void activate(OnLocationChangedListener onLocationChangedListener) {
locationChangedListener = onLocationChangedListener; locationChangedListener = onLocationChangedListener;
TalentLocationUtils.getInstance(mContext).getLocationChangedListenerList().add(onLocationChangedListener); LocationLifeCycle.getInstance().getLocationChangedListenerList().add(onLocationChangedListener);
} }
@Override @Override
public void deactivate() { public void deactivate() {
if (locationChangedListener!=null) { if (locationChangedListener!=null) {
TalentLocationUtils.getInstance(mContext).getLocationChangedListenerList().remove(locationChangedListener); LocationLifeCycle.getInstance().getLocationChangedListenerList().remove(locationChangedListener);
} }
} }
} }

View File

@@ -6,6 +6,7 @@ import android.os.Looper;
import android.os.Message; import android.os.Message;
import android.util.Log; import android.util.Log;
import com.github.lazylibrary.util.ToastUtils;
import com.navinfo.outdoor.api.Constant; import com.navinfo.outdoor.api.Constant;
import com.tencent.map.fusionlocation.observer.TencentGeoLocationObserver; import com.tencent.map.fusionlocation.observer.TencentGeoLocationObserver;
import com.tencent.map.geolocation.TencentLocation; import com.tencent.map.geolocation.TencentLocation;
@@ -22,7 +23,6 @@ import java.util.List;
public class TalentLocationUtils implements TencentLocationListener { public class TalentLocationUtils implements TencentLocationListener {
private TencentLocationManager locationManager; private TencentLocationManager locationManager;
private TencentLocationRequest locationRequest; private TencentLocationRequest locationRequest;
private List<LocationSource.OnLocationChangedListener> locationChangedListenerList;
private boolean isLocationStart; // 标识是否已经启动定位 private boolean isLocationStart; // 标识是否已经启动定位
private static TalentLocationUtils instance; private static TalentLocationUtils instance;
public static TalentLocationUtils getInstance(Context mContext) { public static TalentLocationUtils getInstance(Context mContext) {
@@ -37,7 +37,6 @@ public class TalentLocationUtils implements TencentLocationListener {
} }
private void init(Context mContext) { private void init(Context mContext) {
locationChangedListenerList = new ArrayList<>();
//用于访问腾讯定位服务的类, 周期性向客户端提供位置更新 //用于访问腾讯定位服务的类, 周期性向客户端提供位置更新
locationManager = TencentLocationManager.getInstance(mContext, null); locationManager = TencentLocationManager.getInstance(mContext, null);
//设置坐标系 //设置坐标系
@@ -59,13 +58,13 @@ public class TalentLocationUtils implements TencentLocationListener {
isLocationStart = true; isLocationStart = true;
switch (err) { switch (err) {
case 1: case 1:
ToastUtil.showShort(mContext, Constant.GET_ERR_MESSAGE1); ToastUtils.showToast(mContext, Constant.GET_ERR_MESSAGE1);
break; break;
case 2: case 2:
ToastUtil.showShort(mContext, Constant.GET_ERR_MESSAGE2); ToastUtils.showToast(mContext, Constant.GET_ERR_MESSAGE2);
break; break;
case 3: case 3:
ToastUtil.showShort(mContext, Constant.GET_ERR_MESSAGE3); ToastUtils.showToast(mContext, Constant.GET_ERR_MESSAGE3);
break; break;
default: default:
break; break;
@@ -78,8 +77,6 @@ public class TalentLocationUtils implements TencentLocationListener {
locationManager.removeUpdates(this); locationManager.removeUpdates(this);
locationManager = null; locationManager = null;
locationRequest = null; locationRequest = null;
locationChangedListenerList.clear();
locationChangedListenerList = null;
} }
} }
@@ -90,25 +87,10 @@ public class TalentLocationUtils implements TencentLocationListener {
@Override @Override
public void onLocationChanged(TencentLocation tencentLocation, int i, String s) { public void onLocationChanged(TencentLocation tencentLocation, int i, String s) {
if (i == TencentLocation.ERROR_OK) {//定位成功 if (i == TencentLocation.ERROR_OK) {//定位成功
Location location = new Location(tencentLocation.getProvider());
// //设置经纬度以及精度
location.setLatitude(tencentLocation.getLatitude());
location.setLongitude(tencentLocation.getLongitude());
location.setAccuracy(tencentLocation.getAccuracy());
if (tencentLocation.getBearing()!=0) {
location.setBearing(tencentLocation.getBearing());
} else {
location.setBearing((float) tencentLocation.getDirection());
}
if (locationChangedListenerList!=null) {
for (LocationSource.OnLocationChangedListener locationChangedListener:locationChangedListenerList) {
locationChangedListener.onLocationChanged(location);
}
}
Constant.currentLocation = tencentLocation;
Message currentLocationMsg = Message.obtain(); Message currentLocationMsg = Message.obtain();
currentLocationMsg.what = Constant.EVENT_WHAT_LOCATION_CHANGE; currentLocationMsg.what = Constant.EVENT_WHAT_LOCATION_CHANGE;
currentLocationMsg.obj = Constant.currentLocation; currentLocationMsg.arg1 = LocationLifeCycle.LOCATION_FROM.TENCENT.ordinal(); // 设置定位来源
currentLocationMsg.obj = tencentLocation;
EventBus.getDefault().post(currentLocationMsg); EventBus.getDefault().post(currentLocationMsg);
}else if (i==TencentLocation.ERROR_NETWORK){//网络问题引起的定位失败 }else if (i==TencentLocation.ERROR_NETWORK){//网络问题引起的定位失败
Message currentLocationMsg = Message.obtain(); Message currentLocationMsg = Message.obtain();
@@ -148,8 +130,4 @@ public class TalentLocationUtils implements TencentLocationListener {
public void onNmeaMsgChanged(String s) { public void onNmeaMsgChanged(String s) {
} }
public List<LocationSource.OnLocationChangedListener> getLocationChangedListenerList() {
return locationChangedListenerList;
}
} }