どうもonReceiveは、ネットワークの状態が変わるたびに呼ばれるらしく、IPアドレスを取得した後にも呼び出されているようです。
というわけで実現できました。
まず、こんな感じのメソッドを作ります。
lang
1 /** ネットワークがアクティブかを判断する */
2 public static boolean isNetworkActive(Context context){
3 String nowAddress = getActiveIpAddress(context);
4 Log.d(TAG,"現在のIPアドレス" + nowAddress);
5 if("0.0.0.0".equals(nowAddress)){
6 return false;
7 }else if("127.0.0.1".equals(nowAddress)){
8 return false;
9 }else
10 return true;
11 }
12 /**
13 * 3GとWifiのうちアクティブなIPアドレスを取得する
14 *
15 * @param context
16 * @return String IPAddress
17 */
18 public static String getActiveIpAddress(Context context) {
19 // 接続方法取得
20 String status = getActiveNetwork(context);
21 if ("3G".equals(status)) {
22 return getIPAddress();
23
24 } else if ("WIFI".equals(status)) {
25 return getWifiIPAddress(context);
26 }
27
28 return "127.0.0.1";
29 }
30
31 /**
32 * その瞬間アクティブなネットワークを取得する
33 * @param context
34 * @return 3G / WIFI
35 */
36 public static String getActiveNetwork(Context context) {
37
38 // 3Gの状態を取得する
39 ConnectivityManager cm = (ConnectivityManager) context
40 .getSystemService(Context.CONNECTIVITY_SERVICE);
41 // ネットワーク情報を全て取得
42 NetworkInfo[] networkInfos = cm.getAllNetworkInfo();
43 for (NetworkInfo ni : networkInfos) {
44 if (ni.getType() == ConnectivityManager.TYPE_MOBILE
45 && ni.isConnected()) {
46
47 return "3G";
48 } else if (ni.getType() == ConnectivityManager.TYPE_WIFI
49 && ni.isConnected()) {
50
51 return "WIFI";
52 }
53 }
54 return "";
55 }
56 /**
57 * 3G回線のIPアドレスを取得する
58 *
59 * @return
60 */
61 private static String getIPAddress() {
62 try {
63 Enumeration<NetworkInterface> interfaces = NetworkInterface
64 .getNetworkInterfaces();
65
66 while (interfaces.hasMoreElements()) {
67 NetworkInterface network = interfaces.nextElement();
68 Enumeration<InetAddress> addresses = network.getInetAddresses();
69
70 while (addresses.hasMoreElements()) {
71 String address = addresses.nextElement().getHostAddress();
72 if (address.matches(ipShape)) {
73 return address;
74 }
75 // 127.0.0.1と0.0.0.0以外のアドレスが見つかったらそれを返す
76 // if (!"127.0.0.1".equals(address)
77 // && !"0.0.0.0".equals(address)) {
78 // return address;
79 // }
80 }
81 }
82 } catch (IOException e) {
83 return "127.0.0.1";
84 } catch (Exception e) {
85 return "127.0.0.1";
86 }
87
88 return "127.0.0.1";
89 }
90
91 /**
92 * WifiのIPアドレスを取得する
93 *
94 * @param context
95 * @return
96 */
97 private static String getWifiIPAddress(Context context) {
98 WifiManager wifiManager = (WifiManager) context
99 .getSystemService(Context.WIFI_SERVICE);
100 WifiInfo wifiInfo = wifiManager.getConnectionInfo();
101 int ipAddress = wifiInfo.getIpAddress();
102 String strIPAddess = ((ipAddress >> 0) & 0xFF) + "."
103 + ((ipAddress >> 8) & 0xFF) + "." + ((ipAddress >> 16) & 0xFF)
104 + "." + ((ipAddress >> 24) & 0xFF);
105 if (!"".equals(strIPAddess)) {
106 return strIPAddess;
107 }
108 return "127.0.0.1";
109 }
あとは、onReceiveからIPアドレスの取得をチェックできるので、こんな感じで実装すれば、ネットワークが使えるようになったかを確認できます。
lang
1@Override
2public void onReceive(Context context, Intent intent) {
3 //Broadcast intentを受信
4 ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
5 synchronized (isDisConnect) {
6 NetworkInfo info = manager.getActiveNetworkInfo();
7 if (info == null) {
8 //接続していない。WIFIやLTEなど、何かしら接続がされていればNetworkInfoは必ず取得できるはず。NetworkInfoがnullであるという事は、全ての回線が切断された事を意味している
9 isDisConnect = true;
10 Log.i(TAG,"通信が完全に切断されました。");
11 } else {
12 Log.d(TAG,"回線は切断されてないです。でもどういう状態か不明");
13 //接続している時。
14 //一度完全にコネクションが切断された後に、接続が取得できたという事は、通信が回復したと判断できる。通信回復時の処理を実行する
15 if(isDisConnect){
16 //通信が回復した時の処理
17 if(isNetworkActive(context)) {
18 Log.i(TAG, "通信回復時の処理を実行します");
19 isDisConnect = false;
20 mNetworkStateListener.onConnect();
21 }
22 }
23 }
24 }
25}
無事解決しました。
ありがとうございました。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/02/26 02:52