web-dev-qa-db-ja.com

ネットワークリスナーAndroid

Androidの電話のネットワークがいつ切れるかを確認したい。そのイベントをキャプチャできますか?

適切なAPIや、同じことを説明する例がありません。誰かがやったか、例のリンクがあれば本当に助かります。

61
Sam97305421562

新しいJavaクラス:

public class ConnectionChangeReceiver extends BroadcastReceiver
{
  @Override
  public void onReceive( Context context, Intent intent )
  {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE );
    NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
    NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo(     ConnectivityManager.TYPE_MOBILE );
    if ( activeNetInfo != null )
    {
      Toast.makeText( context, "Active Network Type : " + activeNetInfo.getTypeName(), Toast.LENGTH_SHORT ).show();
    }
    if( mobNetInfo != null )
    {
      Toast.makeText( context, "Mobile Network Type : " + mobNetInfo.getTypeName(), Toast.LENGTH_SHORT ).show();
    }
  }
}

AndroidManifest.xmlの「manifest」要素の下にある新しいxml:

<!-- Needed to check when the network connection changes -->
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE"/>

AndroidManifest.xmlの「application」要素の下にある新しいxml:

<receiver Android:name="com.blackboard.androidtest.receiver.ConnectionChangeReceiver"
          Android:label="NetworkConnection">
  <intent-filter>
    <action Android:name="Android.net.conn.CONNECTIVITY_CHANGE"/>
  </intent-filter>
</receiver>
147
Eric

私は小さなセットアップを使用して、画像などのスケーリング方法を決定するための帯域幅を確認しています。

アクティビティの下、AndroidManifestで:

<intent-filter>
...
    <action Android:name="Android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>

チェックが実行されているアクティビティ:

boolean network;
int bandwidth;

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    network = isDataConnected();
    bandwidth = isHighBandwidth();
    registerReceiver(new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            network = isDataConnected();
            bandwidth = isHighBandwidth();
        }
    }, new IntentFilter("Android.net.conn.CONNECTIVITY_CHANGE"));
    ...
}
...
private boolean isDataConnected() {
    try {
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        return cm.getActiveNetworkInfo().isConnectedOrConnecting();
    } catch (Exception e) {
        return false;
    }
}

private int isHighBandwidth() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo info = cm.getActiveNetworkInfo();
    if (info.getType() == ConnectivityManager.TYPE_WIFI) {
        WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        return wm.getConnectionInfo().getLinkSpeed();
    } else if (info.getType() == ConnectivityManager.TYPE_MOBILE) {
        TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        return tm.getNetworkType();
    }
    return 0;
}

使用例は次のとおりです。

if (network) {
    if (bandwidth > 16) {
        // Code for large items
    } else if (bandwidth <= 16 && bandwidth > 8) {
        // Code for medium items
    } else {
        //Code for small items
    }
} else {
    //Code for disconnected
}

それは最もきれいではありませんが、十分な柔軟性を備えているため、アイテムの帯域幅のカットオフを、アイテムとその要件に応じて変更できます。

16
Abandoned Cart

Android Annotations を使用するオプションがアクティビティでこれを試すためのオプションである場合-それだけです、残りは生成されます:

@Receiver(actions = ConnectivityManager.CONNECTIVITY_ACTION,
        registerAt = Receiver.RegisterAt.OnResumeOnPause)
void onConnectivityChange() {
    //react
}

これは、既にAndroidAnnotationsを使用している場合にのみ使用してください。この依存関係をプロジェクト内にこのコードの一部のみに配置するのはやり過ぎです。

11
luckyhandler

上記の回答は、モバイルパケットデータが有効な場合にのみ機能します。そうでない場合、ConnectivityManagerはnullになり、NetworkInfoを取得できなくなります。それを回避する方法は、代わりにPhoneStateListenerまたはTelephonyManagerを使用することです。

9
noillusion