Android判断是否可以使用外网
来源:互联网 发布:普鲁士号实际数据 编辑:程序博客网 时间:2024/06/04 18:33
app在很多时候需要判断是否能够上外网,并将结果反馈给用户。想到这里很多同学估计会想到判断网络通道是不是打开:
public synchronized boolean isNetworkConnected() { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo ni = cm.getActiveNetworkInfo(); return ni != null && ni.isConnectedOrConnecting(); }
上面这段代码只能判断出数据通道是否打开,如果3G/4G流量或者WiFi无法使用,那么这个判断将不再适用。
下面,推荐几种判断网络是否真正可用的方案:
方案一、使用Android自带的api去ping IP地址:
public void pingNet() { try { if (InetAddress.getByName("120.25.236.134").isReachable(3000)) { Log.d("morse", "pingNet onSuccess"); } else { Log.d("morse", "pingNet onFailure"); } } catch (Throwable e) { Log.d("morse", "pingNet onFailure"); } }
方案二、使用Android自带的api去解析域名:
public void analysisNet() { // 这种方式如果ping不通 会阻塞一分钟左右 // 也是要放在另一个线程里面ping try { InetAddress addr = InetAddress.getByName("www.baidu.com"); if (!addr.isLoopbackAddress() && addr instanceof Inet4Address) { Log.d("morse", "analysisNet onSuccess "); } else { Log.d("morse", "analysisNet onFailure 0"); } } catch (Throwable e) { Log.d("morse", "analysisNet onFailure 1 " + e); } }
方案三、使用adt命令去ping IP:
public void ping() { String result = null; try { String ip = "www.baidu.com";// ping 的地址,可以换成任何一种可靠的外网 Process p = Runtime.getRuntime().exec("ping -c 3 -w 100 " + ip);// ping网址3次 // 读取ping的内容,可以不加 InputStream input = p.getInputStream(); BufferedReader in = new BufferedReader(new InputStreamReader(input)); StringBuffer stringBuffer = new StringBuffer(); String content = ""; while ((content = in.readLine()) != null) { stringBuffer.append(content); } Log.d("------ping-----", "result content : " + stringBuffer.toString()); // ping的状态 final int status = p.waitFor(); if (status == 0) { Log.d("morse", "ping onSuccess"); } else { Log.d("morse", "ping onFailure"); } } catch (IOException e) { Log.d("morse", "ping onFailure"); } catch (InterruptedException e) { Log.d("morse", "ping onFailure"); } finally { } }
方案四、使用socket连接:
private boolean isConnect(String ip) { Socket socket = null; try { socket = new Socket(ip, 80); socket.setKeepAlive(true); socket.setSoTimeout(10); Log.d("morse", socket.isConnected() ? "true" : "false"); if (socket.isConnected()) { socket.sendUrgentData(0xFF); Log.d("morse", "连接成功"); if (0 != count) { count = 0; } } } catch (IOException e) { e.printStackTrace(); return false; } return true; }
注意:使用这种方式一定要发送心跳包,不然检测状态不会改变。
阅读全文
0 0
- Android判断是否可以使用外网
- Android 判断网络是否可以访问Internet
- android判断网络是否可以上网
- 判断WIFI与3G是否可以使用
- 如何判断是否可以使用某个Intent
- Android是否可以使用enum
- 判断是否可以联网
- 可以使用ActualHeight来判断textblock是否已经trimming
- google Map 在手机上是否可以使用的判断
- iOS 判断相机权限是否被限制,判断相机是否可以使用
- iOS 判断相机权限是否被限制,判断相机是否可以使用
- iOS 判断相机权限是否被限制,判断相机是否可以使用
- Android判断是否有网
- Android应用判断是否使用VPN以及是否使用代理
- Android - 使用SharedPreference判断字符串是否修改
- Android 判断设备 是否使用代理上网
- 判断rpm是否可以安装
- DebugUtil 判断是否可以debug
- scsi 底层实现的template(sas/sata host)
- VM12.1安装MAC_OS_10.11
- 【亲测】linux命令
- 显示当前的系统时间
- Ubuntu 16.04安装Sublime 3
- Android判断是否可以使用外网
- 搭建elasticSearch源码调试环境
- 【hadoop Sqoop】Sqoop从mysql导数据到hive
- Indirect display driver开发
- tomcat实现访问资源的原理
- MapReduce实现两表的Join--原理及python和java代码实现
- 关于主键约束enable和disable的问题
- 从王者荣耀聊聊游戏的帧同步
- angular 之 控制器 controller详解