【问题标题】:Why I'm getting 0 ScanResult from WifiManager?为什么我从 WifiManager 得到 0 ScanResult?
【发布时间】:2018-09-28 09:50:14
【问题描述】:

我正在尝试做一件简单的事情但没有成功。我想获取 WiFi 扫描结果。

我阅读并尝试了这些链接,但没有任何好的结果:

How can I get Android Wifi Scan Results into a list?

WifiManager

这是我的代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initWifiSpinner();
    initWifi();
}


@Override
public void onResume() {
    super.onResume();
    getWifiPermissions();
}

@Override
protected void onPostResume() {
    super.onPostResume();
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case LOCAL_RC_WIFI_PERMISIONS:
            handleWifiPermissions();
            break;
    }
}

/***************************************************************************************
 *
 *  WIFI Handler
 *
 ****************************************************************************************/

private void initWifi() {
    wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    wifiScanReceiver = new WifiScanReceiver();
    enableWifi();
    getWifiPermissions();
}

private void enableWifi() {
    if (false == wifiManager.isWifiEnabled()) {
        Toast.makeText(getApplicationContext(), "wifi is disabled..making it enabled",  Toast.LENGTH_LONG).show();
        wifiManager.setWifiEnabled(true);
    }
}

private void initWifiSpinner() {
    Spinner wifiSpinner = (Spinner) findViewById(R.id.spinnerWifi);
    wifiSpinner.setOnItemSelectedListener(new WifiSpinnerActivity());
    wifiSpinnerAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, spinnerListArray);
    wifiSpinner.setAdapter(wifiSpinnerAdapter);
}

private void getWifiPermissions() {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, LOCAL_RC_WIFI_PERMISIONS );
    } else {
        handleWifiPermissions();
    }
}

private void handleWifiPermissions() {
    registerReceiver(wifiScanReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
    boolean startScan = wifiManager.startScan();
    if (startScan) {
        List<ScanResult> results = wifiManager.getScanResults();
        Toast.makeText(getApplicationContext(), "SSID list size: " + results.size(), Toast.LENGTH_SHORT).show();
    }
}

public class WifiScanReceiver extends BroadcastReceiver {
    int local = 0;

    @Override
    public void onReceive(Context context, Intent intent) {
        List<ScanResult> results = wifiManager.getScanResults();
        int size = results.size();
        Toast.makeText(getApplicationContext(), ++local + " Result list size: " + size, Toast.LENGTH_SHORT).show();
        unregisterReceiver(this);
    }
}

我有以下权限:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

我有两个问题:

  1. List&lt;ScanResult&gt; results = wifiManager.getScanResults(); 的 results.size() 始终为 0。

  2. 由于已知原因,handleWifiPermissions 一次又一次地调用。

【问题讨论】:

  • 你的AndroidManifest.xmlINTERNET权限吗?
  • 请检查您是否拥有AndroidManifest.xml 中包含的权限。权限是 - &lt;uses-permission android:name="android.permission.INTERNET" /&gt;&lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&gt;
  • 是的,我有这些权限

标签: java android android-wifi wifimanager


【解决方案1】:

尝试在设置中启用位置。

我在我的 Oreo(API27) 设备上遇到了同样的问题。

【讨论】:

    【解决方案2】:

    试试这个,它对我有用:

    registerReceiver(new BroadcastReceiver() {
                            @Override
                            public void onReceive(Context context, Intent intent) {
                                List<ScanResult> results = wifiManager.getScanResults();
                                Toast.makeText(MainActivity.this, "" +results.size(), Toast.LENGTH_SHORT).show();
                            }
                        }, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
                        wifiManager.startScan();
    

    【讨论】:

    • 你在真正的安卓手机或模拟器上运行它?在模拟器上,results 始终为 0
    • 我在真实设备上运行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多