В WifiManager в Android 8 Oreo ответа не получено - PullRequest
0 голосов
/ 21 мая 2018

Согласно официальной документации Android, метод startScan в WifiManager устарел на уровне API P. Однако я пытаюсь использовать этот метод на уровне API 26 (до P) безуспешно.Я разработал приложение, которое требует сканирования сетей WiFi, если пользователь согласен с необходимыми разрешениями, и это поведение имеет первостепенное значение для надлежащего функционирования приложения.Однако я не получаю никакого ответа при вызове метода startScan.¿Может кто-нибудь помочь мне решить эту проблему или найти альтернативное решение?

Это ссылка на документацию.https://developer.android.com/reference/android/net/wifi/WifiManager.html#startScan()

Приветствия

РЕДАКТИРОВАТЬ :

Это код для запуска процесса сканирования:

public boolean startScan() {
   WifiManager wm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
   if (!wm.isWifiEnabled()) {
     try {
       wm.setWifiEnabled(true);
     } catch (SecurityException e) {
       Log.w(LOG_TAG, "Error enabling wifi", e);
       return false;
     }
   }
   boolean started = wm.startScan();
   Log.d(LOG_TAG, "Scan started? " + started);
   return started;
}

Иэто BroadcastReceiver, который получает результат сканирования.Он работает за исключением Android 8 с targetSdkVersion 26 +

public class InOutWifiScanResultsReceiver extends BroadcastReceiver {
   private static final String LOG_TAG = "ScanResults";

   @Override
   public void onReceive(Context context, Intent intent) {
     super.onReceive(context, intent); // Never called in Android 8 and targetSdkVersion 26+
     List<ScanResult> results = getWifiResults(context);
     Log.d(LOG_TAG, "Received results (" +  results.size() + " AP's)");
   }

   private static List<ScanResult> getWifiResults(Context context) {
      WifiManager wm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
      try {
        return wm.getScanResults();
      } catch (SecurityException e) {
        return new ArrayList<>();
      }
   }
}

. В Манифесте мы используем разрешения perintint, а BroadcastReceiver объявил:

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

 <receiver
    android:name=".InOutWifiScanResultsReceiver"
    android:exported="false">
    <intent-filter>
        <action android:name="android.net.wifi.SCAN_RESULTS"/>
    </intent-filter>
 </receiver>

Разрешение на местоположение требуется во время выполнения, поэтому яЯ уверен, что это разрешено.Я также уверен, что местоположение активно (уровень GPS).

BroadcastReceiver работает нормально, потому что компиляция с targetSdkVersion = 25 или менее каждый работает, как ожидалось, и сканирование получено.Я также тестировал с android: exported = "true", но это не влияет на результаты.

Буду благодарен с вашей помощью.

1 Ответ

0 голосов
/ 04 июня 2018

В Android 8 или выше неявные BroadcastReceivers, объявленные через Manifest, больше не отправляются и не принимаются из-за соображений производительности (это оптимизация, представленная в Android 8, которая ограничивает фоновое выполнение ).Есть некоторые исключения, которые перечислены здесь , но действие android.net.wifi.SCAN_RESULTS не является исключением, поэтому в Android 8+ вы не можете зарегистрировать действие android.net.wifi.SCAN_RESULTS для ожидания ScanResults в Manifest (на самом деле вы можете, но вы ничего не получите).

Это происходит, если ваш targetSdkVersion равен 26 (Android 8 Oreo) или выше, но если вы объявите в своем Gradle файле a targetSdkVersion 25 или ниже эта оптимизация не будет работать для вашего приложения, и ваше неявное Intents, зарегистрированное через Manifest, будет работать должным образом.

Чтобы заставить его работать в Android 8 Oreo с targetSdkVersion 26+Вы должны зарегистрировать его через Application Context.

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.net.wifi.SCAN_RESULTS");
context.registerReceiver(new InOutWifiScanResultsReceiver(), intentFilter);

Но знать , этот вид регистрации требует запуска приложения, поэтому, когда ваше приложение остановлено, вы не получитеэто BroadcastReceiver.

PS: Ваш код верен, но вы не учли это ограничение Android 8.

...