Android: 利用可能なすべてのネットワーク オペレータの GSM 信号強度を取得するにはどうすればいいですか? 質問する

Android: 利用可能なすべてのネットワーク オペレータの GSM 信号強度を取得するにはどうすればいいですか? 質問する

私は、自分のエリアにあるさまざまなネットワーク オペレータの信号強度をチェックする小さなアプリを開発中です。現在使用しているオペレータの信号は非常に不安定なので、他の 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);
        }
    }
}

役に立つといいのですが。面白いチャレンジだと思うので、次回時間があるときに試してみようと思います。頑張ってください!

おすすめ記事