wifiManager.getScanResult() 返回空值

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


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


android.permission.ACCESS_COARSE_LOCATION

android.permission.CHANGE_WIFI_STATE

android.permission.ACCESS_FINE_LOCATION

android.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");

        }

    }

}


慕尼黑的夜晚无繁华
浏览 532回答 2
2回答

慕尼黑8549860

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

蝴蝶刀刀

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

相关分类

Java