android - SCAN_RESULTS_AVAILABLE_ACTION 在 Android 6.0 中返回空列表

标签 android android-wifi android-6.0-marshmallow

昨天,我的 Nexus 5 收到了从 Android MNC 到版本 6.0 - Marshmallow 的更新。 从那时起,扫描设备中可用网络的操作将停止接收列表,在这种情况下,结果列表的大小为 0,即使 Wifi 系统设置中列出了 10 个以上的 Wifi 网络。

其代码很常见:注册SCAN_RESULTS_AVAILABLE_ACTION并等待接收器中的事件,如下所示:

// Register the Receiver in some part os fragment...
getActivity().registerReceiver(wifiListener, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
WifiManager wifiManager = (WifiManager) getActivity().getSystemService(Context.WIFI_SERVICE);
wifiManager.startScan();

// Inside the receiver:
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
List<ScanResult> results = wifiManager.getScanResults();
// the result.size() is 0 after update to Android v6.0, same code working in older devices.

我在 changes of the API 中搜索关于此主题,但我没有看到此功能有任何重大更改。

有人注意到这一点吗? API 中有什么新内容还是只是一个孤立的案例?

最佳答案

从 Android 6.0 开始,权限行为已更改为运行时。要使用需要权限的功能,应首先检查之前是否已授予该权限。使用 checkSelfPermission(permissionString) method返回结果,权限为 PERMISSION_GRANTEDPERMISSION_DENIED

如果未授予许可或这是第一次,则应提出许可请求。为用户提供授予或拒绝的选项。

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){
   requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
                 PERMISSIONS_REQUEST_CODE_ACCESS_COARSE_LOCATION);
    //After this point you wait for callback in onRequestPermissionsResult(int, String[], int[]) overriden method

}else{
    getScanningResults();
   //do something, permission was previously granted; or legacy device
}

如果您的代码在 M 之前的设备上运行,您将继续使用您的代码,并使用旧方法授予权限。

请求许可后,将向用户显示对话框。他/她的回复将如下所示:

@Override
 public void onRequestPermissionsResult(int requestCode, String[] permissions,
         int[] grantResults) {
     if (requestCode == PERMISSIONS_REQUEST_CODE_ACCESS_COARSE_LOCATION
             && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
         // Do something with granted permission
        mWifiListener.getScanningResults();
     }
 }

之后,您可以使用 LocationServices.SettingsApi 检查定位服务是否已开启,并请求用户在禁用此选项时启用。这可以通过 Play Services LocationSettingsStatusCodes.RESOLUTION_REQUIRED 回调实现。

关于android - SCAN_RESULTS_AVAILABLE_ACTION 在 Android 6.0 中返回空列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46612611/

相关文章:

java - 在 android 中禁用强制门户检测

java - WiFi 断开时播放音乐

android - 使用 Android 从摄像机捕获 WiFi 信号

android - 使用后退按钮关闭 Marshmallow 上的权限请求对话框

java - 如何在android中使用java制作ImageView?

android - 在 Android 应用程序中通过 VideoView 将正在播放的视频静音

Android 6 (Marshmallow) Wifi + Bluetooth 有时会导致 SocketTimeoutException

java - 仅在 Android 6.0 中没有此类文件或目录

java - 字符串在 Android 上的 Java 中似乎不相等,即使它们打印相同

android - 如何使用 GSON 将 JSON 字符串转换为对象集合?