当前位置:  开发笔记 > Android > 正文

Android 6.0的bug?有权限,但getScanResults()仍然在Android 6.0中返回空列表

如何解决《Android6.0的bug?有权限,但getScanResults()仍然在Android6.0中返回空列表》经验,为你挑选了1个好方法。

我已经在Android版本6.0中请求了许可 - Marshmallow,但是当使用getScanResults()时它仍然返回空列表.

 private boolean checkPermission() {

    List permissionsList = new ArrayList();

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

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

在请求权限之后,然后在onRequestPermissionsResult方法中,我获得了ACCESS_FINE_LOCATION和ACCESS_COARSE_LOCATION的权限,但我仍然无法扫描结果

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                       int[] grantResults) {
    switch (requestCode) {
        case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS:
            if (permissions.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED ||
                    (permissions.length == 2 && grantResults[0] == PackageManager.PERMISSION_GRANTED &&
                            grantResults[1] == PackageManager.PERMISSION_GRANTED)){
                List scanResults = mWifi.getScanResults();
                //list is still empty
            }
             else {
                // Permission Denied
                Toast.makeText(mContext, getString(R.string.permission_deny), Toast.LENGTH_LONG).show();
            }
            break;
    }
}

这是android M的错误吗?



1> leRobot..:

您仍需要在请求权限后启用WIFI.简而言之,您必须按顺序执行此操作以扫描周边:

    请求必要的权限(ACCESS_WIFI_STATE,CHANGE_WIFI_STATE,ACCESS_COARSE_LOCATION).此外,在MM上,您需要在运行时请求此功能,如您所述.

    使用WifiManager 启用WIFI#setWifiEnabled(true);

    不必以编程方式启用位置访问权限.但请阅读下面的说明.

    您必须为SCAN_RESULTS_AVAILABLE_ACTION注册BrodcastReceiver.这是您获得扫描准备就绪的信号.无论您是通过AndroidManifest注册还是在运行时动态注册,只要在下一步之前完成即可.

    您必须使用WifiManager #startScan()才能为网络扫描请求一次更新.如果你想要更多,设置一个定时器/时间任务(推荐)或重新安排当你收到前一个(可能永远不会来)

    只有在BroadcastReceiver onReceive上,您才能使用合理的结果调用WifiManager#getScanResults().

注意:在某些手机上(Moto X 2014),我注意到你需要启用基本位置才能获得任何结果,只有用户(系统用户界面)似乎能够触发开/关.如果用户的位置完全关闭,即使系统UI可以,我似乎也无法获得非空结果列表.这可能是由于Marshmallow需要在用户应用程序中具有蓝牙和WiFi扫描的位置,以及摩托罗拉的不良实施,或者已经在最新的Marshmallow错误跟踪器中修复的缺陷,但摩托罗拉最新的OTA中没有,因为这不会发生在Nexus 5或Galaxy S6.

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有