8

デバイスが切断されたネットワークを取得する必要があります。

今私は使用します:

NetworkInfo ni =intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);

そしてチェック:

ni.isConnected()

これが false を返す場合 ni - デバイスが切断されたネットワークです。

ただし、API 14 では非推奨ですConnectivityManager.EXTRA_NETWORK_INFO。GoogleはgetActiveNetworkInfo() を使用してネットワーク情報を取得すると述べています。ただし、 getActiveNetworkInfo() は常に、デバイスが現在接続されているネットワークを返します ( true を返す必要があります)。isConnected()

ConnectivityManager.EXTRA_NETWORK_INFO を使用せずに、デバイスが切断されたネットワークのネットワーク情報を取得するにはどうすればよいですか?

Sertorio Noronha さん、getActiveNetworkInfo() を使用すると、現在接続しているネットワークしか取得できません! しかし、切断されたネットワークを取得する必要があります。

ConnectivityManager cm = (ConnectivityManager)
    context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo n1 = cm.getActiveNetworkInfo();
Log.d("tets", String.format("%s: %s", n1.getTypeName(), n1.isConnected()));

WI-FI から切断し、ログで 3G に接続すると:

mobile: true
mobile: true

3G から切断し、ログで WI-FI に接続すると:

WIFI: true
WIFI: true
WIFI: true

getActiveNetworkInfo は、現在接続されているネットワークのみを返しますが、切断されたネットワークは返しません。

ログで廃止されたintent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO)を使用すると、次のように表示されます。

WI-FI から切断して 3G に接続すると、次のようになります。

WIFI: false
mobile: true

3G から切断して WI-FI に接続すると、次のようになります。

mobile: false
WIFI: true

しかし、非推奨の API を使用したくありません。最新の API を使用して、切断されたネットワークを取得する方法は?

4

3 に答える 3

11

以下を使用できます

ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
int networkType = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_TYPE);
boolean isWiFi = networkType == ConnectivityManager.TYPE_WIFI;
boolean isMobile = networkType == ConnectivityManager.TYPE_MOBILE;
NetworkInfo networkInfo = connectivityManager.getNetworkInfo(networkType);
boolean isConnected = networkInfo.isConnected();

if (isWiFi) {
    if (isConnected) {
        Log.i("APP_TAG", "Wi-Fi - CONNECTED");
    } else {
        Log.i("APP_TAG", "Wi-Fi - DISCONNECTED");
    }
} else if (isMobile) {
    if (isConnected) {
        Log.i("APP_TAG", "Mobile - CONNECTED");
    } else {
        Log.i("APP_TAG", "Mobile - DISCONNECTED");
    }
} else {
    if (isConnected) {
        Log.i("APP_TAG", networkInfo.getTypeName() + " - CONNECTED");
    } else {
        Log.i("APP_TAG", networkInfo.getTypeName() + " - DISCONNECTED");
    }
}
于 2013-12-15T01:07:12.437 に答える
6

非推奨でないコードの動作

/**Receiver*/   

 public class NetworkStateReceiver extends BroadcastReceiver {

        /*
         * @see android.content.BroadcastReceiver#onReceive(android.content.Context,
         * android.content.Intent)
         */
        @Override
        public void onReceive(Context context, Intent intent) {
            ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
            int networkType = intent.getExtras().getInt(ConnectivityManager.EXTRA_NETWORK_TYPE);
            boolean isWiFi = networkType == ConnectivityManager.TYPE_WIFI;
            boolean isMobile = networkType == ConnectivityManager.TYPE_MOBILE;
            NetworkInfo networkInfo = connectivityManager.getNetworkInfo(networkType);
            boolean isConnected = networkInfo.isConnected();

            if (isWiFi) {
                if (isConnected) {
                    Log.i("APP_TAG", "Wi-Fi - CONNECTED");
                } else {
                    Log.i("APP_TAG", "Wi-Fi - DISCONNECTED");
                }
            } else if (isMobile) {
                if (isConnected) {
                    Log.i("APP_TAG", "Mobile - CONNECTED");
                } else {
                    Log.i("APP_TAG", "Mobile - DISCONNECTED");
                }
            } else {
                if (isConnected) {
                    Log.i("APP_TAG", networkInfo.getTypeName() + " - CONNECTED");
                } else {
                    Log.i("APP_TAG", networkInfo.getTypeName() + " - DISCONNECTED");
                }
            }
        }

    }

そしてマニフェストで

<!-- Receiver registration in manifest -->
     <receiver android:name="com.xxx.yyy.NetworkStateReceiver" >
                <intent-filter>
                    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                </intent-filter>
            </receiver>

<!-- Internet permission for network comunication -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
于 2014-08-08T13:00:04.147 に答える
6

Context を介して NetworkInfo のインスタンスを取得できます。

ConnectivityManager connectivityManager = ((ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE));
NetworkInfo currentNetworkInfo = connectivityManager.getActiveNetworkInfo();

if(currentNetworkInfo != null && currentNetworkInfo.isConnected()){
   // Your logic goes in here
}
于 2013-02-22T11:55:31.190 に答える