【问题标题】:List of available Wifi devices可用 Wifi 设备列表
【发布时间】:2020-12-09 20:22:26
【问题描述】:

我想显示可用 Wifi 设备的列表。这是我的代码,我不明白这是什么错误:

wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
if (wifi.isWifiEnabled() == false)
   {
Toast.makeText(getApplicationContext(), "wifi is disabled..making it enabled",Toast.LENGTH_LONG).show();
wifi.setWifiEnabled(true);
   }   
String[] str1 = null;
ArrayAdapter<String>adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,android.R.id.text1,str1);
 lv.setAdapter(adapter);
 WifiInfo info = wifi.getConnectionInfo();
textStatus.append("\n\nWiFi Status: " + info.toString());
 boolean b=wifi.isWifiEnabled();
if(b){
 wifi.setWifiEnabled(false);
Toast.makeText(getApplicationContext(), "Yes", Toast.LENGTH_SHORT).show();
enter code here

这是我的代码,我想通过编程方式专门在 Android 中获取启用 Wifi 的设备属性。我怎样才能得到它?

 public void onReceive(Context c, Intent intent) 
 {
 results = wifi.getScanResults();
 size = results.size();
 int i = 0;
 str1 = new String[size];
 for (ScanResult result : results){
 str1[i] = result.SSID + " " + result.level;
 i++;
 }

【问题讨论】:

    标签: android


    【解决方案1】:

    您可以通过

    获取可用的WIFI扫描结果
    List<ScanResult> mScanResults = mWifiManager.getScanResults();
    

    然后遍历mScanResults 并使用results.SSID 获取SSID。此外,如果您有兴趣获得最佳网络,您可以使用WifiManager.compareSignalLevel(int rssiA, int rssiB) 来比较两个网络。

    ScanResult bestResult = null;
    for(ScanResult results : mScanResults){
       Log.d("result",results.SSID);
       if(bestResult == null || WifiManager.compareSignalLevel(bestResult.level,
                                                             results.level) < 0){
          bestResult = results;
       }
    }
    String message = String.format("%s networks found. %s is the strongest.", 
                                               mScanResults.size(), bestResult.SSID);
    Log.d("best network",message);
    

    您可以从我的repository 下载完整的演示。

    【讨论】:

    • 如何将其放入字符串数组中,然后使用 listview 设置适配器?
    • 在这里,我应该如何在列表中使用 SSID,但我已经编写了这样的代码,for (ScanResult result : results){ str1[i] = result.SSID + " " +result.level;我++; }
    • 列表 mScanResults = mWifiManager.getScanResults(); - 并且应用程序关闭且没有错误:(wifi!=null) 如何解决?
    • 它似乎不适用于 Android 11。扫描结果为空,需要移动到 wifi 屏幕并手动运行扫描。有解决办法吗?
    【解决方案2】:

    试试这个代码。

    import java.util.ArrayList;
    import java.util.HashMap;    
    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.WifiConfiguration;   
    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.AdapterView;    
    import android.widget.Button;    
    import android.widget.ListView;    
    import android.widget.SimpleAdapter;    
    import android.widget.TextView;    
    import android.widget.Toast;
    
    public class WiFiDemo extends Activity implements OnClickListener
     {      
        WifiManager wifi;       
        ListView lv;
        TextView textStatus;
        Button buttonScan;
        int size = 0;
        List<ScanResult> results;
    
        String ITEM_KEY = "key";
        ArrayList<HashMap<String, String>> arraylist = new ArrayList<HashMap<String, String>>();
        SimpleAdapter adapter;
    
        /* Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) 
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            textStatus = (TextView) findViewById(R.id.textStatus);
            buttonScan = (Button) findViewById(R.id.buttonScan);
            buttonScan.setOnClickListener(this);
            lv = (ListView)findViewById(R.id.list);
    
            wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
            if (wifi.isWifiEnabled() == false)
            {
                Toast.makeText(getApplicationContext(), "wifi is disabled..making it enabled", Toast.LENGTH_LONG).show();
                wifi.setWifiEnabled(true);
            }   
            this.adapter = new SimpleAdapter(WiFiDemo.this, arraylist, R.layout.row, new String[] { ITEM_KEY }, new int[] { R.id.list_value });
            lv.setAdapter(this.adapter);
    
            registerReceiver(new BroadcastReceiver()
            {
                @Override
                public void onReceive(Context c, Intent intent) 
                {
                   results = wifi.getScanResults();
                   size = results.size();
                }
            }, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));                    
        }
    
        public void onClick(View view) 
        {
            arraylist.clear();          
            wifi.startScan();
    
            Toast.makeText(this, "Scanning...." + size, Toast.LENGTH_SHORT).show();
            try 
            {
                size = size - 1;
                while (size >= 0) 
                {   
                    HashMap<String, String> item = new HashMap<String, String>();                       
                    item.put(ITEM_KEY, results.get(size).SSID + "  " + results.get(size).capabilities);
    
                    arraylist.add(item);
                    size--;
                    adapter.notifyDataSetChanged();                 
                } 
            }
            catch (Exception e)
            { }         
        }    
    }
    

    【讨论】:

    • 不使用 Toast,我需要使用 Array Adapter 在 Listview 中显示所有 Wifi 设备列表。我该怎么做?我对这个 Android 很陌生,我是初学者,请问有人可以帮我吗?如果我错了,对不起!
    • 在这个例子中,我在 listview 中列出了所有可用的 wifi。请在 main.xml 文件中取一个 textview、button 和 listview 并按照示例给出它的 ID。
    • @chirag : 我们必须做什么才能通过代码连接特定的 wifi?
    【解决方案3】:

    基于 android 开发者网站,搜索 wifi 列表的最佳方法如下:

    WifiManager wifiManager = (WifiManager)
                       context.getSystemService(Context.WIFI_SERVICE);
    
    BroadcastReceiver wifiScanReceiver = new BroadcastReceiver() {
      @Override
      public void onReceive(Context c, Intent intent) {
        boolean success = intent.getBooleanExtra(
                           WifiManager.EXTRA_RESULTS_UPDATED, false);
        if (success) {
          scanSuccess();
        } else {
          // scan failure handling
          scanFailure();
        }
      }
    };
    
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
    context.registerReceiver(wifiScanReceiver, intentFilter);
    
    boolean success = wifiManager.startScan();
    if (!success) {
      // scan failure handling
      scanFailure();
    }
    
    ....
    
    private void scanSuccess() {
      List<ScanResult> results = wifiManager.getScanResults();
      ... use new scan results ...
    }
    
    private void scanFailure() {
      // handle failure: new scan did NOT succeed
      // consider using old scan results: these are the OLD results!
      List<ScanResult> results = wifiManager.getScanResults();
      ... potentially use older scan results ...
    }
    

    Android 8.0 和 Android 8.1:

    成功调用 WifiManager.getScanResults() 需要以下任一权限:

    • ACCESS_FINE_LOCATION

    • ACCESS_COARSE_LOCATION

    • CHANGE_WIFI_STATE

    如果调用应用程序没有任何这些权限,调用将失败并出现 SecurityException。

    或者,在运行 Android 8.0(API 级别 26)及更高版本的设备上,您可以使用 CompanionDeviceManager 代表您的应用执行附近配套设备的扫描,而无需位置权限。

    来源:https://developer.android.com/guide/topics/connectivity/wifi-scan

    【讨论】:

      猜你喜欢
      • 2012-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多