私は、自分のエリアにあるさまざまなネットワーク オペレータの信号強度をチェックする小さなアプリを開発中です。現在使用しているオペレータの信号は非常に不安定なので、他の GSM オペレータの信号強度を調べたいと思っています。
これまで、TelephonyManager と PhoneStateListener を onSignalStrengthsChanged コールバックとともに使用して、現在のネットワーク オペレータの GSM 信号強度を取得してきましたが、このクラスでは SIM カードに接続されているネットワークの信号強度に関する情報しか提供されないようです。
利用可能なすべてのオペレータの GSM 信号強度の測定に興味があります。ネットで検索すると、内部 Android クラスの使用に関する漠然としたヒントが見つかりました。しかし、これに関する良い例はまだ見つかっていません。
利用可能なすべてのネットワーク オペレーターとその信号強度のリストを取得できる回答があれば、ありがたいです。
ベストアンサー1
以下の引用とリンクは、独自のソリューションをコーディングするのに役立つかもしれません。
1.- 利用可能なネットワークプロバイダーのリストを取得するには(引用元:利用可能なネットワークプロバイダーのリストを取得するにはどうすればよいですか?略さずに):
Androidはオープンソースなので、ソースを見てみたところ、IネットワーククエリサービスAndroid 設定の実装と同じように、このサービスとやり取りできると思います。NetworkSettings.java によるガイダンス:
- onCreate は NetworkQueryService を開始し、バインドします。
- loadNetworksList() は、サービスにネットワーク オペレータを照会するように指示します。
- INetworkQueryServiceCallback が評価され、イベント「EVENT_NETWORK_SCAN_COMPLETED」が発生した場合、networksListLoaded が呼び出され、利用可能なネットワークが反復処理されます。
2.- ちょっとした読書でもネットワーク設定.javaそしてINetworkQueryService インターフェース、あなたの目標を達成するためのアイデアを提供します。
- 宣言内のサービスを接続します。
/** * Service connection code for the NetworkQueryService. * Handles the work of binding to a local object so that we can make * the appropriate service calls. */ /** Local service interface */ private INetworkQueryService mNetworkQueryService = null; /** Service connection */ private final ServiceConnection mNetworkQueryServiceConnection = new ServiceConnection() { /** Handle the task of binding the local object to the service */ public void onServiceConnected(ComponentName className, IBinder service) { if (DBG) log("connection created, binding local service."); mNetworkQueryService = ((NetworkQueryService.LocalBinder) service).getService(); // as soon as it is bound, run a query. loadNetworksList(); } /** Handle the task of cleaning up the local binding */ public void onServiceDisconnected(ComponentName className) { if (DBG) log("connection disconnected, cleaning local binding."); mNetworkQueryService = null; } };
- onCreate は NetworkQueryService を開始し、バインドします。
Intent intent = new Intent(this, NetworkQueryService.class); ... startService (intent); bindService (new Intent(this, NetworkQueryService.class), mNetworkQueryServiceConnection, Context.BIND_AUTO_CREATE);
- loadNetworksList() は、サービスにネットワーク オペレータを照会するように指示します。
private void loadNetworksList() { ... // delegate query request to the service. try { mNetworkQueryService.startNetworkQuery(mCallback); } catch (RemoteException e) { } displayEmptyNetworkList(false); }
- INetworkQueryServiceCallback が評価されます:
/** * This implementation of INetworkQueryServiceCallback is used to receive * callback notifications from the network query service. */ private final INetworkQueryServiceCallback mCallback = new INetworkQueryServiceCallback.Stub() { /** place the message on the looper queue upon query completion. */ public void onQueryComplete(List<OperatorInfo> networkInfoArray, int status) { if (DBG) log("notifying message loop of query completion."); Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_COMPLETED, status, 0, networkInfoArray); msg.sendToTarget(); } };
- イベント「EVENT_NETWORK_SCAN_COMPLETED」が発生した場合、networksListLoaded が呼び出され、利用可能なネットワークが反復処理されます。
private void networksListLoaded(List<OperatorInfo> result, int status) { ... if (status != NetworkQueryService.QUERY_OK) { ... displayNetworkQueryFailed(status); displayEmptyNetworkList(true); } else { if (result != null){ displayEmptyNetworkList(false); ... } else { displayEmptyNetworkList(true); } } }
役に立つといいのですが。面白いチャレンジだと思うので、次回時間があるときに試してみようと思います。頑張ってください!