【问题标题】:How to get a list of available WiFI networks in Android 6+?如何在 Android 6+ 中获取可用 WiFi 网络列表?
【发布时间】:2018-01-09 10:27:33
【问题描述】:

我想获取可用 WIFi 的列表,我关注了这个问题: how to get available wifi networks and display them in a list in android

但是有一个问题是大多数时候它不返回WiFi列表! (当我在 android 6 以下的设备上运行我的应用程序时,它运行良好。)

这是我的代码:

  WifiManager mainWifi;
  WifiReceiver receiverWifi;
  List<ScanResult> wifiList;
  StringBuilder sb = new StringBuilder();

  private final Handler handler = new Handler();

  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    new PermissionHandler().checkPermission(this, permissions, new PermissionHandler.OnPermissionResponse() {
      @Override
      public void onPermissionGranted() {

        mainWifi = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
        if (mainWifi.isWifiEnabled() == false)
        {
          // If wifi disabled then enable it
          Toast.makeText(getApplicationContext(), "wifi is disabled..making it enabled",
            Toast.LENGTH_LONG).show();

          mainWifi.setWifiEnabled(true);
        }
        receiverWifi = new WifiReceiver();
        registerReceiver(receiverWifi, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
        mainWifi.startScan();
      }

      @Override
      public void onPermissionDenied(Activity activity, String[] deniedPermissions, PermissionHandler.OnPermissionResponse listener) {

      }
    });
  }

  class WifiReceiver extends BroadcastReceiver {

    // This method call when number of wifi connections changed
    public void onReceive(Context c, Intent intent) {

      sb = new StringBuilder();
      wifiList = mainWifi.getScanResults();
      sb.append("\n        Number Of Wifi connections :"+wifiList.size()+"\n\n");

      for(int i = 0; i < wifiList.size(); i++){

        sb.append(new Integer(i+1).toString() + ". ");
        sb.append((wifiList.get(i)).toString());
        sb.append("\n\n");

        Log.i("LOGO_WIFI", sb.toString());
      }

    }
  }

我在manifest 和运行时获得了这些权限:

Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
Manifest.permission.ACCESS_WIFI_STATE
Manifest.permission.CHANGE_WIFI_STATE
Manifest.permission.ACCESS_NETWORK_STATE
Manifest.permission.CHANGE_NETWORK_STATE

【问题讨论】:

    标签: android android-wifi wifimanager


    【解决方案1】:

    mainWifi.getScanResults() 会为您返回一个 ScanResults 列表,您在解析后可以获取所需的所有信息。

    【讨论】:

    • 那是什么意思?
    • 在android 6.0之后它返回0个元素。
    • 在 android 6.0 之后它返回 0 个元素。要使其工作,您必须启用并打开 GPS :(
    【解决方案2】:

    我只是发现我的代码有问题。

    问题出在 GPS 上!我从用户那里获得了位置权限,但 GPS 已关闭,因此我直到现在还没有得到任何列表!

    现在,当 GPS 开启时,我可以获得可用的 Wifi 列表,而当 GPS 关闭时,我将一无所获!

    有什么方法可以在不开启 GPS 的情况下获取此列表?

    【讨论】:

      【解决方案3】:

      mainWifi.getScanResults() 如果您没有运行时权限(在 Android 6.0+ 设备中),将返回 0 个结果。添加运行时权限,你会很高兴。

      Android 6.0 后处理运行时权限

      随着 Android 6.0 的发布,在 App 中授予权限的方式发生了变化。如果您计划在 Android 6.0+ 设备上运行您的应用程序,那么您需要拥有运行时权限以及 Manifest 中声明的权限。

      如何在代码中添加运行时权限?

      假设你想访问 android.permission.ACCESS_COARSE_LOCATION 那么,

      1. 将其添加到清单文件中
      <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
      
      1. 在代码中添加这个
      @Override
      public void onResume()
      {
          super.onResume();
      
          if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
          {
              if(checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
              {
                  requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 87);
              }
          }
      }
      

      更多积分:

      1) 您不需要同时拥有ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATIONACCESS_COARSE_LOCATION就够了

      2) 如果 GPS 关闭,您仍然会得到 0 个结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-05
        • 1970-01-01
        • 2013-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多