无法收听Android wi-fi经理的状态?

时间:2011-09-07 06:24:27

标签: android android-manifest android-wifi

我在使用BroadCast接收器检查Wi-Fi状态时遇到了一些麻烦。你能帮忙吗?

这是我的清单文件。

<uses-permission android:name="android.permission.READ_PHONE_STATE"> </uses-permission>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"> </uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"> </uses-permission>
<uses-permission android:name="android.permission.INTERNET"> </uses-permission>
<application 
        android:icon="@drawable/icon" 
        android:label="@string/app_name">
    <activity 
        android:name=".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=".MainActivity">
<intent-filter android:name="android.net.wifi.WIFI_STATE_CHANGED"/>
       </receiver>  
   </application>
</manifest>

这是MainActivity.java

public class MainActivity extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        int state = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, -1);
        String msg = null;
        switch (state) {
        case WifiManager.WIFI_STATE_DISABLED:
            msg = "it is disabled";
            break;
        case WifiManager.WIFI_STATE_ENABLED:
            msg = "it is enabled";
            break;
        case WifiManager.WIFI_STATE_DISABLING:
            msg = "it is switching off";
            break;
        case WifiManager.WIFI_STATE_ENABLING:
            msg = "wifi is getting enabled";
            break;
        default:
            msg = "not working properly";
            break;
        }
        if (msg != null) {
            Log.d("************%%%%%%%%wifi state ", "WIFI" + msg);
            Toast.makeText(context, "Wifi state is" + msg, Toast.LENGTH_LONG)
                    .show();
        }
    }
}

我不确定我在哪里弄错了。任何意见都将不胜感激 我没有收到任何错误,因为日志文件没有显示所需的消息。

6 个答案:

答案 0 :(得分:8)

您尚未添加意图过滤器的参数,最终清单应如下所示

<uses-permission android:name="android.permission.READ_PHONE_STATE"> </uses-permission>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"> </uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"> </uses-permission>
<uses-permission android:name="android.permission.INTERNET"> </uses-permission>
<application 
            android:icon="@drawable/icon" 
            android:label="@string/app_name">
<activity 
            android:name=".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=".MainActivity">
    <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" /> 
            <action android:name="android.net.wifi.WIFI_STATE_CHANGED"/>
    </intent-filter>
    </receiver>
</application>

希望这会有所帮助。

答案 1 :(得分:3)

如果您未添加以下权限,请在添加后重试。

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

答案 2 :(得分:2)

首先,您应确保申请访问权限以查看WIFI状态。正如Anup Rojekar所说的那样。

其次,我相信你在使用BroadcastReceiver时犯了错误。在manifest.xml中,声明MainActivity。

<activity 
        android:name=".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>

所以MainActivy是一个活动。此外,您将MainActivity声明为broadcastReceiver。这是非法的。您应该使用独立广播来执行此操作。像这样:

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

请注意我更改了broadcastReceiver的名称,并且在节点内部,您应该添加如上所述的<action>节点。

第三,创建一个WifiBroadcastReceiver.java并将原始MainActivity.java中的代码复制到它。请记住将类声明更改为public class WifiBroadcastReceiver extends BroadcastReceiver

希望我能提供帮助。请告诉我它是否有效。我手头没有电脑;因此,我不 t测试代码。

此外,您还需要一个新的MainActivity.java文件。它可以在Eclipse中自动生成。该类应声明为:public class MainActivity extends Activity

答案 3 :(得分:1)

还要添加此权限,以便检查设备的网络状态。

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

答案 4 :(得分:0)

对我来说,AndroidManifiest.xml中的更改不起作用。我有同样的问题,应用程序突然停止。

我在main活动中使用了registerReceiver并且它正常工作:)对我来说,WifiStateTester是从BroadcastReceiver扩展的类。

 WifiStateTester wfs= new WifiStateTester();
 IntentFilter iFilter= new IntentFilter();
 iFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
 iFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
 this.registerReceiver(wfs, iFilter);

我做的其他不同的事情是,在onReceiver方法中我直接检查了wifi状态。

答案 5 :(得分:0)

各种先前答案的混合搭配,这些片段对我来说是检查我是否连接到WIFI网络(这不告诉我是否连接到互联网):

创建WifiMonitor.java类

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

public class WifiMonitor extends BroadcastReceiver {
    private String TAG = "TGtracker";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e(TAG,"entered  wifimonitor");
         // Process the Intent here
        WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        if (wifi.isWifiEnabled()==true) {
          Log.d(TAG, "You are connected to WIFI "+wifi.getConnectionInfo());
        } else {
          Log.e(TAG,"You are NOT connected to WIFI");
        }
    }
}

现在转到您的清单文件并包含

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

最后,将接收器放在&lt; / application&gt;标记(仍在清单文件中)

<application...
    <receiver android:name=".WifiMonitor" android:enabled="true">
        <intent-filter>
            <action android:name="android.net.ConnectivityManager.CONNECTIVITY_ACTION" />
            <action android:name="android.net.wifi.STATE_CHANGE" />
            <action android:name="android.net.wifi.supplicant.CONNECTION_CHANGE" />
        </intent-filter>
    </receiver>
</application>

申请代码时,请勿复制&lt;应用......或&lt; / application&gt;上面代码中的标签(我只是把它们放在那里,以便你知道在哪里放置接收器)。

注意:请修复您的MainActivity以扩展Activity而不是BroadcastReceiver。