WifiManger.getScanResults()在android上返回空列表

时间:2017-12-24 18:08:25

标签: android

是的,我确实看过所有其他类似的问题,但它们并不适合我。 我想获得一个我附近的无线连接列表。 我就是这样做的:

 public class WifiFunction {

    private final String tag = WifiFunction.class.getSimpleName();
    private WifiManager wifiManager;

    public List<WifiDetail> getListofWifi(Context context) {

        List<WifiDetail> wifiDetails = new ArrayList<>();
        List<ScanResult> results = wifiManager.getScanResults();
        Log.d(tag,"Wifi Details " + wifiManager.getScanResults().size());
        for (ScanResult result : results) {
            wifiDetails.add(new WifiDetail(result.BSSID, result.SSID));
            Log.d(tag, result.BSSID + result.SSID);
        }
        return wifiDetails;
    }

    public void startScan(Context context)
    {
        wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        wifiManager.startScan();
        IntentFilter filter = new IntentFilter();
        filter.addAction(SCAN_RESULTS_AVAILABLE_ACTION);
        context.registerReceiver(new resultReciever(this),filter);
    }

}

接收者类:

    public class resultReciever extends BroadcastReceiver {

    private WifiFunction wifiFunction;

    resultReciever(WifiFunction wifiFunction)
    {
        this.wifiFunction = wifiFunction;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("Receiver","started");
        wifiFunction.getListofWifi(context);
    }
}

来自主要活动我只是打电话:

(new WifiFunction()).startScan(this);

检查权限后。 是的,我确实在清单中声明了接收器。 我要求访问和更改wifi状态并访问粗略位置。

仍然,Log将返回列表的大小打印为0.我做错了什么?怎么解决?

编辑:清单

<?xml version="1.0" encoding="utf-8"?>

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permisiion.ACCESS_COARSE_LOCATION" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <receiver android:name=".resultReciever"/>
</application>

编辑2: 运行时权限:

private boolean checkPermission() {

    List<String> permissionsList = new ArrayList<String>();

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_WIFI_STATE) != PackageManager.PERMISSION_GRANTED) {
        permissionsList.add(Manifest.permission.ACCESS_WIFI_STATE);
    }

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CHANGE_WIFI_STATE) != PackageManager.PERMISSION_GRANTED) {
        permissionsList.add(Manifest.permission.CHANGE_WIFI_STATE);
    }

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        permissionsList.add(Manifest.permission.ACCESS_COARSE_LOCATION);
    }

    if (permissionsList.size() > 0) {
        ActivityCompat.requestPermissions(this, permissionsList.toArray(new String[permissionsList.size()]),
                1);
        return false;
    }
    return true;
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                       int[] grantResults) {
    switch (requestCode) {
        case 1:
            (new WifiFunction()).startScan(this);
            break;
    }
}

6 个答案:

答案 0 :(得分:2)

有效。我只需要授予Access_Fine_Location权限。

答案 1 :(得分:1)

将以下行添加到清单中并不足以解决问题!

**from urls.py:**
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'', include('website.urls')),
]

**from setting.py:**
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'website',
]

如果你的targetSdkVersion是23或更高,那么(因为这是危险的权限之一)你还必须做这样的事情

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

这样做解决了我和OP的问题。我通过反转更改来重新检查断言以重新创建问题。

注意:这里有两个非常显着的元素:
    (1) WifiManager.startScan()需要此权限才能documented。{     (2)我的应用基于正常工作(pre-API 23)应用 NOT Manifest.permission.ACCESS_FINE_LOCATION

答案 2 :(得分:1)

您无权访问Access_Fine_Location,但从Android 6开始授予所有权限不会产生预期的输出。您必须启用位置服务才能获得所需的结果。授予权限只是完成的一半工作。

您还可以触发将用户重定向到此设置的意图:

Intent myIntent = new Intent( Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(myIntent);

位置服务是必要的,因为当您访问扫描结果时,您可以访问BSSID(接入点的地址)等信息。此信息还可用于检测设备的位置。通过要求定位服务,操作系统可确保用户在使用您的应用时了解他们的位置信息。

答案 3 :(得分:0)

你应该在onRequestPermissionResult

上添加它
@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 1: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! Do the
              (new WifiFunction()).startScan(this);
               break;

            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

答案 4 :(得分:0)

成功调用WifiManager.getScanResults()需要任何以下权限之一:

ACCESS_FINE_LOCATION

ACCESS_COARSE_LOCATION

CHANGE_WIFI_STATE

如果正在调用的应用没有这些权限,则调用将失败,并显示SecurityException。

因此,Android 8只需启用CHANGE_WIFI_STATE就能检索所有wifi AP

答案 5 :(得分:0)

在您的AndroidManifest.xml中设置权限

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  1. 现在转到设置>应用>您的应用>权限。确保位置信息已打开。
  2. 现在转到“设置”>“位置”,确保其已打开。

您应该能够在WifiManger.getScanResults()

中获得结果
相关问题