如果我使用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或更高版本时发生了哪些变化?我们还应该做些什么才能获得这些价值观?
谢谢
您需要从API 27开始的位置许可
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");
}
}
}
还有一件事需要记住(我学到了很难的方法)。如果您将应用程序侧载到设备上,请不要忘记在应用程序权限中“允许”位置权限(长按应用程序,应用程序信息)。它默认是关闭的,因此你会得到
以下是代码。
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()来解决问题。