完美解决Android InetAddress.getByName(ip).isReachable(timeout) 一直返回false 的方案

Posted Mrsongs的心情杂货铺

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了完美解决Android InetAddress.getByName(ip).isReachable(timeout) 一直返回false 的方案相关的知识,希望对你有一定的参考价值。

InetAddress 的示例代码:

通过 InetAddress.getByName(ip).isReachable(timeout) 的方法可以ping ip 或者www.baidu.com的方式来检测网络是否可以用,但是遇到了一直返回false的问题。我这里是权限的问题

    private static final boolean isNetworkReachable(String hostname) 
        try 
            Log.d(TAG, "hostname=" + hostname);
            InetAddress address = InetAddress.getByName(hostname);
            if (address.isReachable(3000)) 
                return true;
             else 
                return false;
            
         catch (Exception e) 
            System.out.println(hostname + "网络不可达!");
            e.printStackTrace();
            return false;
        
    

解决方案1:添加上网络相关的权限测试OK

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

我这里的问题加上网络相关的权限就好了,但是网上很多人说这个InetAddress 方法去ping ip的方式不太可靠,经常会命令去ping可以平通但是用InetAddress去ping 返回false,所以保险起见我们使用的时候可以在false时再去命令去ping 验证一下,这样就万无一失了。

解决方案2:InetAddress 失败的时候Runtime.getRuntime().exec 方法去ping,这样有个双保险

    private static final boolean isPingIPReachable(String hostname) 
        try 
            return 0 == Runtime.getRuntime().exec("ping -c 1 " + hostname).waitFor();
         catch (InterruptedException | IOException e) 
            e.printStackTrace();
            return false;
        
    

以上是关于完美解决Android InetAddress.getByName(ip).isReachable(timeout) 一直返回false 的方案的主要内容,如果未能解决你的问题,请参考以下文章

完美解决android显示gif

(转)完美解决 Android WebView 文本框获取焦点后自动放大有关问题

完美解决android软键盘监听

完美解决android软键盘监听1

完美解决Android使用Zxing扫描二维码改成竖屏后,后面的预览画面出现了拉伸,扭曲的情况

完美解决Android 9.0以上HTTP网络请求被限制问题