Подтвердить что ты не робот

LocationManager: всегда ли включен "сетевой" провайдер?

Я хочу выбрать LocationProvider, который включен в Android. Цель создания проекта - Android 2.1.

Это то, что я делаю в onCreate().

// ...
LocationManager locationMgr = (LocationManager) 
getSystemService(Context.LOCATION_SERVICE);

Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.NO_REQUIREMENT);
criteria.setPowerRequirement(Criteria.NO_REQUIREMENT);
criteria.setCostAllowed(false);     

String bestProvider = locationMgr.getBestProvider(criteria, true);  

Toast.makeText(getApplicationContext(),   "Provider = " + bestProvider + " enabled= " + locationMgr.isProviderEnabled(bestProvider), Toast.LENGTH_LONG).show();
// ...

Теперь я выключаю каждый сетевой интерфейс и устанавливаю режим полета на своем устройстве (HTC Desire, Android 2.2). Я отсоединяю устройство от USB. Очевидно, что нет провайдера, который мог бы фактически предоставить данные о местоположении на устройство. Я специально спрашиваю getBestProvider только для разрешенных поставщиков, поэтому я ожидаю, что он вернет null или пустую строку в этом случае. Я ожидаю, что isProviderEnabled вернет false.

Фактический результат: getBestProvider возвращает "сеть" и isProviderEnabled сообщает, что он "включен". Всегда ли "сеть" включена, даже если ее нет?

4b9b3361

Ответ 1

После некоторого рытья я могу ответить на свой вопрос. Сначала я попробовал режим самолета с помощью:

ConnectivityManager connectivityMgr = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo[] nwInfos = connectivityMgr.getAllNetworkInfo();
for (NetworkInfo nwInfo : nwInfos) {
  Log.d(TAG, "Network Type Name: " + nwInfo.getTypeName());
  Log.d(TAG, "Network available: " + nwInfo.isAvailable());
  Log.d(TAG, "Network c_or-c: " + nwInfo.isConnectedOrConnecting());
  Log.d(TAG, "Network connected: " + nwInfo.isConnected());
} 

ConnectivityManager корректно сообщает "false", поскольку соединение отсутствует. Это полезно, чтобы проверить, действительно ли у вас есть сеть и, следовательно, сетевой провайдер местоположения. Затем я второй раз посмотрел на настройки своего устройства. И вот ответ:

locationMgr.isProviderEnabled(LocationManager.NETWORK_PROVIDER)

сообщает, что пользователь проверил настройки устройства (в моем случае в разделе Местоположение - Мое местоположение). Если вы снимете все поставщики там, он возвращает null, как ожидалось. Фактически это задокументировано в isProviderEnabled(), но я должен был его игнорировать. Дело закрыто.

Ответ 2

Попробуйте это

public static boolean isLocationSensingAvailable()
{
    boolean hasActiveLocationProvider = false;
    List<String> providers = locationManager.getProviders(true);
    for (String providerName:providers)
    {
        if (providerName.equals(LocationManager.GPS_PROVIDER))
        {
            hasActiveLocationProvider = isLocationProviderEnabled(providerName);
        }
        if (providerName.equals(LocationManager.NETWORK_PROVIDER))
        {
            hasActiveLocationProvider = ( SpondleApplication.isOnline() &&  isLocationProviderEnabled(providerName));
        }
    }
    return hasActiveLocationProvider;
}

Ответ 3

Вы всегда считаете это ответом, потому что вы выбрали опцию "Использовать сети" в меню настроек. У меня также была эта проблема, пока я не узнал об этом. Надеюсь, вы сочтете это полезным.