2013-06-18 34 views
6

Tôi đang cố gắng tạo ứng dụng cho phép bạn quét các mạng wifi khả dụng và sau đó hiển thị chúng trong danh sách có thể chọn. Để làm điều đó tôi đã cố gắng với mã này:Android: Quét mạng Wifi + Danh sách có thể chọn

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

     } 
    } 
} 

Nhưng tôi nhận được lỗi này:

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 

Tôi đang làm gì vậy ??

+0

bạn đã thử nó ở đâu, trình mô phỏng hoặc thiết bị? –

+0

Tôi đã thử nó một cách tiện dụng: Samsung Galaxy Nexus, Android phiên bản 4.2. Và trong manifest tôi thêm này ba dòng để có được quyền:

+0

Bản ghi đầy đủ chắc chắn sẽ hữu ích. –

Trả lời

14

Hãy thử này Nó làm việc cho tôi

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); 
      } 


     } 
    } 



} 
+0

Cảm ơn bạn đã trả lời, có vẻ như rất hay, nhưng có một số loại lỗi trong lớp "WifiReceiver": Loại TestPreprationActivity.WifiReceiver phải triển khai phương thức trừu tượng được thừa hưởng BroadcastReceiver.onReceive (Context, Intent) –

+0

yes there là, u có thể nhìn thấy 'public void onReceive (Context c, Intent intent)' phương thức bên trong 'WifiReceiver' .. –

+0

chỉnh sửa: vấn đề được giải quyết. Cảm ơn bạn rất nhiều, mã thực sự hữu ích –

3

Không doInback() tạo nhiều WifiReceivers mà sau đó sẽ kết thúc trong một ngoại lệ khi họ có thể không phải tất cả có được đăng ký ?!

Có thể s.th. như thế này có thể khắc phục điều đó:

if (receiveWifi==null) { 
    receiveWifi = new WifiReceiver(); 
} 
Các vấn đề liên quan