jmdns / jmdns

Official home of the jmDNS library
http://www.jmdns.org
Apache License 2.0
567 stars 191 forks source link

Unable to discover devices on Android 13 #286

Open law-ko opened 2 weeks ago

law-ko commented 2 weeks ago

Hello,

We tried to use the package 3.5.12 and found out that discovering devices on Android 10 works fine, but it does not work on Android 13. Including MulticastLock does not help as well. However, if registering a service in the app it can discover it with no issue.

We have also provided these permissions:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />

Code:


class MdnsRepository @Inject constructor(
    private val context: Context
) {
    private var multicastLock: WifiManager.MulticastLock? = null

    fun discoverServices(serviceType: String, onServiceFound: (ServiceInfo) -> Unit) {
        Log.d("MdnsRepository", "Starting service discovery for type: $serviceType")

        // Acquire the multicast lock
        val wifi = context.getSystemService(Context.WIFI_SERVICE) as WifiManager?
        if (wifi != null) {
            val lock = wifi.createMulticastLock("HelloAndroid")
            lock.acquire()
            Log.d("MdnsRepository", "Multicast lock acquired")
        }

        try {
            val jmdns = JmDNS.create()

//             Register a service
            val serviceInfo =
                ServiceInfo.create("_test._tcp.local.", "example", 1234, "path=index.html")
            jmdns.registerService(serviceInfo)

            Log.d("MdnsRepository", "JmDNS instance created successfully")

            jmdns.addServiceListener(serviceType, object : ServiceListener {
                override fun serviceAdded(event: ServiceEvent) {
                    Log.d("MdnsRepository", "Service added: ${event.info.name}")
                }

                override fun serviceRemoved(event: ServiceEvent) {
                    Log.d("MdnsRepository", "Service removed: ${event.info.name}")
                }

                override fun serviceResolved(event: ServiceEvent) {
                    val serviceInfo = event.info
                    Log.d("MdnsRepository", "Service resolved: ${serviceInfo.name} - ${serviceInfo.inetAddresses.joinToString()}")
                    onServiceFound(serviceInfo)
                }
            })
        } catch (e: Exception) {
            Log.e("MdnsRepository", "Error during service discovery", e)
        } finally {
            // Release multicast lock when done
            multicastLock?.release()
        }
    }
}

Tested on S24 and emulator.

melloware commented 1 week ago

I posted this a long time ago: https://stackoverflow.com/questions/23805893/android-jmdns-doesnt-discover-devices/23854825#23854825

On Android you can't use the default constructor for JMDNS.