首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android:从最佳可用提供商处获取当前位置

Android:从最佳可用提供商处获取当前位置
EN

Stack Overflow用户
提问于 2010-03-24 07:39:26
回答 1查看 39.7K关注 0票数 19

我有一些Android代码,需要快速获得最佳可用位置,从GPS,网络或任何可用的地方。准确性不如速度重要。

获得最好的可用位置肯定是一个真正的标准任务。然而,我找不到任何代码来演示它。Android位置代码希望你指定条件,注册更新,然后等待--如果你有详细的条件,并且不介意等待,这是很好的。

但我的应用程序需要更像地图应用程序第一次定位你时那样工作-从任何可用的提供商那里工作,只需检查位置是否非常过时或为空。

我尝试使用我自己的代码来做这件事,但是遇到了问题。(上载发生在IntentService内部,如果这有什么不同的话。我已经包含了信息的所有代码。)这段代码有什么问题?

代码语言:javascript
复制
@Override
protected void onHandleIntent(Intent arg0) {
    testProviders();
    doUpload();
}
private boolean doUpload() {
       int j = 0;
       // check if we have accurate location data yet - wait up to 30 seconds
       while (j < 30) {
           if ((latString == "") || (lonString == "")) {
               Log.d(LOG_TAG, "latlng null");
               Thread.sleep(1000);
               j++;
       } else {
                Log.d(LOG_TAG, "found lat " + latString + " and lon " + lonString);
            break;
       }
       //do the upload here anyway, with or without location data
       //[code removed for brevity]
}
public boolean testProviders() {
    Log.e(LOG_TAG, "testProviders");
    String location_context = Context.LOCATION_SERVICE;
    locationmanager = (LocationManager) getSystemService(location_context);
    List<String> providers = locationmanager.getProviders(true);
    for (String provider : providers) {
        Log.e(LOG_TAG, "registering provider " + provider);
        listener = new LocationListener() {
            public void onLocationChanged(Location location) {
                // keep checking the location - until we have
                // what we need
                //if (!checkLoc(location)) {
                Log.e(LOG_TAG, "onLocationChanged");
                locationDetermined = checkLoc(location);
                //}
            }
            public void onProviderDisabled(String provider) {
            }
            public void onProviderEnabled(String provider) {
            }
            public void onStatusChanged(String provider, int status,
                    Bundle extras) {
            }
        };
        locationmanager.requestLocationUpdates(provider, 0,
                0, listener);
    }
    Log.e(LOG_TAG, "getting updates");
    return true;
}
private boolean checkLoc(Location location) {
    float tempAccuracy = location.getAccuracy();
    int locAccuracy = (int) tempAccuracy;
    Log.d(LOG_TAG, "locAccuracy = " + locAccuracy);
    if ((locAccuracy != 0) && (locAccuracy < LOCATION_ACCURACY)) {
        latitude = location.getLatitude();
        longitude = location.getLongitude();
        latString = latitude.toString();
        lonString = longitude.toString();
        return true;
    }
    return false;
}
public void removeListeners() {
    // Log.e(LOG_TAG, "removeListeners");
    if ((locationmanager != null) && (listener != null)) {
        locationmanager.removeUpdates(listener);
    }
    locationmanager = null;
    // Log.d(LOG_TAG, "Removed " + listener.toString());
}
@Override
public void onDestroy() {
    super.onDestroy();
    removeListeners();
}

不幸的是,这会找到网络提供商,但只输出latlng null 30次-它似乎从来没有得到一个位置。我甚至从未得到过locationChanged的日志语句。

这很有趣,因为我可以从ddms中看到如下输出:

代码语言:javascript
复制
NetworkLocationProvider: onCellLocationChanged [305,8580]
NetworkLocationProvider: getNetworkLocation(): returning cache location with accuracy 75.0

似乎暗示网络提供商毕竟有一些位置信息,但我就是不明白。

有人能帮上忙吗?我认为对于Android/StackOverflow社区来说,工作示例代码将是一个有用的资源。

EN

回答 1

Stack Overflow用户

发布于 2010-03-24 07:53:54

Thread.sleep()在生产代码中是一个严重的代码臭味。如果你发现你不得不这样做,你可能正在做一些不应该以这种方式工作的事情。在这种情况下,我认为这就是问题的根源--您没有让Android返回处理这个线程的消息队列来分派它找到的任何位置更新。我怀疑IntentService不适合您的场景。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2504429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档