2012-01-27 15 views
5

Quiero empezar mi solicitud cuando Wi-Fi se enciende por lo que intento conseguir una actuación para el estado wifi función cambiado pero mostrandoconexión wifi cambió la acción en Android

01-27 15:52:10.470: ERROR/AndroidRuntime(11584): java.lang.RuntimeException: Unable to instantiate receiver com.example.WiFiScanReceiver: java.lang.InstantiationException: com.example.WiFiScanReceiver 

este es mi archivo de manifiesto

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
 package="com.example" android:versionCode="1" android:versionName="1.0"> 
 <application android:icon="@drawable/icon" android:label="@string/app_name" 
   android:theme="@android:style/Theme.Light"> 
   <activity android:name=".WiFiDemo" 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.WiFiScanReceiver"> 
     <intent-filter> 
       <action android:name="android.net.wifi.supplicant.CONNECTION_CHANGE" /> 
     </intent-filter> 
   </receiver> 
 </application> 
 <uses-sdk android:minSdkVersion="3" /> 
 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> 
 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> 
<uses-permission android:name="android.permission.UPDATE_DEVICE_STATS"></uses-permission> 
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"> </uses-permission> 
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission> 
<uses-permission android:name="android.permission.INTERNET" /> 
</manifest> 

i fallow this link guía cómo iniciar mi actividad cuando se enciende wifi.

package com.example; 

import java.util.List; 

import android.app.Activity; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.IntentFilter; 
import android.net.wifi.WifiConfiguration; 
import android.net.wifi.WifiInfo; 
import android.net.wifi.WifiManager; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 

public class WiFiDemo extends Activity implements OnClickListener { 
private static final String TAG = "WiFiDemo"; 
WifiManager wifi; 
BroadcastReceiver receiver; 

TextView textStatus; 
Button buttonScan; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.main); 

 // Setup UI 
 textStatus = (TextView) findViewById(R.id.textStatus); 
 buttonScan = (Button) findViewById(R.id.buttonScan); 
 buttonScan.setOnClickListener(this); 

 // Setup WiFi 
 wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 

 // Get WiFi status 
 WifiInfo info = wifi.getConnectionInfo(); 
 textStatus.append("\n\nWiFi Status: " + info.toString()); 

 // List available networks 
 List<WifiConfiguration> configs = wifi.getConfiguredNetworks(); 
 for (WifiConfiguration config : configs) { 
  textStatus.append("\n\n" + config.toString()); 
 } 
  
 // Register Broadcast Receiver 
 if (receiver == null) 
  receiver = new WiFiScanReceiver(this); 

 registerReceiver(receiver, new IntentFilter(
   WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 
 Log.d(TAG, "onCreate()"); 
} 

@Override 
public void onStop() { 
 super.onStart(); 
 unregisterReceiver(receiver); 
} 

public void onClick(View view) { 
 Toast.makeText(this, "On Click Clicked. Toast to that!!!", 
   Toast.LENGTH_LONG).show(); 

 if (view.getId() == R.id.buttonScan) { 
  Log.d(TAG, "onClick() wifi.startScan()"); 
  wifi.startScan(); 
 } 
} 

} 

aquí es mi código BroadcastReceiver

package com.example; 

import java.util.List; 

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

public class WiFiScanReceiver extends BroadcastReceiver { 
 private static final String TAG = "WiFiScanReceiver"; 
 WiFiDemo wifiDemo; 

 public WiFiScanReceiver(WiFiDemo wifiDemo) { 
   super(); 
   this.wifiDemo = wifiDemo; 
 } 

 @Override 
 public void onReceive(Context c, Intent intent) { 
   List<ScanResult> results = wifiDemo.wifi.getScanResults(); 
   ScanResult bestSignal = null; 
final String action = intent.getAction(); 
   if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) { 
  System.out.println("booladsssssssssssssssssssssssssssssss"); 
  
 } 
   for (ScanResult result : results) { 
     if (bestSignal == null 
         || WifiManager.compareSignalLevel(bestSignal.level, result.level) < 0) 
       bestSignal = result; 
   } 

   String message = String.format("%s networks found. %s is the strongest.", 
       results.size(), bestSignal.SSID); 
   Toast.makeText(wifiDemo, message, Toast.LENGTH_LONG).show(); 

   Log.d(TAG, "onReceive() message: " + message); 
 } 

} 
+0

Por favor, publique la fuente de su actividad WiFiDemo. Supongo que no hay un receptor de difusión registrado. Pero no puedo decirlo a menos que publiques la fuente. :) – Jonathan

+0

@Jonathan ahora actualizo mi código ... –

+0

Gracias, publiqué una respuesta que sugiere que mueva su implementación de BroadcastReceiver a una clase anónima. Entonces no tendrá que preocuparse por pasar la referencia a la actividad WiFiDemo. – Jonathan

Respuesta

2

Su clase receptor no tiene un constructor por defecto. Solo un constructor que requiere un WiFiDemo para Android no puede encontrar la forma de crear una instancia de esa clase.

Actualización: Creo que ha estado un poco confundido sobre cómo funcionan los receptores de difusión. Hay dos maneras:

  1. Usted describirlo en XML y que Android va a instancia del objeto cuando ocurra el evento - en este caso es necesario un constructor por defecto, por ejemplo, public MyReceiver() {} en lugar de public MyReceiver(MyObject obj) {}

  2. Registre su receptor de emisión en el código. Este tipo puede tener cualquier constructor.

Así que para resolver su problema. Simplemente elimine la desaceleración del receptor de difusión en su manifiesto.

+0

gracias por su comentario ¿me puede explicar por código? gracias de antemano .. –

+0

@ user1105375 Ok, lea el código completo ahora y el tutorial que siguió. Actualizado la respuesta. – tidbeck

0

Android no podrá instanciar esa clase porque el constructor requiere un WiFiDemo.

¿Por qué no hace que su receptor de difusión sea anónimo?

package com.example; 

    import java.util.List; 

    import android.app.Activity; 
    import android.content.BroadcastReceiver; 
    import android.content.Context; 
    import android.content.IntentFilter; 
    import android.net.wifi.WifiConfiguration; 
    import android.net.wifi.WifiInfo; 
    import android.net.wifi.WifiManager; 
    import android.os.Bundle; 
    import android.util.Log; 
    import android.view.View; 
    import android.view.View.OnClickListener; 
    import android.widget.Button; 
    import android.widget.TextView; 
    import android.widget.Toast; 

    public class WiFiDemo extends Activity implements OnClickListener { 
    private static final String TAG = "WiFiDemo"; 
    WifiManager wifi; 
    BroadcastReceiver receiver = new BroadcastReceiver(){ 
     @Override 
     public void onReceive(Context c, Intent intent) { 
      List<ScanResult> results = wifi.getScanResults(); 
      ScanResult bestSignal = null; 
      final String action = intent.getAction(); 
      if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) { 
       System.out.println("booladsssssssssssssssssssssssssssssss"); 

      } 
      for (ScanResult result : results) { 
       if (bestSignal == null || WifiManager.compareSignalLevel(bestSignal.level, result.level) < 0) 
         bestSignal = result; 
      } 

      String message = String.format("%s networks found. %s is the strongest.", 
      results.size(), bestSignal.SSID); 
      Toast.makeText(wifiDemo, message, Toast.LENGTH_LONG).show(); 

      Log.d(TAG, "onReceive() message: " + message); 
     } 

    }; 

    TextView textStatus; 
    Button buttonScan; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     // Setup UI 
     textStatus = (TextView) findViewById(R.id.textStatus); 
     buttonScan = (Button) findViewById(R.id.buttonScan); 
     buttonScan.setOnClickListener(this); 

     // Setup WiFi 
     wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 

     // Get WiFi status 
     WifiInfo info = wifi.getConnectionInfo(); 
     textStatus.append("\n\nWiFi Status: " + info.toString()); 

     // List available networks 
     List<WifiConfiguration> configs = wifi.getConfiguredNetworks(); 
     for (WifiConfiguration config : configs) { 
     textStatus.append("\n\n" + config.toString()); 
     } 

     // Register Broadcast Receiver   
     registerReceiver(receiver, new IntentFilter(
     WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 
     Log.d(TAG, "onCreate()"); 
    } 

    @Override 
    public void onStop() { 
     super.onStart(); 
     unregisterReceiver(receiver); 
    } 

    public void onClick(View view) { 
     Toast.makeText(this, "On Click Clicked. Toast to that!!!", 
     Toast.LENGTH_LONG).show(); 

     if (view.getId() == R.id.buttonScan) { 
     Log.d(TAG, "onClick() wifi.startScan()"); 
     wifi.startScan(); 
     } 
    } 

    } 
+0

vuelve a enfrentar el mismo error 01-27 18: 03: 26.500: E/AndroidRuntime (19704): java.lang.RuntimeException: no se puede instanciar el receptor com.example.WiFiDemo: java.lang.ClassCastException: com.example.WiFiDemo no se puede enviar a android.content.BroadcastReceiver –

+0

¿Cuál es el número de línea? Ese es un error diferente, por cierto. – Jonathan

+0

Encontró el error, elimine: 'if (receiver == null) receiver = new WiFiScanReceiver (this);' – Jonathan

Cuestiones relacionadas