Android - 无法在活动启动时刷新用户位置

Posted

技术标签:

【中文标题】Android - 无法在活动启动时刷新用户位置【英文标题】:Android - Can't refresh user location on activity launch 【发布时间】:2017-09-29 02:12:32 【问题描述】:

我无法刷新用户的位置。

在我的应用程序中,我启动了标记用户当前位置的地图,但 locationManager.getLastKnownLocation() 正在返回不同的位置 因为它使用缓存位置。

如何将最后一个已知位置与当前位置进行比较,以便在回调 OnMapReady 中标记地图上的正确位置?

我在 *** 中找到的每个示例都使用 LocationListener.onLocationChanged() 方法,但我需要在活动启动时刷新位置(如果需要)。

代码:

private static final String TAG_MAP_LOAD_FAILED = "FAIL LOADING MAP STYLE";
private static final String TAG_MAP_PARSING_FAILED = "FAIL PARSING MAP STYLE";

private GoogleMap mMap;
private LatLng mMyCoordinates;
private LocationManager mLocationManager;

@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    mLocationManager = (LocationManager) getContext().getSystemService(Context.LOCATION_SERVICE);
    getMapAsync(this);




@Override
public void onMapReady(GoogleMap googleMap) 

    mMap = googleMap;

    try
        boolean success = googleMap.setMapStyle(MapStyleOptions.loadRawResourceStyle(getContext(), R.raw.style_mapjson));

        if(!success)
            Log.e(TAG_MAP_PARSING_FAILED, "Failed parsing JSON Style");
        

    catch (Resources.NotFoundException ex)
        Log.e(TAG_MAP_LOAD_FAILED, "Can't find style. Error:", ex);
    


    mMap.setIndoorEnabled(false);

    MarkerOptions markerOptions = new MarkerOptions();
    markerOptions.position(mMyCoordinates);
    markerOptions.title("Marker in my location");
    mMap.addMarker(markerOptions);

    CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(mMyCoordinates, 15);
    mMap.moveCamera(cameraUpdate);
    mMap.getUiSettings().setRotateGesturesEnabled(false);



@Override
public void onLocationChanged(Location location) 



@Override
public void onStatusChanged(String provider, int status, Bundle extras) 



@Override
public void onProviderEnabled(String provider) 



@Override
public void onProviderDisabled(String provider) 


OBS:我清理了代码,因为它充满了不成功的尝试。只是展示它的结构。

我应该改用FusedLocation吗?

【问题讨论】:

是的。 LocationManager 使用不同的实现,我认为您不能将它与 GoogleMap 一起使用来获取连接回调。你从哪里得到这个想法的?为此,您需要一个 API 客户端。为什么您首先在 SO 而不是在 official documentation 中寻找答案是另一个论坛的问题。试着读到最后,你就会解决这个问题。是的,请使用FusedLocation,除非您想使用已弃用的代码 【参考方案1】:

最后一个已知位置有一个与之关联的时间戳,它可能是过去相当长的一段时间。只需将最后一个已知位置的时间戳与您允许的最大年龄进行年龄比较,并在需要时请求更新。这是一个快速而肮脏的例子:

private static long MAX_TIME = 60 * 60 * 1000; //Update if location is older than one hour

@Override
public void onResume() 
    super.onResume();
    Location location = mLocationManager.getLastKnownLocation(YOUR_PROVIDER_HERE); //GPS or Network

    boolean shouldUpdateLocation = false;
    if (location != null) 
        long elapsedTime = System.currentTimeMillis() - location.getTime();
        if (elapsedTime >= MAX_TIME) 
            shouldUpdateLocation = true;
        
    
    else 
        shouldUpdateLocation = true;
    

    if (shouldUpdateLocation) 
        //TODO: Request location update here.
    

您不想在每次启动活动时都请求位置更新,因此为此设置一个合理的 MAX_TIME。

【讨论】:

谢谢,巴勃罗。还有一个问题:我应该使用requestSingleUpdate() 来获取刷新的位置吗? 你可以,虽然我会使用requestLocationUpdates() 并在我得到一个相当准确的位置后停止它。 如果这是解决方案,我将对其进行测试并更新问题!谢谢!

以上是关于Android - 无法在活动启动时刷新用户位置的主要内容,如果未能解决你的问题,请参考以下文章

重新启动活动时,Android Wear 上的融合位置提供程序会导致崩溃

Android Studio 中的新活动无法启动

按钮无法启动新活动,而是返回到启动器活动 - android a

如何在通知单击时重新启动/刷新活动内容

另一个活动的Android意图被多次执行

尝试开始新活动时出现空指针异常