gpt4 book ai didi

java - 无法在谷歌地图 Activity 中导航它总是返回到我当前的位置

转载 作者:行者123 更新时间:2023-12-04 07:35:41 25 4
gpt4 key购买 nike

我是 android 开发的新手,正在开发一个需要谷歌地图 Activity 的应用程序。
我面临的问题是,当我尝试平移(或滚动) map 时,我会立即重生到我最初设置的当前位置。
一点帮助会很棒,因为我被困在这一点上并且无法找到解决方案。
这是代码: -

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

binding = ActivityMapsBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());

// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}



@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
mMap.getUiSettings().setScrollGesturesEnabled(true);
locationManager=(LocationManager)this.getSystemService(Context.LOCATION_SERVICE);
locationListener=new LocationListener() {
@Override
public void onLocationChanged(@NonNull Location location) {
centerOnMap(location,"Your Location");
}
};

if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED)
{
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},1);
}
else{
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,locationListener);
Location lastKnownLocation=locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
centerOnMap(lastKnownLocation,"Your Location");
}
}

public void centerOnMap(Location location,String address)
{
LatLng userLocation = new LatLng(location.getLatitude(),location.getLongitude());
mMap.addMarker(new MarkerOptions().position(userLocation).title(address));
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(userLocation, 15));
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull @org.jetbrains.annotations.NotNull String[] permissions, @NonNull @org.jetbrains.annotations.NotNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED)
{
if(ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION)==PackageManager.PERMISSION_GRANTED){
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,locationListener);
}

}
}
}

最佳答案

您可能有但未说明的一项要求是:

When the lastLocation becomes available and the user hasnot moved the map then center the map on the location. If theuser has already moved the map then do not center the map. Ineither case, add a marker at the user's location.


在走得太远之前,必须注意谷歌地图提供了一个
功能类似于您要实现的功能,尽管您仍然必须“移动相机”。标记是一个蓝色球,而不是典型的标记。见 myMap.setMyLocationEnabled(true) .就是这样!当您获得 map 权限时执行此操作。
但是如果您不想使用它,那么这里是您需要的简单更改。
请记住 LocationManager getLastKnownLocation可以返回
如果设备没有(还),则为 null。所以我推荐一个小的
改变一点不相关 - 让位置监听器完成所有工作并摆脱这个特殊情况:
// this is where you initially check permissions and have them.
else{
locationManager.requestLocationUpdates (LocationManager.GPS_PROVIDER,0,0,locationListener);
// Here I removed the last location centering and let the
// location listener always handle it.
}
所以这开启了可能性
用户可以与 map 进行交互,最后到达最后一个位置。我理解这是您要解决的问题。
(顺便说一句,在我看来,您将 android.location.LocationManagerFusedLocationProviderApi (com.google.android.gms.location)所以我无法得到你的
由于不兼容而编译的代码 LocationListener s。
不幸的是,谷歌地图有两个 LocationListener这样上课
确定你必须包括你的进 Eloquent 能进一步理解。)
无论如何...
本地图第一次准备好( onMapReady)时, map 的相机是
(0,0) 为中心.您可以获得相机目标位置(中心)
随时使用 LatLng tgtCtr = mMap.getCameraPosition().target; .
奇怪的是,要知道用户是否有
以任何方式与 map 交互:滚动事件生成相机
当触摸事件生成一个单独的事件时发生变化。相机变化
不能独占使用,因为您的代码或用户可能只是
缩放不移动 map 。你可以走这条路但是
为了这个答案的目的,为了简单起见,相机
使用目标。
声明一个类实例变量(定义 mMap 的同一区域):
LatLng tgtCtr;
所以在你的 onMapReady分配后 mMap做:
tgtCtr = mMap.getCameraPosition().target;
因此,假设您的代码在您发布时存在(非常接近),那么这些
更改可能会有所帮助:
// This change simply restricts centering of the map on location
// update to only when user has not moved the map (scrolled).

@Override
public void onLocationChanged(@NonNull Location location) {
LatLng currentCtr = mMap.getCamaraPosition().target;

// This is not the ideal check since `double` comparisons
// should account for epsilon but in this case of (0,0) it should work.

// Alternatively you could compute the distance of current
// center to (0,0) and then use an epsilon:
// see `com.google.maps.android.SphericalUtil.computeDistanceBetween`.

if (currentCtr.latitude == 0 && currentCtr.longitude == 0) {
centerOnMap(location,"Your Location");
}
}
保存为用户添加的标记似乎也是一个好主意
位置 - 这是可选的,但可能会派上用场,以防止多个标记
从被添加到那个位置:
// Define a class instance variable
Marker myLocMarker = nulll;

// and then in centerOnMap
public void centerOnMap(Location location, String address)
{
// ... other code

if (myLocMarker == null) {
myLocMarker = mMap.addMarker(new MarkerOptions().position(userLocation).title(address));
}

// ... more code
}
所以真正唯一的困难是弄清楚“有
用户移动了 map 。” 在这种情况下,基于初始要求
你不想移动 map 。

关于java - 无法在谷歌地图 Activity 中导航它总是返回到我当前的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67744813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com