推荐一篇不错的文章: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),不知道是否有好的解决方案。