NETWORK_PROVIDER ロケーション プロバイダーは、 Google API を使用しないAndroid 4 以降のエミュレーターではアクセスできないようです(実際には、すべてのエミュレーターでテストしたわけではありません。以下を参照してください)。私がテストした実際のデバイスはそれで問題ありません (ただし、それらはすべて Google サービスを搭載しています。カスタムのクリーンな Android バージョン、おそらく Kindle でテストするのは興味深いでしょう)。
デバイス設定でプロバイダーを有効/無効にすることは問題ではありません。エミュレーターにはありません。
症状
基本的にこのコード:
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,0,mLocListener);
次の例外が発生します。
java.lang.IllegalArgumentException: provider doesn't exisit: null
すべての Android 4+ ネイキッド エミュレーター (Google バインド エミュレーターとは対照的に)
注: 「exisit」のタイプミスは実際のログ行にあります。
診断
次を使用して、ターゲット デバイス上のすべてのロケーション プロバイダーのリストを取得します。
List<String> providers = locationManager.getAllProviders();
ネットワークプロバイダーが存在することがわかります
- 物理デバイス
- Android 2.3.3 エミュレーター (Google API なし)
- Android レベル 17 (4.2) エミュレーター (Google API を使用)
しかし、オンではありません
- Google API を使用した Android レベル 15 (4.0.3) エミュレーター
- Android 4.2 エミュレーター (Google API なし)
私の推測では、非技術的な理由で、Google は AOSP でのネットワークロケーション サービスを許可しておらず、その使用を 4.2 (?) から Google にバインドされた OS のバージョンに制限しています。
Google 以外のデバイス (Kindle など) に代わりのネットワーク ロケーション サービスがあるかどうかはわかりません。
アプリへの影響の可能性
これがほとんどのスマートフォンやタブレットに影響を与えるとは思わない. しかし、それはできます
- あなたのテスト能力をいくらか損なう
- Androidのカスタム/Google以外のバージョンを使用するユーザーの互換性の問題です(これもKindleですか?)
検出方法
次のような簡単なテスト:
locationManager.getAllProviders().contains(LocationManager.NETWORK_PROVIDER)
ネットワークプロバイダーがデバイスに存在するかどうかを簡単に知ることができます。存在するが、ユーザーがアクティブ化していない場合、LocationListener はロケーション リクエストに続いてonProviderDisabledコールバックを受け取ることに注意してください。