我在我的 android 项目中遇到网络服务发现 (NSD) 的困难,因为我有时无法获得 IP 地址

问题描述 投票:0回答:0

我正在使用 NSD(网络服务发现)NsdManager.DiscoveryListener 来发现网络上的服务。但是,在 onServiceFound 方法中,我有时无法从 NsdServiceInfo 对象中检索 IP 地址。尽管查阅了官方文档并遵循了最佳实践,但是,即使有 MAC 地址,我仍然遇到无法检索 IP 地址的情况。我正在运行 Android 版本 13 的 Pixel 6 设备上对此进行测试。

我参考了以下链接: https://developer.android.com/training/connect-devices-wirelessly/nsd#discover.

代码:

private val discoveryListener = object : NsdManager.DiscoveryListener {

    override fun onDiscoveryStarted(regType: String) {
        Log.d(TAG, "Service discovery started")
    }

    override fun onServiceFound(service: NsdServiceInfo) {
        Log.d(TAG, "Service discovery success$service")
        // However, I am still encountering situations where the IP address cannot be retrieved, even though the MAC address is available.
    }

    override fun onServiceLost(service: NsdServiceInfo) {
        Log.e(TAG, "service lost: $service")
    }

    override fun onDiscoveryStopped(serviceType: String) {
        Log.i(TAG, "Discovery stopped: $serviceType")
    }

    override fun onStartDiscoveryFailed(serviceType: String, errorCode: Int) {
        nsdManager.stopServiceDiscovery(this)
    }

    override fun onStopDiscoveryFailed(serviceType: String, errorCode: Int) {
        nsdManager.stopServiceDiscovery(this)
    }
}

连接代码:

private val resolveListener = object : NsdManager.ResolveListener {

    override fun onResolveFailed(serviceInfo: NsdServiceInfo, errorCode: Int) {
        // Called when the resolve fails. Use the error code to debug.
        Log.e(TAG, "Resolve failed: $errorCode")
    }

    override fun onServiceResolved(serviceInfo: NsdServiceInfo) {
        Log.e(TAG, "Resolve Succeeded. $serviceInfo")

        if (serviceInfo.serviceName == mServiceName) {
            Log.d(TAG, "Same IP.")
            return
        }
        mService = serviceInfo
        val port: Int = serviceInfo.port
        val host: InetAddress = serviceInfo.host
    }
}
android networking android-service wifi nsd
© www.soinside.com 2019 - 2024. All rights reserved.