Как вернуться из метода после завершения другого вызова метода?

#java #android #flutter #broadcastreceiver #wifimanager

#java #Android #флаттер #broadcastreceiver #wifimanager

Вопрос:

Я создаю приложение для Android в Flutter, где я хочу сканировать сети Wi-Fi и возвращать результат сканирования после его завершения.

Текущий метод, который я вызываю через MethodChannel между моим кодом Dart и кодом Java, выглядит следующим образом:

 public List<ScanResult> getScanWifiResult(){

if (WifiManager != null amp;amp; WifiManager.getScanResults() != null amp;amp; WifiManager.getScanResults().size() > 0) {
    return WifiManager.getScanResults();
}
    return null;
}
  

Метод возвращает List<ScanResult>, что я и хочу. Теперь мне нужно, чтобы этот метод возвращался после WifiManager.startScan() завершения.

Я видел людей, использующих a BroadcastReceiver , но я не знаю, как я могу заставить свой метод возвращаться только после завершения этого BroadcastReceiver . Вот мое начало BroadcastReceiver настройки.

 public List<ScanResult> getScanWifiResult(){
    registerReceiver(wifiReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
    wifiManager.startScan();

    //Here I need to return wifiManager.getScanResults(); once the BroadcastReceiver is finished. 
    //return wifiManager.getScanResults();
  }


BroadcastReceiver wifiReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
    results = wifiManager.getScanResults();
    unregisterReceiver(this);
};
}
  

Как я могу вернуться из метода после завершения BroadcastReceiver?

У меня есть доступ к разрешениям, необходимым для использования WifiManager.getScanResults. Я могу запускать как WifiManager.getScanResults, так и WifiManager.startScan без проблем с разрешениями.

Обновление! Я не могу просто ждать, пока не будут возвращены данные из WifiManager.getScanResult, поскольку я буду хранить эти данные о последнем выполненном сканировании. Кроме того, сканирование, которое я запускаю, может возвращать null, что тоже нормально. Я просто хочу получить результат при том же сканировании, которое я запускаю.

Ответ №1:

вы можете попробовать этот способ в любом месте вашего кода для scanresult вы должны запросить разрешение местоположения gps в своем манифесте

 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  

После добавления разрешения в ваш манифест

 List<ScanResult> foundedNetwork;
foundedNetwork = wifiManager.getScanResults();
foundedNetwork.SSID;
foundedNetwork.BSSID; 
foundedNetwork.level;
  

Комментарии:

1. Я могу получить результаты из WifiManager.getScanResults() просто отлично. Проблема в том, что WifiManager.getScanResults() возвращает результаты последнего сканирования. Я хочу завершить новое сканирование перед повторным вызовом WifiManager.getScanResults() .

2. вы можете проверить список, содержит ли он data или null. если у него есть какие-то данные, это означает, что WifiManager.getScanResult завершен

3. Я не могу этого сделать в этом случае. WifiManager.getScanResult содержит данные последнего выполненного сканирования. Таким образом, он может содержать данные, также может быть null. Я не хочу иметь данные из последнего выполненного сканирования, а скорее данные из конкретного сканирования, которое я вызываю.