使用 locationClient 删除位置更新

Posted

技术标签:

【中文标题】使用 locationClient 删除位置更新【英文标题】:remove location updates with a locationClient 【发布时间】:2018-09-13 21:58:09 【问题描述】:

我的 android 应用中有一个 Google 地图活动,我不断收到位置更新。我想删除位置更新,但我真的不知道该怎么做,我在 Google 上搜索过,但没有发现任何有用的信息,可能是因为我以(?)奇怪的方式做到了。我会用我的应用代码来解释自己:

我声明了一个 FusedLocationProviderClient locationClient:

private FusedLocationProviderClient locationClient;

我稍后实例化:

locationClient = getFusedLocationProviderClient(this);

然后,我像这样请求最后一个位置:

locationClient.getLastLocation()
            .addOnSuccessListener(new OnSuccessListener<Location>() 
                @Override
                public void onSuccess(Location location) 
                    if(location != null)
                        userPosition = location;
                        locationClient.removeLocationUpdates();
                    
                
            )
            .addOnFailureListener(new OnFailureListener() 
                @Override
                public void onFailure(@NonNull Exception e) 
                    e.printStackTrace();

                
            );

这是地图中的“我的位置”按钮,它会不断更新位置,这会阻止我移动地图,因为如果我尝试移动,它会自动移回我的位置。

我应该如何停止这些位置更新?我知道 removeLocationUpdates 方法,但我没有 GoogleApiClient 对象也没有 locationCallback 对象,也不知道该怎么做。

希望你能帮助我的伙伴们,我已经搜索了几个小时了。

非常感谢您!

【问题讨论】:

您必须至少拥有LocationCallback 的实例才能删除位置更新。 onSuccess() 每次位置改变时都会打电话吗? 但是.getLastLocation() 方法提供了一种获取位置的简化方法。它特别适合不需要准确位置并且不想为位置更新维护额外逻辑的应用程序。 我实例化了 LocationCallback,但我不知道如何处理该实例...而且我猜每次位置更改时都会调用 onSuccess(),因为它一直指向我的位置。 . 谢谢精灵的帮助!我现在得回家了,但是任何你回复或需要的东西,我明天会发布。再次,非常非常感谢! 再次向导,非常感谢您的回复。我不知道确切原因,但我的 .getLastLocation() 不断地给我我的位置。我要检查 Intents 整个代码,也许我正在循环那个片段或代码或其他东西,无论如何,如果你给我更多关于 LocationCallback 的信息,我会感谢你,我应该如何实现它来删除位置更新......非常非常感谢! 【参考方案1】:

如果您的屏幕中已经有GoogleMap,我想知道为什么要使用 FusedClient 获取位置。因为您可以直接从GoogleMap 实例中获取您的当前位置;

假设你有一个GoogleMap -> mMap 的实例。要获取更新,您只需要注册回调:

Location mLocation = mMap.getMyLocation(); // mLocation is your current location

不过,这个方法是deperecated。

这是如何更好地做到这一点(取自official guide):-

public class MyLocationDemoActivity extends FragmentActivity
    implements OnMyLocationButtonClickListener,
        OnMyLocationClickListener,
        OnMapReadyCallback 

  private GoogleMap mMap;

  @Override
  protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.my_location_demo);

    SupportMapFragment mapFragment =
        (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);
  

  @Override
  public void onMapReady(GoogleMap map) 
    mMap = map;
    // TODO: Before enabling the My Location layer, you must request
    // location permission from the user. This sample does not include
    // a request for location permission.
    mMap.setMyLocationEnabled(true);
    mMap.setOnMyLocationButtonClickListener(this);
    mMap.setOnMyLocationClickListener(this);
  

  @Override
  public void onMyLocationClick(@NonNull Location location) 
    Toast.makeText(this, "Current location:\n" + location, Toast.LENGTH_LONG).show();
  

  @Override
  public boolean onMyLocationButtonClick() 
    Toast.makeText(this, "MyLocation button clicked", Toast.LENGTH_SHORT).show();
    // Return false so that we don't consume the event and the default behavior still occurs
    // (the camera animates to the user's current position).
    return false;
  

【讨论】:

真希望我能找到这么简单的答案,非常感谢,真的! 好吧,我们怎么说..?迟到总比没有好!

以上是关于使用 locationClient 删除位置更新的主要内容,如果未能解决你的问题,请参考以下文章

Android 播放服务 6.5:LocationClient 缺失

保险丝位置字符串是啥意思(LocationClient)

Android LocationClient.getLastLocation() 返回带有新时间戳的旧且不准确的位置

locationListener + manager 与 GoogleServices + locationClient

位置客户端在 PendingIntent 中使用可打包的附加请求请求位置更新

使 Fused Location Provider LocationClient 更易于使用