推荐一篇不错的文章:http://blog.csdn.net/a1533588867/article/details/52459996

结论:安卓API6.0以上的权限控制很奇怪,无论是蓝牙还是WiFi,都需要位置的权限。

过程:昨天在使用

List<ScanResult> scanResults = wifiManager.getScanResults();

进行WiFi扫描的时候,发现返回列表长度总为0,后来百度了一下,发现是权限控制问题,在进行WiFi搜索时,要进行以下几个步骤:

(1)申请权限,在AndroidManifest.xml中加入想申请的权限

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

(2)在搜索WiFi的页面进行初始化和授权申请

private void init() {
        wifiManager = (WifiManager) MainActivity.this.getSystemService(Context.WIFI_SERVICE);
    }

    /**
     *  权限申请检查,如果已经获取权限,则进行扫描
     */
    private void openandSearch() {
        if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION)!=PackageManager.PERMISSION_GRANTED){
            // 获取wifi连接需要定位权限,没有获取权限
            ActivityCompat.requestPermissions(this,new String[]{
                    Manifest.permission.ACCESS_FINE_LOCATION,
                    Manifest.permission.ACCESS_COARSE_LOCATION,
                    Manifest.permission.ACCESS_WIFI_STATE,
            },WIFI_SCAN_PERMISSION_CODE);
            Log.e("permission","fail");
            return;
        } else {
            Log.e("permission","OK");
            Toast.makeText(MainActivity.this, "已获取所有权限!", Toast.LENGTH_SHORT).show();
        }
        if (!wifiManager.isWifiEnabled()) {
            wifiManager.setWifiEnabled(true);
        }
        if(wifiManager.isWifiEnabled()){
            wifiManager.startScan();
        //获得搜到的WiFi,进行进一步操作 List
<ScanResult> scanResults = wifiManager.getScanResults(); scanAdapter.replaceWith(scanResults); } }

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case WIFI_SCAN_PERMISSION_CODE:
if (grantResults.length>0&&grantResults[0] == PackageManager.PERMISSION_GRANTED){
// 允许
//相应操作
}else{
// 不允许
Toast.makeText(this, "未获取相应权限",Toast.LENGTH_SHORT).show();
return;
}
break;
}
}
 

现存问题

wifiManager = (WifiManager) MainActivity.this.getSystemService(Context.WIFI_SERVICE);

这句话虽然可以通过编译,但是会报错,提示说可能会出现内存泄漏(memory leak),不知道是否有好的解决方案。