2011-09-07 18 views
5

Tengo problemas con el receptor BroadCast para verificar el estado de Wi-Fi. ¿Podrias ayudarme por favor?¿No se puede escuchar el estado del administrador de wi-fi de Android?

Este es mi archivo de manifiesto.

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

Y este es el 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(); 
     } 
    } 
} 

estoy seguro de dónde estoy haciendo mi error. Cualquier entrada sería apreciada.
No obtengo ningún error solo porque el archivo de registro no muestra el mensaje requerido.

Respuesta

8

Usted no han tenido añadido los parámetros para el filtro de intención, el manifiesto final debería tener este aspecto

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

Espero que esto ayude.

1

Agregue este permiso también para verificar el estado de la red de su dispositivo.

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

Hola Anup He agregado el permiso al manifiesto. Y ahora la aplicación se apaga inesperadamente. Mientras hacía referencia al registro, decía "Controlador no capturado, salida principal del hilo debido a excepción no detectada" "java.lang.RuntimeException. No se puede instanciar la actividad". ¿Podría informarme dónde podría surgir el problema? Gracias – Vinoth

3

Si no agregó los siguientes permisos, intente de nuevo después de agregarlos.

<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

Acabo de hacer lo que dijiste y mi aplicación fuerza el cierre. Lo he explicado en el comentario anterior, por favor échele un vistazo y avíseme dónde estoy causando un error. – Vinoth

2

En primer lugar, debe asegurarse de solicitar el permiso para obtener acceso al estado de WIFI. Solo haz lo que dijo Anup Rojekar.

En segundo lugar, creo que hagas error en el uso de un BroadcastReceiver. En manifest.xml, declaras la actividad principal.

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

por lo que MainActivy es una actividad. Además, declaras MainActivity como broadcastReceiver. Esto es ilegal Deberías usar una transmisión independiente para hacerlo. De esta manera:

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

Tenga en cuenta que he cambiado el nombre para el BroadcastReceiver y dentro del nodo, se debe añadir un nodo <action> como la de arriba.

En tercer lugar, crear un WifiBroadcastReceiver.java y copiar los códigos de su MainActivity.java originales a la misma. Recuerde cambiar la declaración de clase a public class WifiBroadcastReceiver extends BroadcastReceiver

esperanza que podía ayudar. Por favor dime si funciona No tengo una pc a la mano; por lo tanto, no ' t probar los códigos tampoco.

Además, es necesario un nuevo archivo MainActivity.java. Se podría generar automáticamente en Eclipse. Esta clase debe declararse como: public class MainActivity extends Activity.

+0

Su explicación despejó mis dudas sobre cómo editar el archivo de manifiesto. Gracias Huang. Lo estoy probando ahora, le dejaré saber cómo funciona – Vinoth

0

Para mí los cambios en el AndroidManifiest.xml no funcionaron. Tengo el mismo problema, la aplicación se detuvo de repente.

he utilizado la registerReceiver en la actividad principal y funciona :) Para mí la WifiStateTester es la clase que se extiende desde 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); 

Otra cosa diferente que hice, es que en el método onReceiver compruebo directamente el estado del wifi.

0

una mezcla y combinación de diversas respuestas anteriores, estos fragmentos trabajó para mí para ver si estoy conectado a una red WiFi (esto no me dice si estoy conectado a Internet):

crear una clase 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"); 
     } 
    } 
} 

ahora vaya a su archivo de manifiesto e incluyen

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

y, por último, colocar el receptor justo antes de la </Applica ción tag> (aún en el archivo de manifiesto)

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

al aplicar su código, NO COPIAR < aplicación ... o </aplicación> en el código anterior (i acaba de poner allí para que usted sabrá dónde colocar el receptor).

NOTA: corrija su actividad principal para ampliar la actividad y no BroadcastReceiver.

Cuestiones relacionadas