2013年6月2日日曜日

Android ネットワークの状態の検出

端末がきちんとネットワークにつながっているのか調べたい。
つながっていれば, 情報を表示とかアップロードボタンを有効にとか, Webを見せたいとか

ネットワークの接続状態を検出して, その結果で処理を決めたいという要求は必ずあるはず。(リアルタイムバージョンはこちら)

※iOS でも同じようなことができます いずれ書きたい

※Enblish version is How to detect Network Status

そんなときは, ConnectivityManager NetworkInfo を使います。

ConnectivityManager cm = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);

まずは, Activity 上で, CpnnectivityManager のインスタンスを取得します。

NetworkInfo info = cm.getActiveNetworkInfo();


次に, NetworkInfo のインスタンスを取得します。
これで, 状態を検出する準備ができました。

この NetworkInfo はいろいろと情報を取得できるみたいですが, 今回は接続状況と, その種類を出すくらいの簡単なサンプルを載せておきます。

わかりやすくするために, 新たにenum のNetworkStatus というのを作って簡単な分類ができるようにしています

○状態をenumでラップ
public enum NetworkStatus 
{
   OFF, WIFI, MOBILE, WIMAX, BLUETOOTH, ETHERNET;
}

○ネットワークの種類検出のサンプル
public static NetworkStatus getConnectedState( ConnectivityManager manager )
{
 NetworkStatus status = NetworkStatus.OFF;
  
 NetworkInfo info = manager.getActiveNetworkInfo();
  
 if ( info != null )
 {
  if ( info.isConnected() )
         {
   switch ( info.getType() )
   {
   case ConnectivityManager.TYPE_WIFI: // Wifi
           status = NetworkStatus.WIFI;
    break;
   case ConnectivityManager.TYPE_MOBILE_DUN: // Mobile 3G
   case ConnectivityManager.TYPE_MOBILE_HIPRI:
   case ConnectivityManager.TYPE_MOBILE_MMS:
   case ConnectivityManager.TYPE_MOBILE_SUPL:
   case ConnectivityManager.TYPE_MOBILE:
    status = NetworkStatus.MOBILE;
    break;
   case ConnectivityManager.TYPE_BLUETOOTH: // Bluetooth
    status = NetworkStatus.BLUETOOTH;
    break;
   case ConnectivityManager.TYPE_ETHERNET:  // Ethernet
    status = NetworkStatus.ETHERNET;
    break;
   }
  }
 }
 return status;
}

○接続しているかの確認
public static boolean isConnected ( ConnectivityManager manager )
{
 NetworkInfo info = manager.getActiveNetworkInfo();
 if (info == null )
 {
  return false;
 }
 return info.isConnected();
}
○Activityによるテスト
public class NetworkActivity extends Activity 
{
 private static String TAG = "Network";
 
 ConnectivityManager cm;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) 
 {
  super.onCreate(savedInstanceState);
  
  cm = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE); // connectivity
  
  connectionCheck();
  connectionStatus();
 }
 
 private void connectionCheck()
 {
  if ( NetworkConnection.isConnected(cm) )
  {
   Log.i(TAG, "Connected");
  }
  else
  {
   Log.i(TAG, "Disconnected");
  }
 }
 
 private void connectionStatus()
 {
  switch ( NetworkConnection.getConnectedState(cm) )
  {
  case MOBILE:
   Log.i(TAG, "Mobile");
   break;
  case WIFI:
   Log.i(TAG, "Wifi");
   break;
  case OFF:
   Log.i(TAG, "Off");
   break;
  default:
   Log.i(TAG, "Other");
   break;
  }
 }
}

ネットワークのoff 状態は, 実機でないと検出できないかもしれません。


0 件のコメント:

コメントを投稿