启用位置服务后几秒钟后位置可用

Posted

技术标签:

【中文标题】启用位置服务后几秒钟后位置可用【英文标题】:location available after few seconds after enable location services 【发布时间】:2016-10-07 21:54:53 【问题描述】:

我有一个按钮,每次用户点击它,我都会调用javascript接口getLocation(),如果位置服务关闭,将用户带到设置让用户打开它。

我通过onConnectedonLocationChanged 获取位置。每次我打开我的应用程序时,onConnected 都会被触发并获取位置。但是我注意到,当我从设置中启用位置服务并立即返回应用程序时,onConnected 被触发,但位置仍然是null。好像有延迟什么的。直到大约 3 秒后我再试一次,它会工作并为我获取位置。

这是我的相关代码:

安卓端:

protected Location location;
public void onCreate(Bundle savedInstanceState)

    super.onCreate(savedInstanceState);
    setContentView(R.layout.web_view);

    webView = (WebView) findViewById(R.id.webview);

    ......


// JavaScript Interface for location on Pick Listing Page
public class LocationInterface

    @JavascriptInterface
    public String getLocation() throws JSONException
    
        JSONObject json = new JSONObject();
        if (location != null)
        
            json.put("lat", location.getLatitude());
            json.put("lon", location.getLongitude());
            return(json.toString());
        
        else
        
            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(intent);
        
        return(null);
    


......//many override lifecycle methods here

@Override
public void onConnected(Bundle connectionHint)

    location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);


@Override
public void onLocationChanged(Location newLocation)

    location = newLocation;

我的问题是,我怎样才能毫不拖延地获得位置。

【问题讨论】:

【参考方案1】:

确保您在 Activity 的 onStart() 中请求位置更新,以便当您从位置设置返回时,Activity 将请求位置更新。

【讨论】:

添加这个:LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, locationRequest, this); ? 您能分享一下您的 logcat 输出吗? 当我从设置中返回时,活动会触发onConnected,它会尝试获取最后位置。还不够吗?我注意到只有几秒钟的延迟。【参考方案2】:

我终于找到了出路:

getLocation()添加一个条件:

....
    if (location != null)
    
        ....
    
    else if (location == null && isLocationEnabled(context)
    
        long startTime = System.currentTimeMillis();
        while (location == null && (System.currentTimeMillis()-startTime) < 5000)
        
            location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
        
        if (location != null)
        
            json.put("lat", location.getLatitude());
            json.put("lon", location.getLongitude());
            return(json.toString());
        
        return(null);
    
    else
    
        Intent intent = ....
        ....
    
    return(null);

【讨论】:

以上是关于启用位置服务后几秒钟后位置可用的主要内容,如果未能解决你的问题,请参考以下文章

用户选择允许后如何处理启用位置服务?

位置错误“谷歌播放服务不可用”,反应原生

开机后几秒钟就会出现:Warning!!Your computer chassis has been opening!! 怎样取消

模拟器找不到位置

用户拒绝位置服务后再次请求权限?

如何在 Eclipse 中启用“浏览部署位置...”上下文菜单项?