web-dev-qa-db-ja.com

LocationManager:「ネットワーク」プロバイダーは常に有効になっていますか?

Androidで有効になっているLocationProviderを選択したい。プロジェクトのビルドターゲットは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が「有効」であると報告することです。 「ネットワーク」は、有効になっていない場合でも常に「有効」になっていますか?

18
rgr_mt

少し掘り下げた後、私は自分の質問に答えることができます。最初に機内モードを試しました:

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)

ユーザーがデバイス設定を確認したかどうかを報告します(私の場合はLocation-My Location)。そこですべてのプロバイダーのチェックを外すと、期待どおりにnullが返されます。それは実際には isProviderEnabled() に文書化されていますが、私はそれを見落としていたに違いありません。名探偵コナン。

21
rgr_mt

設定メニューで[ネットワークを使用する]オプションを選択しているため、常に答えとして真になります。私もこれを見つけるまでこの問題を抱えていました。これがお役に立てば幸いです。

1
fergerm

これを試して

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;
}
1
Ollie C