2012-05-04 10 views
39

私のエリア内のさまざまなネットワークオペレータの信号強度をチェックするために、少しのアプリで作業しています。私の現在のオペレータ信号は非常に不安定で、私は他のGSMオペレータの強みを調べたいと思っています。Android:利用可能なすべてのネットワークオペレータのGSM信号強度を取得するには

ソファ私は現在のネットワークオペレータのGSM信号強度を取得するためにonSignalStrengthsChangedコールバックでTelephonyManagerとPhoneStateListenerを使用していますが、このクラスでは接続されているネットワークの信号強度に関する情報しか得られないようです私のSIMカードに。

私はすべての利用可能な演算子のGSM信号強度の測定に興味があります。ネットを検索すると、内部のアンドロイドクラスの使用に関するあいまいなヒントが得られましたが、これについての良い例はまだ見つかりませんでした。

利用可能なすべてのネットワーク事業者のリストとその信号強度を取得するための回答が必要です。

+0

素敵で簡単[チュートリアル](http://www.firstdroid.com/2010/05/12/get-provider-gsm-signal-strength/) – mjosh

+0

こんにちは、あなたはこの質問の答えを得ていますか?いくつかの例を挙げてください?私はあなたの必要条件と同じものが必要です.. – reegan29

+0

これは古いスレッドだと知っていますが、あなたはあなたのアプリを完成させましたか?それはどこかでダウンロードできますか? – Philipp

答えて

-1

PhoneStateListenerを作成し、onSignalStrengthChangedコールバックを処理します。あなたのアプリが初期化されると、それはあなたに最初の通知を与えるはずです。これは1.xにあります。 2.xでは、これについて開いているissueがあります。

+1

ありがとうございました。私は上記のように、それは私に現在のネットワーク事業者の信号の信号強度を与えることを試みました。私は利用可能なすべての演算子とその現在の信号強度の完全なリストに興味があります。 –

+0

私はこれらを試したことはありません、私はそれを検索し、もし私が何か答えを見つけたら、ここに投稿します。 –

+0

wharは、「使用可能なすべての演算子とその現在の信号強度の完全なリストに興味があります」という意味です。 – Sandeep

2
private final PhoneStateListener phoneStateListener = new PhoneStateListener() { 
    @Override 
    public void onCallForwardingIndicatorChanged(boolean cfi) { 

     super.onCallForwardingIndicatorChanged(cfi); 
    } 

    @Override 
    public void onCallStateChanged(int state, String incomingNumber) { 
     //checkInternetConnection(); 
     String callState = "UNKNOWN"; 
     switch (state) { 
     case TelephonyManager.CALL_STATE_IDLE: 
      callState = "IDLE"; 
      break; 
     case TelephonyManager.CALL_STATE_RINGING: 
      callState = "Ringing (" + incomingNumber + ")"; 
      break; 
     case TelephonyManager.CALL_STATE_OFFHOOK: 
      callState = "Offhook"; 
      break; 
     } 

     Log.i("Phone Stats", "onCallStateChanged " + callState); 

     super.onCallStateChanged(state, incomingNumber); 
    } 

    @Override 
    public void onCellLocationChanged(CellLocation location) { 
     String cellLocationString = location.toString(); 

     super.onCellLocationChanged(location); 



    } 

    @Override 
    public void onDataActivity(int direction) { 
     String directionString = "none"; 
     switch (direction) { 
     case TelephonyManager.DATA_ACTIVITY_IN: 
      directionString = "IN"; 
      break; 
     case TelephonyManager.DATA_ACTIVITY_OUT: 
      directionString = "OUT"; 
      break; 
     case TelephonyManager.DATA_ACTIVITY_INOUT: 
      directionString = "INOUT"; 
      break; 
     case TelephonyManager.DATA_ACTIVITY_NONE: 
      directionString = "NONE"; 
      break; 
     default: 
      directionString = "UNKNOWN: " + direction; 
      break; 
     } 

     Log.i("Phone Stats", "onDataActivity " + directionString); 

     super.onDataActivity(direction); 
    } 

    @Override 
    public void onDataConnectionStateChanged(int state,int networktype) { 
     String connectionState = "Unknown"; 

     switch (state) { 

     case TelephonyManager.DATA_CONNECTED : 
      connectionState = "Connected"; 
      break; 
     case TelephonyManager.DATA_CONNECTING: 
      connectionState = "Connecting"; 
      break; 
     case TelephonyManager.DATA_DISCONNECTED: 
      connectionState = "Disconnected"; 
      break; 
     case TelephonyManager.DATA_SUSPENDED: 
      connectionState = "Suspended"; 
      break; 
     default: 
      connectionState = "Unknown: " + state; 
      break; 
     } 

     super.onDataConnectionStateChanged(state); 


     Log.i("Phone Stats", "onDataConnectionStateChanged " 
       + connectionState); 


    } 

    @Override 
    public void onMessageWaitingIndicatorChanged(boolean mwi) { 

     super.onMessageWaitingIndicatorChanged(mwi); 
    } 

    @Override 
    public void onServiceStateChanged(ServiceState serviceState) { 
     String serviceStateString = "UNKNOWN"; 
     switch (serviceState.getState()) { 
     case ServiceState.STATE_IN_SERVICE: 
      serviceStateString = "IN SERVICE"; 
      break; 
     case ServiceState.STATE_EMERGENCY_ONLY: 
      serviceStateString = "EMERGENCY ONLY"; 
      break; 
     case ServiceState.STATE_OUT_OF_SERVICE: 
      serviceStateString = "OUT OF SERVICE"; 
      break; 
     case ServiceState.STATE_POWER_OFF: 
      serviceStateString = "POWER OFF"; 
      break; 

     default: 
      serviceStateString = "UNKNOWN"; 
      break; 
     } 

     Log.i("Phone Stats", "onServiceStateChanged " + serviceStateString); 

     super.onServiceStateChanged(serviceState); 
    } 

    @Override 
    public void onSignalStrengthChanged(int asu) { 

     Log.i("Phone Stats", "onSignalStrengthChanged " + asu); 
     setSignalLevel(asu); 
     super.onSignalStrengthChanged(asu); 
    } 
    private void setSignalLevel(int level) { 
     int sLevel = (int) ((level/31.0) * 100); 


     Log.i("signalLevel ", "" + sLevel); 
    } 

}; 
+8

返信いただきありがとうございますが、このコードは購読されたネットワークに関する情報を私に提供するだけです。また、地域の他のプロバイダの信号強度にも興味があります。 –

+1

は、ネットワークを検索するときに、リストに表示されたオペレータで、表示されているすべての演算子のネットワーク強度を知りたいということを意味します.am i right ??? – Sandeep

+1

これは、私が現在行っているすべての可能なネットワーク事業者とその信号強度のリストを見たいのです。 –

21

たぶん、これらの引用符とのリンクは、あなたがあなた自身のソリューションコードを助けることができる:(フルでHow to get a list of available network providers?を引用)利用可能なネットワークプロバイダーの一覧を取得するには

1.-を:

アンドロイドので、オープンソースです私はソースを見て、最後に という名前のものが見つかりましたINetworkQueryService。あなたは をアンドロイド設定の実装と同じにして、この サービスとやりとりすることができます。 NetworkSettings.javaでのガイダンス:

  • onCreateはNetworkQueryServiceを起動し、バインドします。
  • loadNetworksList()は、ネットワークオペレータを照会するようにサービスに指示します。
  • INetworkQueryServiceCallbackが評価され、イベント "EVENT_NETWORK_SCAN_COMPLETED"が発生した場合、networksListLoadedは となり、使用可能なネットワーク上で反復処理されます。

2.- NetworkSetting.javaINetworkQueryService interfaceへでも素早く読み取り、私達にあなたの目標を達成するためのアイデアを提供します。

  • サービスを宣言してください。
/** 
* 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が評価された:
イベント "EVENT_NETWORK_SCAN_COMPLETEDは" 上げた場合
/** 
* 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(); 
    } 
}; 
  • 、networ ksListLoadedは、使用可能なネットワークを反復処理するために呼び出されます。
    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); 
         } 
        } 
    } 
    

は、私はそれが役に立てば幸い。私はそれが面白い挑戦だと思うので、多分次回私は余裕を持って試してみるでしょう。がんばろう!

+0

'INetworkQueryService'のような項目をどのようにインポートしますか?私は日食が認識する道を見つけることができません。 –

+0

今日は試してみることはできませんが、import com.android.phone.INetworkQueryServiceが機能しない場合は、コードをコピーして同じ原則を使用して独自のソリューションを作成することができます(基本的には、私の答えで)。 –

+0

それはまさに私がやったことです。アクティビティを一から作成し、あなたが提案したコードを使用しました。しかし、 'INetworkQueryService'や' NetworkQueryService'のような多くのクラスは認識されず、eclipseはそれらのためのインポートを見つけることができず、(import com.android.phone.INetworkQueryServiceのような)明白な推測は'com.android.phoneのインポートは解決できません。何をお勧めしますか? –

1

私は50個の評判ポイントを持っていないので、ここでの主題についての私の検索の結果である:

アレハンドロ・コロラド州のソリューションが良いものであるように思われます。しかし、問題は、それを達成するために使用されるクラスが、アンドロイドシステムアプリケーション、すなわち、システムと同じ署名鍵で署名されたアプリケーションのために予約されていることである。

どうすれば可能ですか?私はこれを達成するための2つの方法を見つけました。

最初の1つは、どのメーカーの会社にも仕事を依頼し、NDAに署名することですが、それは本当に良い解決策ではありません。特に、このキーで実装され、署名されたアプリは、コンパニオンのデバイスでのみ動作します。

2番目のものは、はるかに楽しいですが、私はあなたに警告します、それは簡単ではないでしょう、自分のROMを作ることです。アプリケーションを作成してROMの/ system/app /ディレクトリに挿入し、再コンパイルして新しいシステムでデバイスをフラッシュする必要があります。しかし、私はまだ答えていない質問がある、認識されていないROMの署名の問題です。 私はこの問題を避ける最善の方法は、使用しているリカバリにROM署名キーを追加することだと思います。

私はこの時点で、おそらくあなたはこれらの研究が役に立つと思うかもしれません。 私はあなたのためにいくつかの情報を見つけたら後で戻ってきます。さようなら。

関連する問題