LocationManager: всегда ли включен «сетевой» провайдер? - PullRequest
17 голосов
/ 05 февраля 2011

Я хочу выбрать 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 только для включенных провайдеров, поэтому я ожидаю, что в этом случае он вернет пустую или пустую строку. Я ожидаю, что isProviderEnabled вернет false.

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

Ответы [ 3 ]

21 голосов
/ 06 февраля 2011

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

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 () , но я, должно быть, упустил из виду. Дело закрыто.

1 голос
/ 02 февраля 2012

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

1 голос
/ 05 февраля 2011

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

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...