【问题标题】:Detect when connected/disconntected to Wi-Fi检测何时连接/断开 Wi-Fi
【发布时间】:2017-02-21 08:37:39
【问题描述】:

我想知道手机何时失去与 Wi-Fi 的连接。我知道我应该使用广播接收器。所以我注册了广播接收器:

intentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
registerReceiver(wifiScanReceiver, intentFilter);

然后我创建了广播接收器:

public class WifiScanReceiver extends BroadcastReceiver {

    public WifiScanReceiver() {

    }

    public void onReceive(Context c, Intent intent) {
        Log.i("TAG", "trigged");
    }
}

然后我连接到 Wi-Fi,当我打开/关闭路由器时 - 没有任何反应。我做错了什么?

我拥有所有权限:

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

【问题讨论】:

  • 确保您已经修改了 Internet 权限的清单文件。如果还没有。另外this post 可能会有所帮助
  • @eRaisedToX 是的,我做到了..
  • 你能检测到互联网,我的意思是除了 wifi 吗?

标签: java android android-wifi


【解决方案1】:

尝试将 ConnectivityManager 类放入 onReceive 中

ConnectivityManager conMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo netInfo = conMan.getActiveNetworkInfo();

    if (netInfo != null && netInfo.getType() == ConnectivityManager.TYPE_WIFI) 
        // Connection Successful 
    else
        // Connection  Failed 
  } 

【讨论】:

    【解决方案2】:

    由于您已在 Manifest 中授予 Internet 和网络访问的 权限,这部分没问题。

    进一步,

    您可以尝试使用 ConnectivityManager 类来检查您的设备的网络/wifi 连接。

    public boolean checkMobileInternetConn() {
            //Create object for ConnectivityManager class which returns network related info
            ConnectivityManager connectivity = (ConnectivityManager) _context
                    .getSystemService(Context.CONNECTIVITY_SERVICE);
            //If connectivity object is not null
            if (connectivity != null) {
                //Get network info - WIFI internet access
                NetworkInfo info = connectivity.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    
                if (info != null) {
                    //Look for whether device is currently connected to WIFI network
                    if (info.isConnected()) {
                        return true;
                    }
                }
            }
            return false;
        }
    

    (完整代码请参考this post。)

    试试这个n随时恢复:)

    【讨论】:

    • 当我关闭路由器时,它返回 4 次“假”。当设备再次连接回来时,没有一个是真的..
    • WI-FI连接丢失时需要返回false,连接恢复需要返回true
    【解决方案3】:

    什么都没有发生。我做错了什么?

    据我所知,您尚未声明 BroadcastReceiver,单独添加权限不会触发您的广播接收器。

    我的解决方案是基于通过清单声明它,但是说您的问题是我看不到您在代码中声明了广播类,因此您可以选择在清单或代码中声明它。

    所以尝试声明它,它应该可以工作。我已经用这两种声明测试了你的代码,它可以工作:

    <receiver android:name=".WifiScanReceiver">
        <intent-filter>
            <action android:name="android.net.wifi.STATE_CHANGE"/>
        </intent-filter>
    </receiver>
    

    或者在 onCreate 方法中以编程方式声明new WifiScanReceiver()

    final IntentFilter filters = new IntentFilter();
    filters.addAction("android.net.wifi.STATE_CHANGE");
    super.registerReceiver(new WifiScanReceiver(), filters);
    

    您的 WifiScanReceiver 中也需要这个 (reference):

    public void onReceive(Context context, Intent intent) {
    
            ConnectivityManager cm =
                    (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;
    
            if (isWiFi) {
                Log.i("TAG", "trigged");
            }
        }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多