Android: Escaneado de redes Wifi + Lista seleccionable

Estoy tratando de creat una aplicación que le permite escanear las redes wifi disponibles, y luego mostrarlos en una lista seleccionable. Para hacer eso intenté con este código:

package android.nacho.WifiScan; import java.util.List; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.wifi.ScanResult; import android.net.wifi.WifiManager; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; import android.widget.AdapterView.OnItemClickListener; public class WifiScan extends Activity { TextView mainText; WifiManager mainWifi; WifiReceiver receiverWifi; List<ScanResult> wifiList; StringBuilder sb = new StringBuilder(); ListView listView = new ListView(this); ArrayAdapter<String> adapter; Context context = this; static String[] NETWORKS; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_wifi_scan); mainText = (TextView) findViewById(R.id.text); mainWifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); receiverWifi = new WifiReceiver(); registerReceiver(receiverWifi, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); mainWifi.startScan(); mainText.setText("\\nStarting Scan...\\n"); } public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, 0, 0, "Refresh"); return super.onCreateOptionsMenu(menu); } public boolean onMenuItemSelected(int featureId, MenuItem item) { mainWifi.startScan(); mainText.setText("Starting Scan"); return super.onMenuItemSelected(featureId, item); } protected void onPause() { unregisterReceiver(receiverWifi); super.onPause(); } protected void onResume() { registerReceiver(receiverWifi, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); super.onResume(); } class WifiReceiver extends BroadcastReceiver { public void onReceive(Context c, Intent intent) { wifiList = mainWifi.getScanResults(); NETWORKS = new String[wifiList.size()]; for(int i = 0; i < wifiList.size(); i++){ NETWORKS[i]=i+"-"+(wifiList.get(i)).toString(); } System.out.println("debería imprimir: "+NETWORKS[2]); adapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_multiple_choice, NETWORKS); // adapter.setDropDownViewResource(android.R.layout.select_dialog_multichoice); listView.setAdapter(adapter); listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); listView.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) { } }); setContentView(listView); } } } 

Pero estoy recibiendo estos errores:

 06-18 12:36:32.670: W/dalvikvm(15499): threadid=1: thread exiting with uncaught exception (group=0x40dfb930) 06-18 12:36:32.670: E/AndroidRuntime(15499): FATAL EXCEPTION: main 06-18 12:36:32.670: E/AndroidRuntime(15499): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{android.nacho.WifiScan/android.nacho.WifiScan.WifiScan}: java.lang.NullPointerException 06-18 12:36:32.670: E/AndroidRuntime(15499): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2106) 06-18 12:36:32.670: E/AndroidRuntime(15499): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 06-18 12:36:32.670: E/AndroidRuntime(15499): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 06-18 12:36:32.670: D/AndroidRuntime(15499): Shutting down VM 06-18 12:36:32.670: E/AndroidRuntime(15499): at android.os.Looper.loop(Looper.java:137) 06-18 12:36:32.670: E/AndroidRuntime(15499): at android.app.ActivityThread.main(ActivityThread.java:5039) 06-18 12:36:32.670: E/AndroidRuntime(15499): at java.lang.reflect.Method.invokeNative(Native Method) 06-18 12:36:32.670: E/AndroidRuntime(15499): at java.lang.reflect.Method.invoke(Method.java:511) 06-18 12:36:32.670: E/AndroidRuntime(15499): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 06-18 12:36:32.670: E/AndroidRuntime(15499): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 06-18 12:36:32.670: E/AndroidRuntime(15499): at dalvik.system.NativeStart.main(Native Method) 06-18 12:36:32.670: E/AndroidRuntime(15499): Caused by: java.lang.NullPointerException 06-18 12:36:32.670: E/AndroidRuntime(15499): at android.content.ContextWrapper.getResources(ContextWrapper.java:89) 06-18 12:36:32.670: E/AndroidRuntime(15499): at android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:78) 06-18 12:36:32.670: E/AndroidRuntime(15499): at android.view.View.<init>(View.java:3224) 06-18 12:36:32.670: E/AndroidRuntime(15499): at android.view.View.<init>(View.java:3279) 06-18 12:36:32.670: E/AndroidRuntime(15499): at android.view.ViewGroup.<init>(ViewGroup.java:431) 06-18 12:36:32.670: E/AndroidRuntime(15499): at android.widget.AdapterView.<init>(AdapterView.java:235) 06-18 12:36:32.670: E/AndroidRuntime(15499): at android.widget.AbsListView.<init>(AbsListView.java:766) 06-18 12:36:32.670: E/AndroidRuntime(15499): at android.widget.ListView.<init>(ListView.java:143) 06-18 12:36:32.670: E/AndroidRuntime(15499): at android.widget.ListView.<init>(ListView.java:139) 06-18 12:36:32.670: E/AndroidRuntime(15499): at android.widget.ListView.<init>(ListView.java:135) 06-18 12:36:32.670: E/AndroidRuntime(15499): at android.nacho.WifiScan.WifiScan.<init>(WifiScan.java:27) 06-18 12:36:32.670: E/AndroidRuntime(15499): at java.lang.Class.newInstanceImpl(Native Method) 06-18 12:36:32.670: E/AndroidRuntime(15499): at java.lang.Class.newInstance(Class.java:1319) 06-18 12:36:32.670: E/AndroidRuntime(15499): at android.app.Instrumentation.newActivity(Instrumentation.java:1054) 06-18 12:36:32.670: E/AndroidRuntime(15499): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097) 06-18 12:36:32.670: E/AndroidRuntime(15499): ... 11 more 

¿¿Qué estoy haciendo mal??

Pruebe este que trabajó para mí

 public class MainActivity extends Activity { WifiManager mainWifi; WifiReceiver receiverWifi; StringBuilder sb = new StringBuilder(); private final Handler handler = new Handler(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mainWifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); receiverWifi = new WifiReceiver(); registerReceiver(receiverWifi, new IntentFilter( WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); if(mainWifi.isWifiEnabled()==false) { mainWifi.setWifiEnabled(true); } doInback(); } public void doInback() { handler.postDelayed(new Runnable() { @Override public void run() { // TODO Auto-generated method stub mainWifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); receiverWifi = new WifiReceiver(); registerReceiver(receiverWifi, new IntentFilter( WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); mainWifi.startScan(); doInback(); } }, 1000); } public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, 0, 0, "Refresh"); return super.onCreateOptionsMenu(menu);} public boolean onMenuItemSelected(int featureId, MenuItem item) { mainWifi.startScan(); return super.onMenuItemSelected(featureId, item);} @Override protected void onPause() { unregisterReceiver(receiverWifi); super.onPause(); } @Override protected void onResume() { registerReceiver(receiverWifi, new IntentFilter( WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); super.onResume(); } class WifiReceiver extends BroadcastReceiver { public void onReceive(Context c, Intent intent) { ArrayList<String> connections=new ArrayList<String>(); ArrayList<Float> Signal_Strenth= new ArrayList<Float>(); sb = new StringBuilder(); List<ScanResult> wifiList; wifiList = mainWifi.getScanResults(); for(int i = 0; i < wifiList.size(); i++) { connections.add(wifiList.get(i).SSID); } } } } 

No hace doInback() crear varios WifiReceivers que luego terminará en una excepción, ya que no todos pueden obtener no registrada ?!

Tal vez a la s.th. Como esto podría arreglar eso:

 if (receiveWifi==null) { receiveWifi = new WifiReceiver(); } 
  • Cómo comprobar el Internet real conectado en android?
  • ¿Cómo compartir programaticamente la pantalla del dispositivo Android con otra vía wifi? (No captura de pantalla)
  • Android: Simular WiFi en el emulador?
  • Portal cautivo con hotspot android configurado mediante programación
  • ¿Hacer de un dispositivo móvil un control remoto para una tableta?
  • ¿Puede una red bluetooth o wifi (spp) perder alguna vez los bytes o haber corrompido?
  • UDP Multicasting desde el móvil a la PC
  • ¿Cómo puedo obtener la dirección RSSI y Mac del teléfono cercano en el mismo modo Ad-Hoc?
  • Android: ¿Conectar dos teléfonos inalámbricamente?
  • Detección de redes WiFi abiertas
  • Compruebe la disponibilidad de la red wifi oculta
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.