2 回答

TA贡献1818条经验 获得超11个赞
问题是您假设startScan()
会立即产生结果,但实际上它只按照所说的进行,开始扫描。您在被触发之前正在访问 thenresults
变量,这就是为什么它始终为 null(您的日志记录应该确认这一点)。onReceive
WiFiReceiver
您需要做的是在结果准备就绪时使用回调来获取结果,就像此处的代码一样。请注意onReceive
方法调用scanSuccess()
和结果是如何只在调用时访问的,scanSuccess()
而不是在调用后立即访问的startScan()
。还要注意他们如何通过检查布尔startScan()
返回来检查开始扫描是否真的成功

TA贡献1801条经验 获得超8个赞
从 API 级别 23(Android 6.0 Marshmallow)开始,我们需要向用户端请求运行时许可。特别是 ACCESS_FINE_LOCATION。在wifiManager.startScan()之前需要检查权限是否被授予,如果没有授予权限,则需要调用requestPermissions()。
这是一个例子:
public void startScanningWifi(){if ( Build.VERSION.SDK_INT >= 23){
if (ActivityCompat.checkSelfPermission(context, Manifest.
permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(context,
Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED ){
requestPermissions(new String[]{
Manifest.permission.ACCESS_FINE_LOCATION},
REQUEST_CODE_ASK_PERMISSIONS);
Log.i(TAG, "User location NOT ENABLED, waiting for permission");
}else{
//Start scanning for wifi
}}
您还需要在活动中包含此方法
@Override
public void onRequestPermissionsResult(int requestCode,
String[] permissions, int[] grantResults) {
switch (requestCode) {
case REQUEST_CODE_ASK_PERMISSIONS:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//start scanning
wifiManager.startScan();
} else {
// Permission for location Denied
Toast.makeText( this,"Well cant help you then!" ,
Toast.LENGTH_SHORT)
.show();
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
也不要忘记在您的活动中声明这一点
private final int REQUEST_CODE_ASK_PERMISSIONS = 1;
添加回答
举报