【问题标题】:Constantly check for wireless network change [duplicate]不断检查无线网络变化[重复]
【发布时间】:2013-02-12 18:46:38
【问题描述】:

我想经常检查手机是否连接到特定的无线网络。我当然想到了一个服务和网络的SSID,但是如何呢?

【问题讨论】:

  • “不断检查”?你知道这会杀死多少电池吗? Just check it once 然后register a receiver to check for changes in connectivity
  • 有 WiFi_STATE_CHANGED 广播。您可以使用该广播来检测 wifi 网络的变化。
  • @Niek 好吧,我的意思是每 5 分钟一次。
  • 即使每 5 分钟检查一次也会耗尽大部分电池电量。为什么在进行 HTTP 通信时不检查一下
  • 好的,您会提供什么替代方案来处理网络更改而不会耗尽电池?

标签: android android-wifi


【解决方案1】:

你会想要的

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

在您的接收者标签中。

或者,如果您想对其进行更多控制,请在注册 BroadcastReceiver 之前进行设置:

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

WIFI_STATE_CHANGED

指示 Wi-Fi 已启用、禁用、启用、禁用或未知的广播意图操作。一个额外的提供这种状态作为一个 int。如果可用,另一个额外提供之前的状态。

STATE_CHANGE

指示 Wi-Fi 连接状态已更改的广播意图操作。一个额外的以 NetworkInfo 对象的形式提供了新的状态。如果新状态为 CONNECTED,则额外的附加信息可能会提供接入点的 BSSID 和 WifiInfo。作为字符串

此外,您还需要指定正确的权限:

<user-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<user-permission android:name="android.permission.ACCESS_WIFI_STATE" />

完整源代码: Download

AndroidManifest.xml

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.temp.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <receiver android:name="com.example.temp.MyWiFiStateListener">
        <intent-filter >
            <action android:name="android.net.wifi.STATE_CHANGE"/>
        </intent-filter>
    </receiver>
</application>

MainActivity.java

package com.example.temp;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

}

广播接收器:

package com.example.temp;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.util.Log;

public class MyWiFiStateListener extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        String action = intent.getAction();
        Log.d("TEMP", action);
        if(action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)){
            NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
            if(info.getType() == ConnectivityManager.TYPE_WIFI){
                WifiManager myWifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
                WifiInfo wifiInfo = myWifiManager.getConnectionInfo();
                Log.d("TEMP","BSSID :: " +  wifiInfo.getBSSID() + "SSID :: " + wifiInfo.getSSID());
            }
        }
    }

}

【讨论】:

  • 听起来是个不错的解决方案。我现在就去看看。谢谢
  • 如果您需要整个解决方案,请告诉我。
  • 好的,我有点困惑。因此,如果我创建一个 BroadcastReceiver 并添加意图过滤器,我将如何检查 BSSID?
  • BSSID 是您可以从 NetworkInfo 对象中获取的信息。有一种方法可以同时获取 SSID 和 BSSID。您必须在将接收 state_change 广播的 java 代码中执行此操作。
  • 在 STATE_CHANGE 广播中,您以 networkinfo 对象的形式获得有关网络新状态的额外信息。
猜你喜欢
  • 2015-08-27
  • 1970-01-01
  • 2023-04-04
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 2014-08-07
相关资源
最近更新 更多