2011-09-07 30 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。