如何处理getLastKnownLocation返回null?

时间:2014-10-21 10:01:35

标签: android

我在我正在开发的Android应用程序中使用位置服务。经过一些研究,我发现getLastKnownLocation()是获取用户最近位置的最快方式。我没有问题它有点过时,因为我的应用程序的模块不需要用户的当前位置。这个解决方案对我来说很好,因为我不需要在特定时刻确切地需要用户的确切位置。

但是,getLastKnownLocation的明显问题是,如果设备没有存储最近的位置或者您最近重新启动了设备,则必须返回null

我的问题是,当getLastKnownLocationnull时该怎么做?

这就是我的想法:

LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_COARSE);
String bestProvider = lm.getBestProvider(criteria, false);
Location l = lm.getLastKnownLocation(bestProvider);
if(l != null) {
    Log.d("Lat", String.valueOf(l.getLatitude()));
    Log.d("Lng", String.valueOf(l.getLongitude()));
}
else {
    PendingIntent pi = PendingIntent.getBroadcast(this, 0, new Intent(), 
    PendingIntent.FLAG_UPDATE_CURRENT);
    lm.requestSingleUpdate(bestProvider, pi);
    Location ln = lm.getLastKnownLocation(lm.getBestProvider(criteria, false));
    // Still returns null
    Log.d("NewLat", String.valueOf(ln.getLatitude()));
    Log.d("NewLng", String.valueOf(ln.getLongitude()));
}

那么,reqyestSingleUpdate的呼叫是否应该存储最新的位置数据?但它似乎并没有起作用。 我哪里错了?你怎么解决这个问题?

2 个答案:

答案 0 :(得分:0)

所以在你的应用程序中插入他的类,然后在你的活动中使用它就像这样

        mMyLocHelper = new MyLocationHelper();

        // An object with callback that will be called after location was found
        LocationResult locationResult = new LocationResult() {
            @Override
            public void gotLocation(Location location) {
                if (location != null) {
                    mUserLocation = location;

                    // Here my action after location is known (on UI thread!)
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {                 
                            myAction();
                        }
                    });
                }
                else {
                    // No location was found
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {                 
                            informUser();
                        }
                    });
                }
            }
        };

        // We state, that we can wait for 20 seconds for the location, and start the process
        if (mMyLocHelper.getLocation(this, locationResult, 20)) {
            mLocationEnabled = true;
        }
        else {
            mLocationEnabled = false;

            // Localization is turned off. Inform user
            informUser();
        }
  • 无论如何你可以通知用户。

无法保证您将获得位置。

答案 1 :(得分:0)

1)您无法避免程序中出现“位置未知”状态。在某个时刻,这个位置确实是未知的。

2)您 getBestProvider(),但您可以使用其他提供商一段时间。无法保证第二个提供商能够正常工作(手机中可能没有SIM卡)。

3)您可以在首选项中存储最后的已知位置,请参阅 Context.getSharedPreferences()

4)你可以开始“在北极”(北极坐标: - )。

然而,您的应用程序可能永远不会收到位置数据:它可能会在建筑物中启动,其中有太多金属供GPS工作,并且手机插槽中没有SIM卡(如果 < / em>手机而不是平板电脑。