Android Pie和WiFiManger.getScanResults()返回空列表,或者Android Oreo WiFiManger.startScan()返回false
考虑以下原始示例: 以及manifest.xml文件:Android Pie和WiFiManger.getScanResults()返回空列表,或者Android Oreo WiFiManger.startScan()返回false,android,android-wifi,android-9.0-pie,Android,Android Wifi,Android 9.0 Pie,考虑以下原始示例: 以及manifest.xml文件: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:tools="http://schemas.android.com/tools" package="it.resis.wifiscan" xmlns:android="http://schemas.android.com/apk/res/android"> &
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:tools="http://schemas.android.com/tools"
package="it.resis.wifiscan"
xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION "/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="GoogleAppIndexingWarning">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
返回flase强>
如果我在诺基亚6-Android Oreo 8.1.0 Api 27上运行它
wifiManager.startScan()
返回true,但
wifiManager.startScan()
wifiManager.getScanResults();
返回并清空列表。
我不明白,我快疯了。从Android 6开始,访问Wi-Fi或蓝牙的扫描结果需要您按住
访问粗略位置
或访问精细位置
。我看到您已经在清单中声明了ACCESS\u rough\u LOCATION
,但是您还需要修改活动
,以便在Android 6.0及更高版本的运行时请求该权限。例如:
private static final String RC_LOCATION = 1;
@Override
protected void onResume() {
super.onResume();
String location = android.Manifest.permission.ACCESS_COARSE_LOCATION;
if (ActivityCompat.checkSelfPermission(this, location) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(new String[] { locationPermission }, RC_LOCATION);
} else {
startWifiScan();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] results) {
if (requestCode == RC_LOCATION) {
if (results[0] == PackageManager.PERMISSION_GRANTED) {
startWifiScan();
} else {
// user rejected permission request
}
} else {
super.onRequestPermissionsResult(requestCode, permissions, results);
}
}
private void startWifiScan() {
// do wi-fi scanning
}
是的,我的朋友,我完全忘了这一步。真可惜!另一个问题是:如果compileSdkVersion和targetSdkVersion都是21,我是否需要担心新的startScan()/getScanResults()限制?是的,如果您运行的是Android 6.0,您将始终必须执行此步骤。这是一个安全限制,不是根据你的构建而改变的。哦,天哪!你知道,要管理新的权限,从api 21提升到Android 6 api需要在我项目的不同部分做大量工作。你确认了吗?是的,很有可能。此表中列出的任何权限:将要求您添加逻辑以在运行时请求用户权限。
wifiManager.getScanResults();
private static final String RC_LOCATION = 1;
@Override
protected void onResume() {
super.onResume();
String location = android.Manifest.permission.ACCESS_COARSE_LOCATION;
if (ActivityCompat.checkSelfPermission(this, location) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(new String[] { locationPermission }, RC_LOCATION);
} else {
startWifiScan();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] results) {
if (requestCode == RC_LOCATION) {
if (results[0] == PackageManager.PERMISSION_GRANTED) {
startWifiScan();
} else {
// user rejected permission request
}
} else {
super.onRequestPermissionsResult(requestCode, permissions, results);
}
}
private void startWifiScan() {
// do wi-fi scanning
}