即使设备已连接,获取连接也会返回false

时间:2014-01-07 14:19:24

标签: android networking

我有一个应用程序,它有一个返回位置并将其发送到服务器的alarmlistener,但是它会检查互联网连接。这是检查连接的方法:

public boolean hasInternetConnection() {        
        ConnectivityManager connectivityManager = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivityManager != null) {
            NetworkInfo networkInfo = connectivityManager
                    .getActiveNetworkInfo();            
            if (networkInfo != null && networkInfo.isAvailable()            
                    && networkInfo.isConnected()) {                     
                return true;
            } else {
                return false;                   
            }
        } else {
            return false;
        }
    }

清单上的权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="pe.com.hacom.taxitrack.mgr.permission.MAPS_RECEIVE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.BATTERY_STATS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />

它一直运行良好,但是当我在摩托罗拉XT316上尝试它时它不起作用,它总是返回假,即使设备有连接,我检查它打开互联网浏览器,它正常显示网页,但是用这种方法警报仍然是假的。

我在其他设备上测试了它并且它可以正常运行,但摩托罗拉,任何想法发生了什么?这是一个硬件错误吗?

最罕见的是,有时我可以在DDMS中获取调试日志中的设备,但几乎总是显示为“离线”。 我已经安装了设备中的驱动程序,也卸载了它并从网页上安装了motorola的通用驱动程序,它与Motoroal RAZR配合使用,但不与XT316配合使用。

2 个答案:

答案 0 :(得分:3)

可能会发生这种情况,因为设备有某种电池管理系统,它会禁用互联网连接,并在您打开浏览器时启用它,但在触发此警报时它不起作用。

答案 1 :(得分:3)

我正在测试很多,我发现很多次,当我要求连接时,NetworkState是“正在连接”,所以我改变了我要求连接的方法。

public boolean hasInternetConnection() {        
        ConnectivityManager connectivityManager = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivityManager != null) {
            NetworkInfo networkInfo = connectivityManager
                    .getActiveNetworkInfo();            
            if (networkInfo != null && networkInfo.isConnectedOrConnecting())
                {                     
                    return true;
                } else {
                    return false;                   
                }
        } else {
            return false;
        }
    }

我在Google的开发者页面上阅读了文档,发现如果您从互联网上发送或接收数据,建议不要使用isConnectedOrConnecting()方法,但我认为某些设备的BatteryManagment可能会被切断连接或者它没有连接,因为我所在城市的3G网络很糟糕。

我知道这不是最好的做法,但工作正常,即使网络状态为“连接”,也很奇怪地发送和接收数据。