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

时间:2015-12-15 11:46:49

标签: android android-6.0-marshmallow

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

 private boolean checkPermission() {

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

    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<ScanResult> 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的错误吗?

5 个答案:

答案 0 :(得分:6)

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

  1. 请求必要的权限( ACCESS_WIFI_STATE,CHANGE_WIFI_STATE,ACCESS_COARSE_LOCATION )。此外,在MM上,您需要在运行时请求此操作,如您所述。
  2. 使用WifiManager启用WIFI #setWifiEnabled(true);
  3. 必须以编程方式启用我知道的位置访问权限。 但请阅读以下注释
  4. 您必须为 SCAN_RESULTS_AVAILABLE_ACTION 注册BrodcastReceiver。这是您获取扫描准备好的信号的地方。如果您通过AndroidManifest注册或在运行时动态注册并不重要,只要在下一步之前完成。
  5. 您必须使用WifiManager# startScan()才能为网络扫描请求完全一个更新。如果您想要更多,请设置计时器/时间任务(推荐)或重新安排收到上一个(可能永远不会到来)
  6. 只有在BroadcastReceiver onReceive上,您才能使用合理的结果调用WifiManager#getScanResults()
  7. 注意:在某些手机上(Moto X 2014),我注意到你需要基本位置启用才能获得任何结果,只有用户(系统用户界面)似乎能够触发/关闭。如果用户的位置完全关闭,我似乎无法获得非空结果列表,即使系统UI可以。这可能是由于Marshmallow需要在用户应用程序中具有蓝牙和WiFi扫描的位置,以及摩托罗拉的不良实施,或者已经在最新的Marshmallow错误跟踪器中修复的缺陷,但在摩托罗拉的最新OTA中没有,因为这并不是#39; t发生在Nexus 5或Galaxy S6中。

答案 1 :(得分:4)

在nexus 5上,随着M更新,在我看来我还需要打开GPS位置才能使其正常工作。

答案 2 :(得分:1)

也许它是由android M的运行时权限管理引起的,你可以设置targetSdkVersion 19(少于21或23)再试一次。它对我有用

答案 3 :(得分:0)

在Android Marshmallow 6.0.1中,转到设置&gt;连接并按住位置。单击位置方法,您将看到三个选项:

  • 高精度:使用GPS,Wi-Fi和移动网络。
  • 省电:使用Wi-Fi和移动网络。
  • 仅限设备:使用GPS。

选择 省电 ,以便在不启用GPS的情况下获取Wi-Fi扫描结果。

答案 4 :(得分:0)

在运行时需要权限时会请求该权限。请注意,不是:

Settings -> Location

正在检查:

Settings -> Applications -> (YOUR APP) -> Permissions

这是必须设置更详细的运行时权限的地方。从版本6开始,必须为每个应用程序设置它。