为了账号安全,请及时绑定邮箱和手机立即绑定

wifiManager.getScanResult() 返回空值

wifiManager.getScanResult() 返回空值

慕尼黑的夜晚无繁华 2022-12-21 16:45:34
我正在搜索以扫描可用的 wifi 网络,但方法 getScanResults() 返回空列表。我包含了所有需要的权限:android.permission.ACCESS_COARSE_LOCATIONandroid.permission.CHANGE_WIFI_STATEandroid.permission.ACCESS_FINE_LOCATIONandroid.permission.ACCESS_WIFI_STATE主要活动类是: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);    }}广播接收器是: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");        }    }}
查看完整描述

2 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

问题是您假设startScan()会立即产生结果,但实际上它只按照所说的进行,开始扫描。您在被触发之前正在访问 thenresults变量,这就是为什么它始终为 null(您的日志记录应该确认这一点)。onReceiveWiFiReceiver

您需要做的是在结果准备就绪时使用回调来获取结果,就像此处的代码一样。请注意onReceive方法调用scanSuccess()和结果是如何只在调用时访问的,scanSuccess()而不是在调用后立即访问的startScan()。还要注意他们如何通过检查布尔startScan()返回来检查开始扫描是否真的成功


查看完整回答
反对 回复 2022-12-21
?
蝴蝶刀刀

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;


查看完整回答
反对 回复 2022-12-21
  • 2 回答
  • 0 关注
  • 531 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号