如果targetSdkVersion> = 26,则WifiManager.WifiInfo getSSID和getBSSID无效

问题描述 投票:2回答:4

如果我使用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
4个回答
3
投票

您需要从API 27开始的位置许可


1
投票

Google已经使用WifiManager更改了他们的政策,因为您可以从SDK> = 27跟踪用户的位置跟踪wifi位置。因此,您需要访问位置权限才能使用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");
            }
    }
}

0
投票

还有一件事需要记住(我学到了很难的方法)。如果您将应用程序侧载到设备上,请不要忘记在应用程序权限中“允许”位置权限(长按应用程序,应用程序信息)。它默认是关闭的,因此你会得到


-2
投票

以下是代码。

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()来解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.