【问题标题】:Getting connection returns false even when the device has connection即使设备有连接,获取连接也会返回 false
【发布时间】:2017-08-19 07:56:51
【问题描述】:

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

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 上尝试它时它不起作用,它总是返回 false,即使设备有连接,我打开互联网浏览器检查它并正常显示网页,但使用该方法警报仍然返回 false。

我在其他设备上对其进行了测试,它适用于所有设备,但摩托罗拉,知道发生了什么吗?那是硬件错误吗?

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

【问题讨论】:

  • connectivityManager 还是networkInfo null?
  • 你在清单中有什么权限?
  • 请检查我的更新

标签: android networking


【解决方案1】:

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

【讨论】:

  • 你怎么知道的?只是猜测或者是已知事实,电池管理系统存在于某些设备中。
  • 我亲眼所见。实际上,如果您使用 USB 电缆连接设备并读取系统生成的日志,有时您会看到电池管理应用程序记录的警告和操作。您会注意到,有时 Log “谈论”关于禁用功能、更改亮度等。
  • 我已经插入了设备,现在我认为你是对的,我在我的应用程序的日志之间看到了一些带有“PowerManagerService”标签的日志,这些日志在我测试过的其他设备中从未见过,但是有什么办法可以避免这项服务或让闹钟正常工作吗?
  • 我不确定...因为大多数应用程序都是由制造商编写的。但现在您可以执行一些更具体的搜索。顺便说一句,我很想知道谁投了反对票,他为什么投反对票。
  • 有关于这个问题的消息吗?我也有同样的问题。当手机处于省电模式时,我不知道是否可以连接。
【解决方案2】:

我进行了很多测试,发现很多次当我请求连接时,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;
        }
    }

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

我知道这不是最佳做法,但它正在发挥作用,即使网络状态为“正在连接”,它也会奇怪地发送和接收数据。

【讨论】:

  • 有什么解决办法吗?
  • 谢谢! @Swapnil 解决方法是等到连接成功建立。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 2015-04-12
  • 2021-05-15
相关资源
最近更新 更多