Android: How do I get GSM signal strength for all available network operators

前端 未结 4 387
鱼传尺愫
鱼传尺愫 2020-11-29 01:28

I am working on a little app to check the signal strength of various network operators in my area. My current operators signal is quite unstable and I want to look into the

4条回答
  •  迷失自我
    2020-11-29 02:16

    Maybe these quotes and links can help you code your own solution:

    1.- To get a list of available network providers (quoting How to get a list of available network providers? in full):

    Since Android is open source I had a look at the sources and finally found something called INetworkQueryService. I guess you can do the same as the android settings implementation and interact with this service. Some guidance through NetworkSettings.java:

    • onCreate starts the NetworkQueryService and binds it.
    • loadNetworksList() tells the service to query for network operators.
    • INetworkQueryServiceCallback is evaluated and if the event "EVENT_NETWORK_SCAN_COMPLETED" was raised, networksListLoaded will be called to iterate over the available Networks.

    2.- Even a quick read to NetworkSetting.java and INetworkQueryService interface, gives us an idea to achieve your goal.

    • Connect the service in declaration.
    /**
     * 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 starts the NetworkQueryService and binds it.
    Intent intent = new Intent(this, NetworkQueryService.class);
    ...
    startService (intent);
    bindService (new Intent(this, NetworkQueryService.class), mNetworkQueryServiceConnection,
                            Context.BIND_AUTO_CREATE);
    
    • loadNetworksList() tells the service to query for network operators.
    private void loadNetworksList() {
    ...    
    // delegate query request to the service.
    try {
        mNetworkQueryService.startNetworkQuery(mCallback);
    } catch (RemoteException e) {
    }
    
    displayEmptyNetworkList(false); 
    }
    
    • INetworkQueryServiceCallback is evaluated:
    /**
     * 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 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();
        }
    };
    
    • If the event "EVENT_NETWORK_SCAN_COMPLETED" was raised, networksListLoaded will be called to iterate over the available Networks.
    private void networksListLoaded(List result, int status) {
        ...
    
        if (status != NetworkQueryService.QUERY_OK) {
            ...
            displayNetworkQueryFailed(status);
            displayEmptyNetworkList(true);
        } else {
            if (result != null){
                displayEmptyNetworkList(false);
                ...
            } else {
                displayEmptyNetworkList(true);
            }
        }
    }
    

    I hope it helps. I think it's an interesting challenge so maybe I'll give it a try next time I have some spare time. Good luck!

提交回复
热议问题