我正在编写一个需要检查以太网(RJ45)连接的应用程序。 为此目的,我使用广播接收器,但它只适用于连接状态,当我断开以太网(RJ45)时,我的应用程序挂起。
这是我的广播接收器代码和清单。
public class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
boolean isConnected ;
ConnectivityManager networkConnectivity = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
final NetworkInfo networkInfo = networkConnectivity.getActiveNetworkInfo();
if(networkInfo.getType() == ConnectivityManager.TYPE_ETHERNET)
isConnected = true;
else
isConnected = false;
}
}
清单
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<receiver
android:name=".NetworkChangeReceiver"
android:label="NetworkChangeReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
答案 0 :(得分:3)
据我所知,您应该对活动网络信息进行空值检查。它在Android的API参考中声明
<强> public NetworkInfo getActiveNetworkInfo () 强> 返回有关当前活动的默认数据网络的详细信息连接时,此网络是传出连接的默认路由。在启动网络流量之前,您应该始终检查isConnected()。当没有默认网络时,这可能会返回null。
请查看以下代码。
String action = intent.getAction();
if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
ConnectivityManager conMan = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = conMan.getActiveNetworkInfo();
if (netInfo != null) {
if (netInfo.getType() == ConnectivityManager.TYPE_ETHERNET) {
// is connected
}
}
}