2011-09-07 33 views
5

我在使用BroadCast接收器检查Wi-Fi状态时遇到了一些麻烦。能否请你帮忙?无法收听android 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(); 
     } 
    } 
} 

我不确定我在哪里做我的错误。任何输入将不胜感激。
我没有收到任何错误,只是日志文件没有显示所需的消息。

回答

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

添加此权限也用于检查设备的网络状态。

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

嗨,我已经添加了清单的权限。现在应用程序意外关闭。在提到日志时,它表示“未捕获的处理程序,由于未捕获的异常导致主线程退出”,“java.lang.RuntimeException。无法实例化活动”。请让我知道问题在哪里出现。谢谢 – Vinoth

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> 
+0

我刚刚按照你的说法和我的应用程序强制关机。我已经在之前的评论中解释过它,请看看它并让我知道我在哪里导致错误。 – Vinoth

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> 

请注意,我在广播接收器和节点内更改了名字,你应该添加<action>节点像上面。

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

希望我可以提供帮助。请告诉我它是否有效。我手边没有电脑;因此我不' 也不测试代码。

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

+0

你的解释清除了我对如何编辑清单文件的怀疑。谢谢黄。我正在测试它,会让你知道它是如何工作的 – Vinoth

0

对我而言,AndroidManifiest.xml中的更改无效。我有同样的问题,应用程序突然停止。

我在主要活动中使用了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方法中,我直接检查了无线网络状态。

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"/> 

最后,将接收器</APPLICA前右重刑>标签(仍在清单文件)

<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> 

申请代码时,不要复制<应用...或< /应用程序>在上面的代码标签(我只是把它们放在那里,这样你就知道在哪里放置接收器)。

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