【问题标题】:WifiManager.WifiInfo getSSID & getBSSID not working if targetSdkVersion >= 26如果 targetSdkVersion >= 26,WifiManager.WifiInfo getSSID & getBSSID 不起作用
【发布时间】:2018-03-11 20:31:07
【问题描述】:

如果我使用 API 27 编译但目标 API 25,我将正确获取这些值。如果我将 targetSdkVersion 设置为 27,那么这些值将无法正确检索。

以 SDK 25 或更低为目标,值正确,但以 26 或更高为目标,我得到了这些值:

SSID 给<unknown ssid>

BBSSID 给02:00:00:00:00:00

这些是我的清单权限,都是普通权限,不需要用户授权:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

这是示例代码:

WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
WifiInfo connectionInfo = wifiManager.getConnectionInfo();
connectionInfo.getSSID();
connectionInfo.getBSSID();

针对 SDK 26 或更高版本时发生了什么变化?我们还应该做些什么来获得这些值?

【问题讨论】:

标签: android wifi android-wifi wifimanager android-8.0-oreo


【解决方案1】:

您需要从 API 27 开始的位置权限

【讨论】:

  • 哪个位置权限?有两三个
  • ACCESS_COARSE_LOCATION 或 ACCESS_FINE_LOCATION,如果您愿意,可以选择其中一个或两个
【解决方案2】:

Google 已更改其对 WifiManager 的政策,因为您可以从 SDK 跟踪用户的位置跟踪 wifi 位置>=27。因此,您需要访问位置权限才能将 getSSID() 用于您的应用程序。 为了使用此代码,请按照以下说明操作。

正如@Samuel Eminet 上面的回答,您需要 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION。我使用 ACCESS_FINE_LOCATION 因为 ACCESS_COARSE_LOCATION 请求仅 NETWORK_PROVIDE 的权限,而 ACCESS_FINE_LOCATION 请求 NETWORK_PROVIDE 和 GPS_PROVIDER 的权限。

Refer here for more information

在您的清单文件中

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

以及您的 wifi 管理器所在的位置,添加此代码以请求权限。

 if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
            != PackageManager.PERMISSION_GRANTED){

        //Permission Not Granted
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_FINE_LOCATION);
    }



    @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {                                   
        switch (requestCode) {

        case PERMISSION_FINE_LOCATION:
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                //permission granted keep going status
                Log.d(TAG, "PERMISSION GRANTED");
            }
            else {
                Log.d(TAG, "PERMISSION DENIED");
            }
    }
}

【讨论】:

    【解决方案3】:

    还有一件事要记住(我学得很辛苦)。如果您将应用程序侧加载到设备上,请不要忘记在应用程序权限(长按应用程序、应用程序信息)中“允许”位置权限。默认情况下它是关闭的,因此您将获得

    【讨论】:

      【解决方案4】:

      我遇到了同样的问题。这个问题发生在比 API 23 更高的 android 版本上。 解决方案: 您需要在 build.gradle 文件中添加以下内容。

      implementation 'com.google.android.gms:play-services-location:15.0.0'
      

      并且您允许遵守规则。

      <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION">
      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION">
      

      以下代码自动提供应用程序中的位置权限。

              if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
              try {
                  LocationRequest request = new LocationRequest()
                          .setFastestInterval(1500)
                          .setInterval(3000)
                          .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
      
                  builder = new LocationSettingsRequest.Builder()
                          .addLocationRequest(request);
      
                  try {
                      Task<LocationSettingsResponse> result =
                              LocationServices.getSettingsClient(this.getApplicationContext()).checkLocationSettings(builder.build());
                      result.addOnCompleteListener(new OnCompleteListener<LocationSettingsResponse>() {
                          @Override
                          public void onComplete(@NonNull Task<LocationSettingsResponse> task) {
                              try {
                                  task.getResult(ApiException.class);
                              } catch (ApiException e) {
                                  switch (e.getStatusCode()) {
                                      case LocationSettingsStatusCodes
                                              .RESOLUTION_REQUIRED:
                                          ResolvableApiException resolveApiException = (ResolvableApiException) e;
                                          try {
                                              resolveApiException.startResolutionForResult(WifiConnectionActivity.this, REQUEST_CHECK_CODE);
                                          } catch (IntentSender.SendIntentException ex) {
                                              ex.printStackTrace();
                                          } catch (ClassCastException ex) {
      
                                          }
                                          break;
      
                                      case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                                          break;
                                  }
                              }
                          }
                      });
                  } catch (Exception x) {
                  }
                  checkPermissions();
              } catch (Exception a) {
              }
          }
      
      
      void checkPermissions() {
          if(ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) !=
                  PackageManager.PERMISSION_GRANTED){
              ActivityCompat.requestPermissions(WifiConnectionActivity.this, new String[]
                      {
                              Manifest.permission.ACCESS_COARSE_LOCATION
                      }, REQUEST_LOCATION);
          }
          else{
              //Toast.makeText(getActivity(), "GPS is already permissioned", Toast.LENGTH_SHORT).show();
          }
      }
      

      【讨论】:

        【解决方案5】:

        下面是代码。

        public String getMac() {
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                //Permission Not Granted
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
            }else{
                WifiManager wifimanage = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
                WifiInfo wifiinfo = wifimanage.getConnectionInfo();
                macAddress = wifiinfo.getBSSID();//Get the mac address of the currently connected network;
            }
            return macAddress;
        }
        
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            switch (requestCode) {
                case 1:
                    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        //permission granted keep going status
                        Log.d("mac", "PERMISSION GRANTED");
                        WifiManager wifimanage = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
                        WifiInfo wifiinfo = wifimanage.getConnectionInfo();
                        macAddress = wifiinfo.getBSSID();//Get the mac address of the currently connected network;
                    } else {
                        Log.d("mac", "PERMISSION DENIED");
                    }
            }
        }
        

        然后调用 getMac() 解决问题。

        【讨论】:

        • 欢迎来到 SO。请问您能改进代码示例的格式吗?用英语提供一些信息也很好。谢谢。
        猜你喜欢
        • 1970-01-01
        • 2018-05-24
        • 1970-01-01
        • 1970-01-01
        • 2016-01-29
        • 1970-01-01
        • 2021-01-20
        • 2019-01-12
        • 1970-01-01
        相关资源
        最近更新 更多