Intereting Posts
Android.database.sqlite.SQLiteException: нет такого столбца: aa:, при компиляции: выберите Name from stud Где Address = aa Подписка на темы с токеном Google Cloud Messenger, Недействительный аргумент Как сделать пользовательский ListView с яркими элементами фона? Android TextView setTextSize неправильно увеличивает размер текста Как вы устанавливаете m2e-android-plugin в Eclipse? Следующие классы не могли быть созданы: – android.support.v7.widget.Toolbar Программно прокрутите вверх до вершины NestedScrollView Проведите по экрану Android в нижней части экрана. Как включить адресную панель в Android WebView? Android SDK Build Tool Несколько версий Формат виджета DatePicker Как получить Android ListPreference, определенный в Xml, значения которого являются целыми числами? Firebase Android: медленное «соединение» с использованием многих слушателей, похоже, противоречит документации URL Android Маркета / Google Play App объявляет зависимость от конфигурации 'compile' к конфигурации 'default', которая не объявлена ​​в дескрипторе для проекта

SCAN_RESULTS_AVAILABLE_ACTION возвращает пустой список в Android 6.0

Вчера мой Nexus 5 получил обновление от Android MNC до версии 6.0 - Marshmallow . С тех пор действие для сканирования сетей, доступных на устройстве, перестает получать список, в этом случае список результатов имеет размер 0, даже с 10 + Wi-Fi-сетями, указанными в настройках системы Wi-Fi.

Код для этого является обычным: зарегистрируйте 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. 

Я искал изменения в теме API об этом, но я не видел никаких изменений в этой функции.

Кто-нибудь заметил это? Что-то новое в API или просто изолированный случай?

Solutions Collecting From Web of "SCAN_RESULTS_AVAILABLE_ACTION возвращает пустой список в Android 6.0"

Начиная с Android 6.0, поведение разрешений изменилось на время выполнения. Чтобы использовать функцию, требующую разрешения, сначала нужно проверить, разрешено ли ранее разрешение. Используя checkSelfPermission(permissionString) возвращается результат, wither ther PERMISSION_GRANTED или PERMISSION_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 .

Я нашел связанную с этим проблему в проблеме AOSP проблемы с отслеживанием 185370 WifiManager # getScanResults () возвращает список пустых массивов, если GPS отключен.

Проблема связана с №1 . Мобильный телефон должен открыть службу определения местоположения, чтобы получить список мобильных телефонов wifi.

И с № 18 член проекта Android утверждает, что команда разработчиков исправила проблему, о которой вы сообщили, и она будет доступна в будущей сборке.

APP находится в targetSdkVersion 23, просто следуйте приведенному выше решению, чтобы проверить разрешение во время выполнения. Принудительное принудительное включение проблемы с службами местоположений будет исправлено в будущей версии Android.

редактировать

Таким образом, проблема связана с новой обработкой разрешений. Вы должны попросить разрешения, прежде чем переходить к Wi-Fi-коду. Вот пример:

 // call this method only if you are on 6.0 and up, otherwise call doGetWifi() private void getWifi() { if (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, 0x12345); } else { doGetWifi(); // the actual wifi scanning } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == 0x12345) { for (int grantResult : grantResults) { if (grantResult != PackageManager.PERMISSION_GRANTED) { return; } } getWifi(); } } 

Эта проверка должна выполняться в Управлении.

Исходный образец кода доступен здесь , измененный в соответствии с проблемой, обсуждаемой в этом разделе.

оригинал

Согласно связанным изменениям API , ваше приложение должно иметь одно из разрешений на размещение. Цитата:

WifiManager.getScanResults (): ваше приложение должно иметь разрешение ACCESS_FINE_LOCATION или ACCESS_COARSE_LOCATION.

Также обратите внимание, что есть новый логический ключ, полученный вашим BroadcastReceiver в действии EXTRA_RESULTS_UPDATED : EXTRA_RESULTS_UPDATED . Это показывает, завершено ли сканирование, и вы можете получить доступ к результатам, вызвав wifiManager.getScanResults() .

В дополнение к данным ответам; Вы также можете использовать checkSelfPermission of ContextCompat чтобы обеспечить обратную совместимость с более низкими версиями Android:

 if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSIONS_REQUEST_CODE_ACCESS_FINE_LOCATION); // Get the result in onRequestPermissionsResult(int, String[], int[]) } else { // Permission was granted, do your stuff here }