Wifi Connect-Disconnect Listener

Neh*_*eha 51 android wifi android-wifi

我的班级必须实施哪个监听器,以便在wifi连接/断开连接时自动检查代码?

我能够手动检查wifi连接/断开连接,但每次我需要从Android设置连接/断开WIFI,然后运行我的程序以获得结果.

我目前的代码很简单:

WifiManager wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE);
if (wifi.isWifiEnabled()==true)
{
    tv.setText("You are connected");
}
else
{
    tv.setText("You are NOT connected");
}
Run Code Online (Sandbox Code Playgroud)

war*_*rbi 75

实际上,您正在检查Wi-Fi是否已启用,这并不一定意味着它已连接.这只意味着手机上的Wi-Fi模式已启用并且能够连接到Wi-Fi网络.

这就是我在广播接收器中监听实际Wi-Fi连接的方式:

public class WifiReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {     
        ConnectivityManager conMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
        NetworkInfo netInfo = conMan.getActiveNetworkInfo();
        if (netInfo != null && netInfo.getType() == ConnectivityManager.TYPE_WIFI) 
            Log.d("WifiReceiver", "Have Wifi Connection");
        else
            Log.d("WifiReceiver", "Don't have Wifi Connection");    
    }   
};
Run Code Online (Sandbox Code Playgroud)

要访问活动网络信息,您需要为AndroidManifest.xml添加以下用户权限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Run Code Online (Sandbox Code Playgroud)

以下意图接收器(或者您可以以编程方式添加...)

<!-- Receive Wi-Fi connection state changes -->
<receiver android:name=".WifiReceiver">
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

编辑:在Lollipop中,如果您希望在用户连接到未计量的网络连接时执行操作,则作业调度可能会有所帮助.看看:http://developer.android.com/about/versions/android-5.0.html#Power


编辑2:另一个考虑因素是我的答案没有检查你是否有连接到互联网.您可以连接到需要登录的Wi-Fi网络.这是一个有用的"IsOnline()"检查:https://stackoverflow.com/a/27312494/1140744


Squ*_*onk 18

创建自己的类,扩展BroadcastReceiver ...

public class MyNetworkMonitor extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        // Process the Intent here

    }
}
Run Code Online (Sandbox Code Playgroud)

在AndroidManifest.xml中

<receiver
    android:name=".MyNetworkMonitor" >
        <intent-filter>
            <action android:name="android.net.wifi.STATE_CHANGE" />
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

有关使用Intent的说明,请参阅WIFI_STATE_CHANGED_ACTIONCONNECTIVITY_ACTION.


Tan*_*ien 14

看看这两页javadoc: ConnectivityManager WiFiManager

请注意,每个人都定义了广播操作.如果您需要了解有关注册广播接收器的更多信息,请查看:以 编程方式注册广播接收器

BroadcastReceiver receiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    if (wifi.isWifiEnabled()) {
      tv.setText("You are connected");
    } else {
      tv.setText("You are NOT connected");
    }
  }
};
Run Code Online (Sandbox Code Playgroud)

在你的清单中你可以做这样的事情(如果你不想在代码中注册接收者):

<application android:icon="@drawable/icon" android:label="@string/app_name">
    <receiver android:name=".WiFiReceiver" android:enabled="true">
        <intent-filter>
            <action android:name="android.net.ConnectivityManager.CONNECTIVITY_ACTION" />
        </intent-filter>
    </receiver>
</application>
Run Code Online (Sandbox Code Playgroud)

编辑:

我应该补充一点,如果您只需要在应用程序运行时接收广播,最好在代码中注册此广播接收器而不是在清单中.通过在清单中指定它,即使以前没有运行连接,也会通知您的进程.


Blu*_*ell 5

我同意 @tanner-perrien 的回答,对于 2020 年,Kotlin 代表:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        registerReceiver(wifiBroadcastReceiver, IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION))
    }

    private val wifiBroadcastReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            val wifiManager = getSystemService(Context.WIFI_SERVICE) as WifiManager
            Log.d("TUT", "Wifi is ${wifiManager.isWifiEnabled}")
        }
    }

    override fun onDestroy() {
        unregisterReceiver(wifiBroadcastReceiver)
        super.onDestroy()
    }
}
Run Code Online (Sandbox Code Playgroud)

但可能想与时俱进:https://developer.android.com/reference/android/net/ConnectivityManager.NetworkCallback

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
Run Code Online (Sandbox Code Playgroud)

活动:

lateinit var connec: ConnectivityManager

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    connec = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

    val networkRequestWiFi = NetworkRequest.Builder()
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
        .build()

    connec.registerNetworkCallback(networkRequestWiFi, networkCallbackWiFi)
 }

private var networkCallbackWiFi = object : ConnectivityManager.NetworkCallback() {
    override fun onLost(network: Network?) {
        Log.d("TUT", "WiFi disconnected")
    }

    override fun onAvailable(network: Network?) {
        Log.d("TUT", "WiFi connected")
    }
}

override fun onDestroy() {
    connec.unregisterNetworkCallback(networkCallbackWiFi)
    super.onDestroy()
}
Run Code Online (Sandbox Code Playgroud)