首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >wifiManager.getScanResult()返回空值

wifiManager.getScanResult()返回空值
EN

Stack Overflow用户
提问于 2019-05-30 21:50:10
回答 2查看 363关注 0票数 0

我正在搜索可用wifi网络,但getScanResults()方法返回空列表。

我包含了所需的所有权限:

代码语言:javascript
复制
android.permission.ACCESS_COARSE_LOCATION
android.permission.CHANGE_WIFI_STATE
android.permission.ACCESS_FINE_LOCATION
android.permission.ACCESS_WIFI_STATE

主要的activity类是:

代码语言:javascript
复制
public class Home extends Activity {`

    Context context;
    WifiManager wifiManager = null;
    WiFiReceiver wifiReceiver = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home);

        context = this;
        wifiManager = (WifiManager) 
        context.getSystemService(Context.WIFI_SERVICE);
        wifiReceiver = new WiFiReceiver(wifiManager);

        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
        registerReceiver(wifiReceiver, intentFilter);

        wifiManager.startScan();
        List<ScanResult> results = wifiReceiver.results;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        unregisterReceiver(wifiReceiver);
    }
}

广播接收器是:

代码语言:javascript
复制
public class WiFiReceiver extends BroadcastReceiver {`

    public List<ScanResult> results;
    private WifiManager wifiManager;

    public WiFiReceiver(WifiManager wifiManager) {
        this.wifiManager = wifiManager;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        boolean success = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false);
        if (success) {
            results = wifiManager.getScanResults();
            Log.e("wiFi Manager", "Done");

        } else {
            Log.e("wiFi Manager", "Scan failure");
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-30 23:27:22

问题是,您假设startScan()将立即产生结果,但它实际上只是执行了所说的操作,即开始扫描。在WiFiReceiver中的onReceive被触发之前,您正在访问then results变量,这就是它始终为空的原因(您的日志记录应该会确认这一点)。

您需要做的就是像here代码一样,在结果准备就绪时使用回调函数来获取结果。注意onReceive方法是如何调用scanSuccess()的,并且结果只能在scanSuccess()中访问,而不是在调用startScan()之后立即访问。还要注意它们是如何通过检查布尔startScan()返回来检查启动扫描是否实际成功的

票数 0
EN

Stack Overflow用户

发布于 2021-06-18 02:22:51

从API level 23 (Android 6.0 Marshmallow),我们需要从用户端请求运行时权限。特别是ACCESS_FINE_LOCATION。您需要在wifiManager.startScan()之前检查是否授予权限,如果没有授予权限,则需要调用requestPermissions()。

下面是一个示例:

代码语言:javascript
复制
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
    }}

您还需要在活动中包含此方法

代码语言:javascript
复制
    @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);
        }
    }

别忘了在你的活动中声明这一点

代码语言:javascript
复制
private final int REQUEST_CODE_ASK_PERMISSIONS = 1;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56379635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档