设置本机GPS和腾讯SDK两种定位方法。

This commit is contained in:
ZhanGSKen 2025-03-01 11:09:34 +08:00
parent e1b48fb6c5
commit 23892192b9
2 changed files with 106 additions and 177 deletions

View File

@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Fri Feb 28 11:55:01 GMT 2025 #Sat Mar 01 03:07:55 GMT 2025
stageCount=0 stageCount=0
libraryProject= libraryProject=
baseVersion=1.0 baseVersion=1.0
publishVersion=1.0.0 publishVersion=1.0.0
buildCount=230 buildCount=246
baseBetaVersion=1.0.1 baseBetaVersion=1.0.1

View File

@ -6,11 +6,13 @@ package cc.winboll.studio.positions.fragments;
* @Describe 腾讯地图服务视图 * @Describe 腾讯地图服务视图
*/ */
import android.Manifest; import android.Manifest;
import cc.winboll.studio.positions.R;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.graphics.Matrix; import android.graphics.Matrix;
import android.location.Location; import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager; import android.location.LocationManager;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
@ -28,7 +30,7 @@ import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat; import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import cc.winboll.studio.positions.R; import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.positions.beans.PostionModel; import cc.winboll.studio.positions.beans.PostionModel;
import cc.winboll.studio.positions.utils.LocationFileStorage; import cc.winboll.studio.positions.utils.LocationFileStorage;
import com.hjq.toast.ToastUtils; import com.hjq.toast.ToastUtils;
@ -42,6 +44,7 @@ import com.tencent.tencentmap.mapsdk.maps.LocationSource;
import com.tencent.tencentmap.mapsdk.maps.TencentMap; import com.tencent.tencentmap.mapsdk.maps.TencentMap;
import com.tencent.tencentmap.mapsdk.maps.TencentMapInitializer; import com.tencent.tencentmap.mapsdk.maps.TencentMapInitializer;
import com.tencent.tencentmap.mapsdk.maps.TextureMapView; import com.tencent.tencentmap.mapsdk.maps.TextureMapView;
import com.tencent.tencentmap.mapsdk.maps.UiSettings;
import com.tencent.tencentmap.mapsdk.maps.model.BitmapDescriptor; import com.tencent.tencentmap.mapsdk.maps.model.BitmapDescriptor;
import com.tencent.tencentmap.mapsdk.maps.model.BitmapDescriptorFactory; import com.tencent.tencentmap.mapsdk.maps.model.BitmapDescriptorFactory;
import com.tencent.tencentmap.mapsdk.maps.model.CameraPosition; import com.tencent.tencentmap.mapsdk.maps.model.CameraPosition;
@ -59,6 +62,9 @@ public class TXMSFragment extends Fragment implements EasyPermissions.Permission
private static final int PERMISSION_REQUEST_CODE = 1; private static final int PERMISSION_REQUEST_CODE = 1;
private LocationManager mLocationManager;
private LocationListener mLocationListener;
private static final String ARG_PAGE = "ARG_PAGE"; private static final String ARG_PAGE = "ARG_PAGE";
private int mPage; private int mPage;
private TextureMapView mapView; private TextureMapView mapView;
@ -66,72 +72,32 @@ public class TXMSFragment extends Fragment implements EasyPermissions.Permission
TextView mtvInfo; TextView mtvInfo;
private LocationSource.OnLocationChangedListener locationChangedListener; private LocationSource.OnLocationChangedListener locationChangedListener;
private TencentLocationManager locationManager; private TencentLocationManager mTencentLocationManager;
private TencentLocationRequest locationRequest; private TencentLocationRequest mTencentLocationRequest;
private MyLocationStyle locationStyle; private MyLocationStyle mMyLocationStyle;
ArrayList<PostionModel> locationJsonList; ArrayList<PostionModel> locationPostionModelList;
Location lastLocation; Location lastLocation;
// public static TXMSFragment newInstance(int page) {
// Bundle args = new Bundle();
// args.putInt(ARG_PAGE, page);
// TXMSFragment fragment = new TXMSFragment();
// fragment.setArguments(args);
// return fragment;
// }
//
// @Override
// public void onCreate(Bundle savedInstanceState) {
// super.onCreate(savedInstanceState);
// if (getArguments() != null) {
// mPage = getArguments().getInt(ARG_PAGE);
// }
// }
@Nullable @Nullable
@Override @Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) { @Nullable Bundle savedInstanceState) {
View viewRoot = inflater.inflate(R.layout.fragment_txms, container, false); View viewRoot = inflater.inflate(R.layout.fragment_txms, container, false);
locationJsonList = new ArrayList<PostionModel>(); locationPostionModelList = new ArrayList<PostionModel>();
TencentMapInitializer.setAgreePrivacy(getActivity(), true); TencentMapInitializer.setAgreePrivacy(getActivity(), true);
TencentMapInitializer.start(getActivity()); TencentMapInitializer.start(getActivity());
TencentLocationManager.setUserAgreePrivacy(true); TencentLocationManager.setUserAgreePrivacy(true);
mapView = viewRoot.findViewById(R.id.mapview); mapView = viewRoot.findViewById(R.id.mapview);
mapView.setOpaque(false); mapView.setOpaque(false);
//创建tencentMap地图对象可以完成对地图的几乎所有操作 //创建tencentMap地图对象可以完成对地图的几乎所有操作
tencentMap = mapView.getMap(); tencentMap = mapView.getMap();
// FloatingActionButton fab = viewRoot.findViewById(R.id.fab);
// fab.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View view) {
// Snackbar.make(view, "点击了悬浮按钮", Snackbar.LENGTH_LONG).show();
// }
// });
mtvInfo = viewRoot.findViewById(R.id.tv_info); mtvInfo = viewRoot.findViewById(R.id.tv_info);
checkLocationPermission(); checkLocationPermission();
//设置显示定位的图标
// TencentLocationManager.setUserAgreePrivacy(true);
// // 启动实时定位
// doRealTimePosition();
// //对地图操作类进行操作
// CameraUpdate cameraSigma =
// CameraUpdateFactory.newCameraPosition(new CameraPosition(
// new LatLng(22.984066, 116.307548),
// 15,
// 0f,
// 0f));
// //移动地图
// tencentMap.moveCamera(cameraSigma);
// 设置地图点击监听 // 设置地图点击监听
tencentMap.setOnMapClickListener(new TencentMap.OnMapClickListener(){ tencentMap.setOnMapClickListener(new TencentMap.OnMapClickListener(){
@ -154,76 +120,94 @@ public class TXMSFragment extends Fragment implements EasyPermissions.Permission
loadLocations(); loadLocations();
// 启动实时定位 /*UiSettings uiSettings = tencentMap.getUiSettings();
//pickUpPosition(); uiSettings.setAllGesturesEnabled(true);
//realTimePositioning(); mTencentLocationManager = TencentLocationManager.getInstance(getActivity());
sendRealTimePositioningMessage(); //创建定位请求
mTencentLocationRequest = TencentLocationRequest.create();
mTencentLocationManager.requestLocationUpdates(mTencentLocationRequest, this);
//地图上设置定位数据源
tencentMap.setLocationSource(this);
//设置当前位置可见
tencentMap.setMyLocationEnabled(true);
//设置定位图标样式
MyLocationStyle myLocationStyle = new MyLocationStyle();
tencentMap.setMyLocationEnabled(true);
tencentMap.setMyLocationStyle(myLocationStyle);
//startLocation();
*/
//
// 本机 GPS 定位服务调用服务
//
LocationManager locationManager = (LocationManager) getActivity().getSystemService(getActivity().LOCATION_SERVICE);
String provider = LocationManager.GPS_PROVIDER;
Location location = locationManager.getLastKnownLocation(provider);
locationManager.requestLocationUpdates(provider, 2000, 10, locationListener);
moveToLocation(location);
return viewRoot; return viewRoot;
} }
private void startLocation() {
mTencentLocationManager.requestLocationUpdates(mTencentLocationRequest, this);
MyLocationStyle myLocationStyle = new MyLocationStyle();
tencentMap.setMyLocationEnabled(true);
tencentMap.setMyLocationStyle(myLocationStyle);
}
private void stopLocation() {
if (mTencentLocationManager != null) {
mTencentLocationManager.removeUpdates(this);
//mTencentLocationManager.removeLocationListener(this);
}
}
void loadLocations() { void loadLocations() {
// 存储位置数据
// Location location = new Location("gps");
// location.setLatitude(22.984066);
// location.setLongitude(116.307548);
// location.setTime(System.currentTimeMillis());
//
// // 方式1保存到文件
// List<Location> locations = new ArrayList<>();
// locations.add(location);
// LocationFileStorage.saveToFile(this, locations);
// 读取数据 // 读取数据
locationJsonList = LocationFileStorage.loadFromFile(getActivity()); locationPostionModelList = LocationFileStorage.loadFromFile(getActivity());
for (PostionModel lj : locationJsonList) { for (PostionModel lj : locationPostionModelList) {
tencentMap.addMarker(new MarkerOptions(convertToLatLng(lj.toLocation()))); tencentMap.addMarker(new MarkerOptions(convertToLatLng(lj.toLocation())));
//LogUtils.d("Location", "Lat: " + loc.getLatitude() + ", Lng: " + loc.getLongitude());
} }
} }
void addLocationToMap(Location location) { void addLocationToMap(Location location) {
// 存储位置数据 locationPostionModelList.add(new PostionModel(location));
// Location location = new Location("gps"); LocationFileStorage.saveToFile(getActivity(), locationPostionModelList);
// location.setLatitude(22.984066);
// location.setLongitude(116.307548);
// location.setTime(System.currentTimeMillis());
// 方式1保存到文件
//List<Location> locations = new ArrayList<>();
locationJsonList.add(new PostionModel(location));
LocationFileStorage.saveToFile(getActivity(), locationJsonList);
// 读取数据
// List<Location> loaded = LocationFileStorage.loadFromFile(this);
// for (Location loc : loaded) {
// tencentMap.addMarker(new MarkerOptions(toTencentLatLng(loc)));
// //LogUtils.d("Location", "Lat: " + loc.getLatitude() + ", Lng: " + loc.getLongitude());
// }
} }
public void addCurrentLocationToMap() { // public void addCurrentLocationToMap() {
ToastUtils.show("addCurrentLocationToMap"); // ToastUtils.show("addCurrentLocationToMap");
locationJsonList.add(new PostionModel(createCurrentLocation())); // Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
LocationFileStorage.saveToFile(getActivity(), locationJsonList); // locationPostionModelList.add(new PostionModel(getCurrentGPSLocation()));
} // LocationFileStorage.saveToFile(getActivity(), locationPostionModelList);
// }
LocationListener locationListener = new LocationListener() {
// 创建Location对象方法 @Override
private Location createCurrentLocation() { public void onLocationChanged(Location location) {
// 获取位置管理器 // 位置变化时的处理逻辑
LocationManager locationManager = (LocationManager) getActivity().getSystemService(getActivity().LOCATION_SERVICE); // double latitude = location.getLatitude();
// 获取最后已知位置 // double longitude = location.getLongitude();
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); String szTemp = String.format("Latitude %f, Longitude %f, Accuracy %f", location.getLatitude(), location.getLongitude(), location.getAccuracy());
if (location != null) { LogUtils.d(TAG, szTemp);
// 获取位置提供程序名称
String provider = location.getProvider(); moveToLocation(location);
System.out.println("定位来源:" + provider);
} }
return location; @Override
} public void onProviderDisabled(String provider) {}
@Override
public void onProviderEnabled(String provider) {}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {}
};
// 创建Location对象方法 // 创建Location对象方法
private Location createLocationFromLatLng(LatLng latLng) { private Location createLocationFromLatLng(LatLng latLng) {
@ -249,7 +233,7 @@ public class TXMSFragment extends Fragment implements EasyPermissions.Permission
} }
return null; return null;
} }
public static LatLng convertToLatLng(Location location) { public static LatLng convertToLatLng(Location location) {
return new LatLng( return new LatLng(
location.getLatitude(), location.getLatitude(),
@ -257,7 +241,6 @@ public class TXMSFragment extends Fragment implements EasyPermissions.Permission
); );
} }
// 添加标记方法 // 添加标记方法
private void addMarker(LatLng latLng) { private void addMarker(LatLng latLng) {
tencentMap.clearAllOverlays(); tencentMap.clearAllOverlays();
@ -274,7 +257,7 @@ public class TXMSFragment extends Fragment implements EasyPermissions.Permission
switch (msg.what) { switch (msg.what) {
case REALTIME_POSITIONING: case REALTIME_POSITIONING:
// 在这里处理接收到消息后的逻辑比如更新 UI // 在这里处理接收到消息后的逻辑比如更新 UI
singleTimePositioning();
break; break;
default: default:
break; break;
@ -319,20 +302,18 @@ public class TXMSFragment extends Fragment implements EasyPermissions.Permission
* 设置定位图标样式 * 设置定位图标样式
*/ */
private void setLocMarkerStyle() { private void setLocMarkerStyle() {
locationStyle = new MyLocationStyle(); mMyLocationStyle = new MyLocationStyle();
//创建图标 //创建图标
BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromBitmap(getBitMap(R.drawable.marker)); BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromBitmap(getBitMap(R.drawable.marker));
locationStyle.icon(bitmapDescriptor); mMyLocationStyle.icon(bitmapDescriptor);
//设置定位圆形区域的边框宽度 //设置定位圆形区域的边框宽度
locationStyle.strokeWidth(3); mMyLocationStyle.strokeWidth(3);
//设置圆区域的颜色 //设置圆区域的颜色
locationStyle.fillColor(R.color.style); mMyLocationStyle.fillColor(R.color.style);
tencentMap.setMyLocationStyle(locationStyle); tencentMap.setMyLocationStyle(mMyLocationStyle);
} }
private Bitmap getBitMap(int resourceId) { private Bitmap getBitMap(int resourceId) {
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resourceId); Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resourceId);
int width = bitmap.getWidth(); int width = bitmap.getWidth();
@ -347,8 +328,7 @@ public class TXMSFragment extends Fragment implements EasyPermissions.Permission
return bitmap; return bitmap;
} }
private void pickUpCurrentPosition() { private void moveToLocation(Location location) {
Location location = createCurrentLocation();
ToastUtils.show(String.format("%s", location.toString())); ToastUtils.show(String.format("%s", location.toString()));
//对地图操作类进行操作 //对地图操作类进行操作
@ -360,7 +340,7 @@ public class TXMSFragment extends Fragment implements EasyPermissions.Permission
0f)); 0f));
//移动地图 //移动地图
tencentMap.moveCamera(cameraSigma); tencentMap.moveCamera(cameraSigma);
addLocationToMap(location); //addLocationToMap(location);
} }
public void sendRealTimePositioningMessage() { public void sendRealTimePositioningMessage() {
@ -369,63 +349,9 @@ public class TXMSFragment extends Fragment implements EasyPermissions.Permission
handler.sendMessage(message); handler.sendMessage(message);
} }
/**
* 定位的一些初始化设置
*/
public void singleTimePositioning() {
TencentMapInitializer.setAgreePrivacy(getActivity(), true);
TencentMapInitializer.start(getActivity());
TencentLocationManager.setUserAgreePrivacy(true);
//用于访问腾讯定位服务的类, 提供一次位置信息
locationManager = TencentLocationManager.getInstance(getActivity());
//设置坐标系
locationManager.setCoordinateType(TencentLocationManager.COORDINATE_TYPE_GCJ02);
//创建定位请求
locationRequest = TencentLocationRequest.create();
// 设置定位模式为单次定位
locationRequest.setInterval(0); // 设置为0表示只定位一次
//locationRequest.setFastestInterval(0);
// 实现 TencentLocationListener 接口来接收定位结果
locationManager.requestLocationUpdates(locationRequest, new TencentLocationListener() {
@Override
public void onLocationChanged(TencentLocation location, int errorCode, String errorInfo) {
if (errorCode == TencentLocation.ERROR_OK) {
// 定位成功处理定位数据
double latitude = location.getLatitude();
double longitude = location.getLongitude();
// 在这里可以将定位数据传递给其他需要的地方
//对地图操作类进行操作
CameraUpdate cameraSigma =
CameraUpdateFactory.newCameraPosition(new CameraPosition(
convertToLatLng(location),
15,
0f,
0f));
//移动地图
tencentMap.moveCamera(cameraSigma);
} else {
// 定位失败处理错误信息
}
}
@Override
public void onStatusUpdate(String name, int statusCode, String statusInfo) {
// 位置状态更新根据需要处理
}
}, Looper.getMainLooper());
//地图上设置定位数据源
tencentMap.setLocationSource(this);
//设置当前位置可见
tencentMap.setMyLocationEnabled(true);
//设置定位图标样式
setLocMarkerStyle();
tencentMap.setMyLocationStyle(locationStyle);
}
/** /**
* 实现位置监听 * 实现位置监听
* @param tencentLocation * @param tencentLocation
@ -441,6 +367,7 @@ public class TXMSFragment extends Fragment implements EasyPermissions.Permission
location.setLatitude(tencentLocation.getLatitude()); location.setLatitude(tencentLocation.getLatitude());
location.setLongitude(tencentLocation.getLongitude()); location.setLongitude(tencentLocation.getLongitude());
location.setAccuracy(tencentLocation.getAccuracy()); location.setAccuracy(tencentLocation.getAccuracy());
locationChangedListener.onLocationChanged(location); locationChangedListener.onLocationChanged(location);
//显示回调的实时位置信息 //显示回调的实时位置信息
@ -464,22 +391,24 @@ public class TXMSFragment extends Fragment implements EasyPermissions.Permission
// locationB.getLatitude(), // locationB.getLatitude(),
// locationB.getLongitude() // locationB.getLongitude()
// ); // );
mtvInfo.setText(String.format("\n%f %f", location.getLatitude(), location.getLongitude())); String szTemp = String.format("Latitude %f, Longitude %f, Accuracy %f", location.getLatitude(), location.getLongitude(), location.getAccuracy());
mtvInfo.setText(szTemp);
LogUtils.d(TAG, szTemp);
//打印tencentLocation的json字符串 //打印tencentLocation的json字符串
// Toast.makeText(getApplicationContext(), new Gson().toJson(location), Toast.LENGTH_LONG).show(); // Toast.makeText(getApplicationContext(), new Gson().toJson(location), Toast.LENGTH_LONG).show();
} }
}); });
// 保存最后定位信息 // 保存最后定位信息
lastLocation = new Location(tencentLocation.getProvider());; lastLocation = new Location(tencentLocation.getProvider());
lastLocation.setLatitude(tencentLocation.getLatitude()); lastLocation.setLatitude(tencentLocation.getLatitude());
lastLocation.setLongitude(tencentLocation.getLongitude()); lastLocation.setLongitude(tencentLocation.getLongitude());
lastLocation.setAccuracy(tencentLocation.getAccuracy()); lastLocation.setAccuracy(tencentLocation.getAccuracy());
// 当不再需要定位时 // 当不再需要定位时
// 取消定位监听 // 取消定位监听
if (locationManager != null) { if (mTencentLocationManager != null) {
locationManager.removeUpdates(this); mTencentLocationManager.removeUpdates(this);
} }
// 关闭当前位置显示 // 关闭当前位置显示
// if (tencentMap != null) { // if (tencentMap != null) {
@ -499,7 +428,7 @@ public class TXMSFragment extends Fragment implements EasyPermissions.Permission
public void activate(OnLocationChangedListener onLocationChangedListener) { public void activate(OnLocationChangedListener onLocationChangedListener) {
locationChangedListener = onLocationChangedListener; locationChangedListener = onLocationChangedListener;
int err = locationManager.requestLocationUpdates(locationRequest, this, Looper.myLooper()); int err = mTencentLocationManager.requestLocationUpdates(mTencentLocationRequest, this, Looper.myLooper());
switch (err) { switch (err) {
case 1: case 1:
Toast.makeText(getActivity(), "设备缺少使用腾讯定位服务需要的基本条件", Toast.LENGTH_SHORT).show(); Toast.makeText(getActivity(), "设备缺少使用腾讯定位服务需要的基本条件", Toast.LENGTH_SHORT).show();
@ -518,9 +447,9 @@ public class TXMSFragment extends Fragment implements EasyPermissions.Permission
@Override @Override
public void deactivate() { public void deactivate() {
locationManager.removeUpdates(this); mTencentLocationManager.removeUpdates(this);
locationManager = null; mTencentLocationManager = null;
locationRequest = null; mTencentLocationRequest = null;
locationChangedListener = null; locationChangedListener = null;
} }