我要监听GoogleTV设备断开连接的时间,然后显示弹出警告。
我认为我已经通过下面的代码实现了这一点,但随后发现,只有当设备的以太网电缆断开连接时才会警告我断开连接:即LAN。当路由器的输入以太网电缆断开时,我不会收到警报:即WAN。
我发现,当断开LAN电缆时,GTV设备将失去其IP地址,但当断开WAN电缆时,GTV设备仍将具有IP地址-这就是为什么我没有收到应用程序断开连接的警报的原因。
那么,当GoogleTV设备不再连接到广域网时,我如何检查?要做到这一点,我需要在下面的代码中添加什么?
startListeningToNetwork();
private void startListeningToNetwork() {
if(_networkStateReceiver == null){
//Listen for when the network changes. If app loses internet before webView has loaded, then display error message.
_networkStateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if(!isConnected()){
showNetworkErrorDialog();
} else {
closeNetworkError();
}
}
};
IntentFilter networkFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
getActivity().registerReceiver(_networkStateReceiver, networkFilter);
}
}
private boolean isConnected() {
ConnectivityManager cm = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
Toast.makeText(getActivity(), "isConnected? " + (cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnected()) , Toast.LENGTH_SHORT).show();
return (cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnected());
}
发布于 2013-07-31 15:24:38
为BroadcastReceiver注册CONNECTIVITY_ACTION
- Use the `Context` that `BroadcastReceiver` is passed with to get the `ConnectivityManager` and get current info about any active network
- Use parcerable [extras](http://developer.android.com/reference/android/net/ConnectivityManager.html#EXTRA_EXTRA_INFO) sent to the `Intent`
中的任一选项获取的活动网络的详细状态
公共类LANConnectionReceiver扩展了BroadcastReceiver{
@Override
public void onReceive(Context context, Intent i) {
NetworkInfo info = (NetworkInfo)i.getParcelableExtra(ConnectivityManager.EXTRA_EXTRA_INFO);
/*or use the context to get the connection manager whenever the broadcast is sent to this receiver
* ConnectivityManager conmng = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = conmng.getActiveNetworkInfo();
*/
Log.d("ConnectionReceiver", "State=" + info.getDetailedState());
if(info.getType() ==ConnectivityManager.TYPE_ETHERNET){ //optional, we are interested in case when it looses WAN
switch(info.getDetailedState()){
case AUTHENTICATING:
break;
case BLOCKED:
break;
case CAPTIVE_PORTAL_CHECK:
break;
case CONNECTED:
break;
case CONNECTING:
break;
case DISCONNECTED:
break;
case DISCONNECTING:
break;
case FAILED:
break;
case IDLE:
break;
case OBTAINING_IPADDR:
break;
case SCANNING:
break;
case SUSPENDED:
break;
case VERIFYING_POOR_LINK:
break;
default:
break;
}
}
}
}
注意,我们对网络的类型不感兴趣,因为我们感兴趣的是电视是否可以访问广域网,这就是为什么我将条件info.getType()==ConnectivityManager.TYPE_ETHERNET
设置为可选的原因。
编辑:在上面的评论中,我提到了在不阻止应用程序的情况下递归检查网络。
public void listenForConnection(final Context c, final Handler h){
h.postAtFrontOfQueue(new Runnable(){
@Override
public void run() {
ConnectivityManager cm = (ConnectivityManager) c.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
if(networkInfo!=null && networkInfo.isConnectedOrConnecting()){
Intent i = new Intent(ConnectivityManager.CONNECTIVITY_ACTION);
i.putExtra(ConnectivityManager.EXTRA_NETWORK_TYPE, networkInfo.getType());
i.putExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
i.putExtra(ConnectivityManager.EXTRA_IS_FAILOVER, networkInfo.isFailover());
i.putExtra("MY_CUSTOM_KEY_HAS_WAN", true);
c.sendBroadcast(i);
}else {
//do something else
}
h.postDelayed(this, 100);
}});
}
https://stackoverflow.com/questions/17937366
复制相似问题