From 3b7dd6e87c9600d184e9bfe59cf53500d5639a12 Mon Sep 17 00:00:00 2001 From: brad112358 Date: Tue, 24 Nov 2020 14:13:23 -0600 Subject: [PATCH] Take MulticastLock on Android to ensure broadcast packets can be received (#9199) * Take MulticastLock on Android to ensure broadcast packets can be received. This may belong in Qt for Android. See QTBUG-73138 * Use a more descriptive name for the WiFiManager Multicast Lock --- android/AndroidManifest.xml | 3 +++ .../src/org/mavlink/qgroundcontrol/QGCActivity.java | 20 +++++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index 93bb77f..82a692f 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -54,6 +54,9 @@ + + + diff --git a/android/src/org/mavlink/qgroundcontrol/QGCActivity.java b/android/src/org/mavlink/qgroundcontrol/QGCActivity.java index cf47c78..14fb760 100644 --- a/android/src/org/mavlink/qgroundcontrol/QGCActivity.java +++ b/android/src/org/mavlink/qgroundcontrol/QGCActivity.java @@ -52,6 +52,7 @@ import android.hardware.usb.UsbManager; import android.widget.Toast; import android.util.Log; import android.os.PowerManager; +import android.net.wifi.WifiManager; import android.os.Bundle; import android.app.PendingIntent; import android.view.WindowManager; @@ -76,7 +77,8 @@ public class QGCActivity extends QtActivity private static PendingIntent _usbPermissionIntent = null; private TaiSync taiSync = null; private Timer probeAccessoriesTimer = null; - + private static WifiManager.MulticastLock _wifiMulticastLock; + public static Context m_context; private final static ExecutorService m_Executor = Executors.newSingleThreadExecutor(); @@ -222,6 +224,18 @@ public class QGCActivity extends QtActivity // Create intent for usb permission request _usbPermissionIntent = PendingIntent.getBroadcast(_instance, 0, new Intent(ACTION_USB_PERMISSION), 0); + // Workaround for QTBUG-73138 + if (_wifiMulticastLock == null) + { + WifiManager wifi = (WifiManager) _instance.getSystemService(Context.WIFI_SERVICE); + _wifiMulticastLock = wifi.createMulticastLock("QGroundControl"); + _wifiMulticastLock.setReferenceCounted(true); + } + + _wifiMulticastLock.acquire(); + Log.d(TAG, "Multicast lock: " + _wifiMulticastLock.toString()); + + try { taiSync = new TaiSync(); @@ -259,6 +273,10 @@ public class QGCActivity extends QtActivity } unregisterReceiver(mOpenAccessoryReceiver); try { + if (_wifiMulticastLock != null) { + _wifiMulticastLock.release(); + Log.d(TAG, "Multicast lock released."); + } if(_wakeLock != null) { _wakeLock.release(); }