Added in [API level 16](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels) Summary: [Nested Classes](https://developer.android.com/reference/android/net/nsd/NsdManager#nestedclasses) \| [Constants](https://developer.android.com/reference/android/net/nsd/NsdManager#constants) \| [Methods](https://developer.android.com/reference/android/net/nsd/NsdManager#pubmethods) \| [Inherited Methods](https://developer.android.com/reference/android/net/nsd/NsdManager#inhmethods)

# NsdManager

*** ** * ** ***


`
public

final

class
NsdManager
`


`

extends https://developer.android.com/reference/java/lang/Object


`

`


`

|---|---|
| [java.lang.Object](https://developer.android.com/reference/java/lang/Object) ||
| ↳ | android.net.nsd.NsdManager |

<br />

*** ** * ** ***

Provides APIs for discovering and advertising network services on the local network.

Network Service Discovery (NSD) allows applications to find other devices on a local
network that support the services the application is interested in. For example, a game
can find other players on the same local network, or a document viewer can find printers.

The implementation is based on DNS Service Discovery (DNS-SD) as described in
[RFC 6763](http://www.ietf.org/rfc/rfc6763.txt), and operates over Multicast DNS
(mDNS).

### SDK Extensions

The `NsdManager` API is updated via
[SDK extensions](https://developer.android.com/guide/sdk-extensions). This allows newer features and APIs to be
available on devices running older versions of Android.
Applications should generally use SDK extension version checks instead of SDK version
(`https://developer.android.com/reference/android/os/Build.VERSION`) checks when interacting with `NsdManager`.

### Usage Patterns

The API is asynchronous. Requests are made to the system, and results are returned through
listener or callback interfaces.

#### Discovering and Tracking Services

The easiest way to find and maintain an up-to-date list of services is to use
`https://developer.android.com/reference/android/net/nsd/NsdManager#registerServiceInfoCallback(android.net.nsd.DiscoveryRequest,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.ServiceInfoCallback)`.
This API, available starting from "T extensions 22" (which covers all Android 14+ devices),
combines discovery and resolution into a single operation. It automatically notifies the app
when a service is found, when its properties (like IP addresses or TXT records) change,
and when it becomes unavailable.

On older devices, or if an app needs fine-grained control over which services to resolve,
use overloads of `https://developer.android.com/reference/android/net/nsd/NsdManager#discoverServices(android.net.nsd.DiscoveryRequest,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.DiscoveryListener)` with a `https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener`, then call
`https://developer.android.com/reference/android/net/nsd/NsdManager#registerServiceInfoCallback(android.net.nsd.NsdServiceInfo,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.ServiceInfoCallback)` or
`https://developer.android.com/reference/android/net/nsd/NsdManager#resolveService(android.net.nsd.NsdServiceInfo,%20android.net.nsd.NsdManager.ResolveListener)` for the specific services of interest.

#### Advertising Services

To make a service on the current device discoverable by others, use
`https://developer.android.com/reference/android/net/nsd/NsdManager#registerService(android.net.nsd.AdvertisingRequest,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.RegistrationListener)`. The app provides an `https://developer.android.com/reference/android/net/nsd/NsdServiceInfo` containing the service
name, type, and port.

### Wi-Fi Multicast Lock

Performing mDNS operations on Wi-Fi requires the device to receive multicast packets.

- **Before T extensions 7** (Android 12 and below devices, and Android 13 devices that have not received the T extensions 7 update): Apps must manually acquire a `https://developer.android.com/reference/android/net/wifi/WifiManager.MulticastLock` to receive mDNS packets, even when the app is in the foreground.
- **Starting from T extensions 7**: The system automatically manages multicast reception for apps in the foreground. Background apps should still avoid taking the lock unless absolutely necessary to minimize battery impact.

### Local network permission (Android 17+)

Starting with API 37, access to the local network is restricted.

Applications targeting API 37 or higher generally require the
`https://developer.android.com/reference/android/Manifest.permission#ACCESS_LOCAL_NETWORK` permission to communicate with
local devices. However, `NsdManager` provides a way to gain access to specific
services without this broad permission:

1. An app calls `https://developer.android.com/reference/android/net/nsd/NsdManager#discoverServices(android.net.nsd.DiscoveryRequest,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.DiscoveryListener)` or `https://developer.android.com/reference/android/net/nsd/NsdManager#registerServiceInfoCallback(android.net.nsd.DiscoveryRequest,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.ServiceInfoCallback)` with the `https://developer.android.com/reference/android/net/nsd/DiscoveryRequest#FLAG_SHOW_PICKER` flag. This triggers a system-provided UI allowing the user to choose a specific service.
2. Once the user selects a service, the app is granted permission to communicate with that specific device through `https://developer.android.com/reference/android/net/nsd/NsdServiceInfo#getHostAddresses()` on `https://developer.android.com/reference/android/net/nsd/NsdServiceInfo#getNetwork()`. The app can also receive updates for that service without requiring the `ACCESS_LOCAL_NETWORK` permission by calling `https://developer.android.com/reference/android/net/nsd/NsdManager#registerServiceInfoCallback(android.net.nsd.NsdServiceInfo,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.ServiceInfoCallback)`. This grant persists across reboots.
3. If the `https://developer.android.com/reference/android/net/Network` reconnects or the service changes addresses, apps must use `https://developer.android.com/reference/android/net/nsd/NsdManager#registerServiceInfoCallback(android.net.nsd.NsdServiceInfo,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.ServiceInfoCallback)` to obtain up-to-date IP addresses with the grant applied. Apps should avoid storing service IP addresses as they can change over time.
4. Apps can use `https://developer.android.com/reference/android/net/nsd/NsdManager#checkPermissionForService(java.lang.String,%20java.lang.String,%20java.util.concurrent.Executor,%20java.util.function.IntConsumer)` to verify if they still have access to a previously selected service.
5. To rediscover previously approved services without showing the UI again, apps can use `https://developer.android.com/reference/android/net/nsd/DiscoveryRequest#FLAG_USER_APPROVED_ONLY`.

### Example finding and resolving a single service

    // Discover a service for a given service type, with an optional name filter. Consider
     // calling in a withTimeout block.
     suspend fun findService(serviceType: String, nameFilter: PatternMatcher?): NsdServiceInfo? {
         if (SdkExtensions.getExtensionVersion(Build.VERSION_CODES.TIRAMISU) < 22) {
             return findServiceLegacy(serviceType, nameFilter)
         }
         // Note the Wi-Fi multicast lock is not necessary for foreground discovery in recent SDKs
         // Using kotlinx-coroutines-core
         return suspendCancellableCoroutine { cont ->
             val request = DiscoveryRequest.Builder(serviceType)
                 .setServiceNameFilter(nameFilter)
                 .setFlags(DiscoveryRequest.FLAG_SHOW_PICKER)
                 .build()

             val listener = object : NsdManager.ServiceInfoCallback {
                 override fun onServiceUpdated(serviceInfo: NsdServiceInfo) {
                     if (cont.isActive) cont.resume(serviceInfo)
                     // With FLAG_SHOW_PICKER only the selected service is returned, the
                     // listener is then unregistered automatically
                 }

                 override fun onServiceInfoCallbackRegistrationFailed(errorCode: Int) {
                     cont.resumeWithException(DiscoveryException(errorCode))
                 }

                 override fun onServiceInfoCallbackUnregistered() {
                     // This will be called if the user dismisses the picker without selecting
                     if (cont.isActive) cont.resume(null)
                 }
             }

             nsdManager.registerServiceInfoCallback(request, Runnable::run, listener)
             cont.invokeOnCancellation {
                 // unregistration is safe to call multiple times on SDK Ext 22+
                 nsdManager.unregisterServiceInfoCallback(listener)
             }
         }
     }

     private suspend fun findServiceLegacy(
         serviceType: String, nameFilter: PatternMatcher?): NsdServiceInfo? {
         val tiramisuExt = SdkExtensions.getExtensionVersion(Build.VERSION_CODES.TIRAMISU)
         val lock = if (tiramisuExt < 7) {
             getSystemService(WifiManager::class.java)
                 .createMulticastLock("MyAppTag").apply { acquire() }
         } else {
             null
         }

         try {
             val discoveredService = suspendCancellableCoroutine { cont ->
                 val discoveryListener = object : NsdManager.DiscoveryListener {
                     override fun onServiceFound(info: NsdServiceInfo) {
                         // onServiceFound may be called multiple times
                         if (!cont.isActive) return
                         // Apps implement their own logic to select which discovered service
                         // to use. They may show a UI selector to the user, or have some
                         // custom name filtering to identify the service as assumed here.
                         if (nameFilter?.match(info.serviceName) == false) return
                         try {
                             // This may throw IllegalArgumentException on older SDKs if
                             // discovery was stopped already
                             nsdManager.stopServiceDiscovery(this)
                         } catch (_: IllegalArgumentException) {}
                         cont.resume(info)
                     }
                     override fun onStartDiscoveryFailed(type: String, err: Int) {
                         cont.resumeWithException(DiscoveryException(err))
                     }
                     override fun onDiscoveryStarted(type: String) {}
                     override fun onDiscoveryStopped(type: String) {}
                     override fun onServiceLost(info: NsdServiceInfo) {}
                     override fun onStopDiscoveryFailed(type: String, err: Int) {}
                 }
                 nsdManager.discoverServices(
                     serviceType, NsdManager.PROTOCOL_DNS_SD, discoveryListener)
                 cont.invokeOnCancellation {
                     try {
                         nsdManager.stopServiceDiscovery(discoveryListener)
                     } catch (_: IllegalArgumentException) {}
                 }
             }

             return suspendCancellableCoroutine { cont ->
                 val resolveListener = object : NsdManager.ResolveListener {
                     override fun onServiceResolved(info: NsdServiceInfo) {
                         cont.resume(info)
                     }
                     override fun onResolveFailed(info: NsdServiceInfo, err: Int) {
                         cont.resumeWithException(DiscoveryException(err))
                     }
                 }
                 nsdManager.resolveService(discoveredService, resolveListener)
                 cont.invokeOnCancellation {
                     if (tiramisuExt >= 7) {
                         try {
                             nsdManager.stopServiceResolution(resolveListener)
                         } catch (_: IllegalArgumentException) {}
                     }
                 }
             }
         } finally {
             lock?.release()
         }
     }
     
### Example re-finding a previously discovered service

    // Fetch the latest service information (such as IP addresses) for a service that was
     // previously discovered and saved in the app. This should typically be used before
     // each connection to the service to fetch up-to-date NsdServiceInfo#getHostAddresses()
     // and NsdServiceInfo#getNetwork(). Consider calling in a withTimeout block.
     suspend fun findKnownService(serviceType: String, serviceName: String): NsdServiceInfo? {
         if (SdkExtensions.getExtensionVersion(Build.VERSION_CODES.TIRAMISU) < 22) {
             return findKnownServiceLegacy(serviceType, serviceName)
         }
         val hasPermission = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.CINNAMON_BUN) {
             true
         } else suspendCancellableCoroutine { cont ->
             nsdManager.checkPermissionForService(serviceName, serviceType, Runnable::run) {
                 cont.resume(it == NsdManager.SERVICE_PERMISSION_GRANTED)
             }
         }
         if (!hasPermission) {
             // Trigger FLAG_SHOW_PICKER flow for the user to reselect the service
             return findService(serviceType,
                 PatternMatcher(serviceName, PatternMatcher.PATTERN_LITERAL))
         }

         return suspendCancellableCoroutine { cont ->
             val listener = object : NsdManager.ServiceInfoCallback {
                 override fun onServiceUpdated(serviceInfo: NsdServiceInfo) {
                     if (!cont.isActive) return // onServiceUpdated may be called multiple times
                     cont.resume(serviceInfo)
                     nsdManager.unregisterServiceInfoCallback(this)
                 }

                 override fun onServiceInfoCallbackRegistrationFailed(errorCode: Int) {
                     cont.resumeWithException(DiscoveryException(errorCode))
                 }

                 override fun onServiceInfoCallbackUnregistered() {}
             }

             val serviceToFind = NsdServiceInfo().apply {
                 this.serviceName = serviceName
                 this.serviceType = serviceType
                 // Set to find on specific Networks, see ConnectivityManager#requestNetwork
                 // this.network = network
             }
             nsdManager.registerServiceInfoCallback(
                 serviceToFind, Runnable::run, listener)
             cont.invokeOnCancellation {
                 nsdManager.unregisterServiceInfoCallback(listener)
             }
         }
     }

     private suspend fun findKnownServiceLegacy(
         serviceType: String, serviceName: String): NsdServiceInfo? {
         val tiramisuExt = SdkExtensions.getExtensionVersion(Build.VERSION_CODES.TIRAMISU)
         return suspendCancellableCoroutine { cont ->
             val lock = if (tiramisuExt < 7) {
                 getSystemService(WifiManager::class.java)
                     .createMulticastLock("MyAppTag").apply { acquire() }
             } else {
                 null
             }
             try {
                 val listener = object : NsdManager.ResolveListener {
                     override fun onResolveFailed(serviceInfo: NsdServiceInfo, errorCode: Int) {
                         cont.resumeWithException(DiscoveryException(errorCode))
                     }

                     override fun onServiceResolved(serviceInfo: NsdServiceInfo) {
                         if (cont.isActive) cont.resume(serviceInfo)
                     }
                 }
                 val serviceToFind = NsdServiceInfo().apply {
                     this.serviceName = serviceName
                     this.serviceType = serviceType
                 }
                 nsdManager.resolveService(serviceToFind, listener)
                 cont.invokeOnCancellation {
                     if (SdkExtensions.getExtensionVersion(Build.VERSION_CODES.TIRAMISU) >= 7) {
                         try {
                             nsdManager.stopServiceResolution(listener)
                         } catch (_: IllegalArgumentException) {
                         }
                     }
                 }
             } finally {
                 lock?.release()
             }
         }
     }
     
### Example advertising a service

    // Advertise a service for other devices to connect to the current device. This should be called
     // after opening a listening socket to handle connections from other devices, on a dynamic port
     // to avoid conflicts. Note this always requires the ACCESS_LOCAL_NETWORK permission.
     fun advertiseService(portNumber: Int): Pair<NsdManager.RegistrationListener, MulticastLock?> {
         // The Wi-Fi multicast lock is not necessary for advertising on Wi-Fi while in the
         // foreground since SDK extension 7
         val lock = if (SdkExtensions.getExtensionVersion(Build.VERSION_CODES.TIRAMISU) < 7) {
             getSystemService(WifiManager::class.java).createMulticastLock("MyAppTag").apply {
                 acquire()
             }
         } else null

         val service = NsdServiceInfo().apply {
             serviceName = "My service name"
             serviceType = "_servicetype._tcp"
             port = portNumber
         }
         val listener = object : NsdManager.RegistrationListener {
             override fun onRegistrationFailed(serviceType: NsdServiceInfo, errorCode: Int) {}
             override fun onServiceRegistered(serviceInfo: NsdServiceInfo) {}
             override fun onUnregistrationFailed(serviceType: NsdServiceInfo, errorCode: Int) {}
             override fun onServiceUnregistered(serviceType: NsdServiceInfo) {}
         }
         nsdManager.registerService(service, NsdManager.PROTOCOL_DNS_SD, listener)
         return Pair(listener, lock)
     }

     fun stopAdvertisingService(listener: NsdManager.RegistrationListener, lock: MulticastLock?) {
         lock?.release()
         // unregisterService may throw IllegalArgumentException on T SDK extension < 22 if the
         // listener was already unregistered or failed to register
         try {
             nsdManager.unregisterService(listener)
         } catch (_: IllegalArgumentException) {}
     }
     
<br />

**See also:**

- `https://developer.android.com/reference/android/net/nsd/NsdServiceInfo`
- `https://developer.android.com/reference/android/net/nsd/DiscoveryRequest`
- `https://developer.android.com/reference/android/net/nsd/AdvertisingRequest`

## Summary

| ### Nested classes ||
|---|---|
| ` interface` | `https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener` Interface for callback invocation for service discovery |
| ` interface` | `https://developer.android.com/reference/android/net/nsd/NsdManager.RegistrationListener` Interface for callback invocation for service registration |
| ` interface` | `https://developer.android.com/reference/android/net/nsd/NsdManager.ResolveListener` Callback for use with `https://developer.android.com/reference/android/net/nsd/NsdManager#resolveService(android.net.nsd.NsdServiceInfo,%20android.net.nsd.NsdManager.ResolveListener)` to resolve the service info and use with `https://developer.android.com/reference/android/net/nsd/NsdManager#stopServiceResolution(android.net.nsd.NsdManager.ResolveListener)` to stop resolution. |
| ` interface` | `https://developer.android.com/reference/android/net/nsd/NsdManager.ServiceInfoCallback` Callback to listen to service info updates. |

| ### Constants ||
|---|---|
| `https://developer.android.com/reference/java/lang/String` | `https://developer.android.com/reference/android/net/nsd/NsdManager#ACTION_NSD_STATE_CHANGED` Broadcast intent action to indicate whether network service discovery is enabled or disabled. |
| `https://developer.android.com/reference/java/lang/String` | `https://developer.android.com/reference/android/net/nsd/NsdManager#EXTRA_NSD_STATE` The lookup key for an int that indicates whether network service discovery is enabled or disabled. |
| `int` | `https://developer.android.com/reference/android/net/nsd/NsdManager#FAILURE_ALREADY_ACTIVE` Indicates that the operation failed because it is already active. |
| `int` | `https://developer.android.com/reference/android/net/nsd/NsdManager#FAILURE_BAD_PARAMETERS` Indicates that the service has failed to resolve because of bad parameters. |
| `int` | `https://developer.android.com/reference/android/net/nsd/NsdManager#FAILURE_INTERNAL_ERROR` Failures are passed with `https://developer.android.com/reference/android/net/nsd/NsdManager.RegistrationListener#onRegistrationFailed(android.net.nsd.NsdServiceInfo,%20int)`, `https://developer.android.com/reference/android/net/nsd/NsdManager.RegistrationListener#onUnregistrationFailed(android.net.nsd.NsdServiceInfo,%20int)`, `https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener#onStartDiscoveryFailed(java.lang.String,%20int)`, `https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener#onStopDiscoveryFailed(java.lang.String,%20int)` or `https://developer.android.com/reference/android/net/nsd/NsdManager.ResolveListener#onResolveFailed(android.net.nsd.NsdServiceInfo,%20int)`. |
| `int` | `https://developer.android.com/reference/android/net/nsd/NsdManager#FAILURE_MAX_LIMIT` Indicates that the operation failed because the maximum outstanding requests from the applications have reached. |
| `int` | `https://developer.android.com/reference/android/net/nsd/NsdManager#FAILURE_OPERATION_NOT_RUNNING` Indicates that the stop operation failed because it is not running. |
| `int` | `https://developer.android.com/reference/android/net/nsd/NsdManager#FAILURE_PERMISSION_DENIED` Indicates that the operation failed because the caller did not have the required permissions. |
| `int` | `https://developer.android.com/reference/android/net/nsd/NsdManager#NSD_STATE_DISABLED` Network service discovery is disabled |
| `int` | `https://developer.android.com/reference/android/net/nsd/NsdManager#NSD_STATE_ENABLED` Network service discovery is enabled |
| `int` | `https://developer.android.com/reference/android/net/nsd/NsdManager#PROTOCOL_DNS_SD` Dns based service discovery protocol |
| `int` | `https://developer.android.com/reference/android/net/nsd/NsdManager#SERVICE_PERMISSION_DENIED` Indicates the caller is not allowed to register service info callbacks or resolve a service. |
| `int` | `https://developer.android.com/reference/android/net/nsd/NsdManager#SERVICE_PERMISSION_GRANTED` Indicates the caller can register service info callbacks or resolve a service. |

| ### Public methods ||
|---|---|
| ` void` | ` https://developer.android.com/reference/android/net/nsd/NsdManager#checkPermissionForService(java.lang.String,%20java.lang.String,%20java.util.concurrent.Executor,%20java.util.function.IntConsumer)(https://developer.android.com/reference/java/lang/String serviceName, https://developer.android.com/reference/java/lang/String serviceType, https://developer.android.com/reference/java/util/concurrent/Executor executor, https://developer.android.com/reference/java/util/function/IntConsumer resultReceiver) ` Check whether the caller can register service info callbacks or resolve a service. |
| ` void` | ` https://developer.android.com/reference/android/net/nsd/NsdManager#discoverServices(java.lang.String,%20int,%20android.net.NetworkRequest,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.DiscoveryListener)(https://developer.android.com/reference/java/lang/String serviceType, int protocolType, https://developer.android.com/reference/android/net/NetworkRequest networkRequest, https://developer.android.com/reference/java/util/concurrent/Executor executor, https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener listener) ` Initiate service discovery to browse for instances of a service type. |
| ` void` | ` https://developer.android.com/reference/android/net/nsd/NsdManager#discoverServices(android.net.nsd.DiscoveryRequest,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.DiscoveryListener)(https://developer.android.com/reference/android/net/nsd/DiscoveryRequest discoveryRequest, https://developer.android.com/reference/java/util/concurrent/Executor executor, https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener listener) ` Initiates service discovery to browse for instances of a service type. |
| ` void` | ` https://developer.android.com/reference/android/net/nsd/NsdManager#discoverServices(java.lang.String,%20int,%20android.net.nsd.NsdManager.DiscoveryListener)(https://developer.android.com/reference/java/lang/String serviceType, int protocolType, https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener listener) ` Initiate service discovery to browse for instances of a service type. |
| ` void` | ` https://developer.android.com/reference/android/net/nsd/NsdManager#discoverServices(java.lang.String,%20int,%20android.net.Network,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.DiscoveryListener)(https://developer.android.com/reference/java/lang/String serviceType, int protocolType, https://developer.android.com/reference/android/net/Network network, https://developer.android.com/reference/java/util/concurrent/Executor executor, https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener listener) ` Initiate service discovery to browse for instances of a service type. |
| ` void` | ` https://developer.android.com/reference/android/net/nsd/NsdManager#registerService(android.net.nsd.NsdServiceInfo,%20int,%20android.net.nsd.NsdManager.RegistrationListener)(https://developer.android.com/reference/android/net/nsd/NsdServiceInfo serviceInfo, int protocolType, https://developer.android.com/reference/android/net/nsd/NsdManager.RegistrationListener listener) ` Register a service to be discovered by other services. |
| ` void` | ` https://developer.android.com/reference/android/net/nsd/NsdManager#registerService(android.net.nsd.AdvertisingRequest,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.RegistrationListener)(https://developer.android.com/reference/android/net/nsd/AdvertisingRequest advertisingRequest, https://developer.android.com/reference/java/util/concurrent/Executor executor, https://developer.android.com/reference/android/net/nsd/NsdManager.RegistrationListener listener) ` Register a service to be discovered by other services. |
| ` void` | ` https://developer.android.com/reference/android/net/nsd/NsdManager#registerService(android.net.nsd.NsdServiceInfo,%20int,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.RegistrationListener)(https://developer.android.com/reference/android/net/nsd/NsdServiceInfo serviceInfo, int protocolType, https://developer.android.com/reference/java/util/concurrent/Executor executor, https://developer.android.com/reference/android/net/nsd/NsdManager.RegistrationListener listener) ` Register a service to be discovered by other services. |
| ` void` | ` https://developer.android.com/reference/android/net/nsd/NsdManager#registerServiceInfoCallback(android.net.nsd.NsdServiceInfo,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.ServiceInfoCallback)(https://developer.android.com/reference/android/net/nsd/NsdServiceInfo serviceInfo, https://developer.android.com/reference/java/util/concurrent/Executor executor, https://developer.android.com/reference/android/net/nsd/NsdManager.ServiceInfoCallback listener) ` Register a callback to listen for updates to a service. |
| ` void` | ` https://developer.android.com/reference/android/net/nsd/NsdManager#registerServiceInfoCallback(android.net.nsd.DiscoveryRequest,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.ServiceInfoCallback)(https://developer.android.com/reference/android/net/nsd/DiscoveryRequest discoveryRequest, https://developer.android.com/reference/java/util/concurrent/Executor executor, https://developer.android.com/reference/android/net/nsd/NsdManager.ServiceInfoCallback listener) ` Register a callback to discover and track updates of services. |
| ` void` | ` https://developer.android.com/reference/android/net/nsd/NsdManager#resolveService(android.net.nsd.NsdServiceInfo,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.ResolveListener)(https://developer.android.com/reference/android/net/nsd/NsdServiceInfo serviceInfo, https://developer.android.com/reference/java/util/concurrent/Executor executor, https://developer.android.com/reference/android/net/nsd/NsdManager.ResolveListener listener) ` *This method was deprecated in API level 34. the returned ServiceInfo may get stale at any time after resolution, including immediately after the callback is called, and may not contain some service information that could be delivered later, like additional host addresses. Prefer using `https://developer.android.com/reference/android/net/nsd/NsdManager#registerServiceInfoCallback(android.net.nsd.DiscoveryRequest,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.ServiceInfoCallback)`, which will keep the application up-to-date with the state of the service.* |
| ` void` | ` https://developer.android.com/reference/android/net/nsd/NsdManager#resolveService(android.net.nsd.NsdServiceInfo,%20android.net.nsd.NsdManager.ResolveListener)(https://developer.android.com/reference/android/net/nsd/NsdServiceInfo serviceInfo, https://developer.android.com/reference/android/net/nsd/NsdManager.ResolveListener listener) ` *This method was deprecated in API level 34. the returned ServiceInfo may get stale at any time after resolution, including immediately after the callback is called, and may not contain some service information that could be delivered later, like additional host addresses. Prefer using `https://developer.android.com/reference/android/net/nsd/NsdManager#registerServiceInfoCallback(android.net.nsd.DiscoveryRequest,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.ServiceInfoCallback)`, which will keep the application up-to-date with the state of the service.* |
| ` void` | ` https://developer.android.com/reference/android/net/nsd/NsdManager#stopServiceDiscovery(android.net.nsd.NsdManager.DiscoveryListener)(https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener listener) ` Stop service discovery initiated with `https://developer.android.com/reference/android/net/nsd/NsdManager#discoverServices(android.net.nsd.DiscoveryRequest,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.DiscoveryListener)`. |
| ` void` | ` https://developer.android.com/reference/android/net/nsd/NsdManager#stopServiceResolution(android.net.nsd.NsdManager.ResolveListener)(https://developer.android.com/reference/android/net/nsd/NsdManager.ResolveListener listener) ` Stop service resolution initiated with `https://developer.android.com/reference/android/net/nsd/NsdManager#resolveService(android.net.nsd.NsdServiceInfo,%20android.net.nsd.NsdManager.ResolveListener)`. |
| ` void` | ` https://developer.android.com/reference/android/net/nsd/NsdManager#unregisterService(android.net.nsd.NsdManager.RegistrationListener)(https://developer.android.com/reference/android/net/nsd/NsdManager.RegistrationListener listener) ` Unregister a service registered through `https://developer.android.com/reference/android/net/nsd/NsdManager#registerService(android.net.nsd.AdvertisingRequest,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.RegistrationListener)`. |
| ` void` | ` https://developer.android.com/reference/android/net/nsd/NsdManager#unregisterServiceInfoCallback(android.net.nsd.NsdManager.ServiceInfoCallback)(https://developer.android.com/reference/android/net/nsd/NsdManager.ServiceInfoCallback listener) ` Unregister a callback registered with `https://developer.android.com/reference/android/net/nsd/NsdManager#registerServiceInfoCallback(android.net.nsd.DiscoveryRequest,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.ServiceInfoCallback)`. |

| ### Inherited methods |
|---|---|
| From class ` https://developer.android.com/reference/java/lang/Object ` |---|---| | ` https://developer.android.com/reference/java/lang/Object` | ` https://developer.android.com/reference/java/lang/Object#clone()() ` Creates and returns a copy of this object. | | ` boolean` | ` https://developer.android.com/reference/java/lang/Object#equals(java.lang.Object)(https://developer.android.com/reference/java/lang/Object obj) ` Indicates whether some other object is "equal to" this one. | | ` void` | ` https://developer.android.com/reference/java/lang/Object#finalize()() ` Called by the garbage collector on an object when garbage collection determines that there are no more references to the object. | | ` final https://developer.android.com/reference/java/lang/Class<?>` | ` https://developer.android.com/reference/java/lang/Object#getClass()() ` Returns the runtime class of this `Object`. | | ` int` | ` https://developer.android.com/reference/java/lang/Object#hashCode()() ` Returns a hash code value for the object. | | ` final void` | ` https://developer.android.com/reference/java/lang/Object#notify()() ` Wakes up a single thread that is waiting on this object's monitor. | | ` final void` | ` https://developer.android.com/reference/java/lang/Object#notifyAll()() ` Wakes up all threads that are waiting on this object's monitor. | | ` https://developer.android.com/reference/java/lang/String` | ` https://developer.android.com/reference/java/lang/Object#toString()() ` Returns a string representation of the object. | | ` final void` | ` https://developer.android.com/reference/java/lang/Object#wait(long,%20int)(long timeoutMillis, int nanos) ` Causes the current thread to wait until it is awakened, typically by being *notified* or *interrupted*, or until a certain amount of real time has elapsed. | | ` final void` | ` https://developer.android.com/reference/java/lang/Object#wait(long)(long timeoutMillis) ` Causes the current thread to wait until it is awakened, typically by being *notified* or *interrupted*, or until a certain amount of real time has elapsed. | | ` final void` | ` https://developer.android.com/reference/java/lang/Object#wait()() ` Causes the current thread to wait until it is awakened, typically by being *notified* or *interrupted*. | ||

## Constants

### ACTION_NSD_STATE_CHANGED

Added in [API level 16](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final String ACTION_NSD_STATE_CHANGED
```

Broadcast intent action to indicate whether network service discovery is
enabled or disabled. An extra `https://developer.android.com/reference/android/net/nsd/NsdManager#EXTRA_NSD_STATE` provides the state
information as int.

<br />

**See also:**

- `https://developer.android.com/reference/android/net/nsd/NsdManager#EXTRA_NSD_STATE`

Constant Value:

"android.net.nsd.STATE_CHANGED"


### EXTRA_NSD_STATE

Added in [API level 16](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final String EXTRA_NSD_STATE
```

The lookup key for an int that indicates whether network service discovery is enabled
or disabled. Retrieve it with `https://developer.android.com/reference/android/content/Intent#getIntExtra(java.lang.String,%20int)`.

<br />

**See also:**

- `https://developer.android.com/reference/android/net/nsd/NsdManager#NSD_STATE_DISABLED`
- `https://developer.android.com/reference/android/net/nsd/NsdManager#NSD_STATE_ENABLED`

Constant Value:

"nsd_state"


### FAILURE_ALREADY_ACTIVE

Added in [API level 16](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int FAILURE_ALREADY_ACTIVE
```

Indicates that the operation failed because it is already active.

<br />

Constant Value:

3
(0x00000003)


### FAILURE_BAD_PARAMETERS

Added in [API level 34](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  
Also in [T Extensions 7](https://developer.android.com/sdkExtensions)

```
public static final int FAILURE_BAD_PARAMETERS
```

Indicates that the service has failed to resolve because of bad parameters.

This failure is passed with
`https://developer.android.com/reference/android/net/nsd/NsdManager.ServiceInfoCallback#onServiceInfoCallbackRegistrationFailed(int)`.

<br />

Constant Value:

6
(0x00000006)


### FAILURE_INTERNAL_ERROR

Added in [API level 16](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int FAILURE_INTERNAL_ERROR
```

Failures are passed with `https://developer.android.com/reference/android/net/nsd/NsdManager.RegistrationListener#onRegistrationFailed(android.net.nsd.NsdServiceInfo,%20int)`,
`https://developer.android.com/reference/android/net/nsd/NsdManager.RegistrationListener#onUnregistrationFailed(android.net.nsd.NsdServiceInfo,%20int)`,
`https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener#onStartDiscoveryFailed(java.lang.String,%20int)`,
`https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener#onStopDiscoveryFailed(java.lang.String,%20int)` or `https://developer.android.com/reference/android/net/nsd/NsdManager.ResolveListener#onResolveFailed(android.net.nsd.NsdServiceInfo,%20int)`.

Indicates that the operation failed due to an internal error.

<br />

Constant Value:

0
(0x00000000)


### FAILURE_MAX_LIMIT

Added in [API level 16](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int FAILURE_MAX_LIMIT
```

Indicates that the operation failed because the maximum outstanding
requests from the applications have reached.

<br />

Constant Value:

4
(0x00000004)


### FAILURE_OPERATION_NOT_RUNNING

Added in [API level 34](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  
Also in [T Extensions 7](https://developer.android.com/sdkExtensions)

```
public static final int FAILURE_OPERATION_NOT_RUNNING
```

Indicates that the stop operation failed because it is not running.
This failure is passed with `https://developer.android.com/reference/android/net/nsd/NsdManager.ResolveListener#onStopResolutionFailed(android.net.nsd.NsdServiceInfo,%20int)`.

<br />

Constant Value:

5
(0x00000005)


### FAILURE_PERMISSION_DENIED

Added in [API level 37](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  
Also in [T Extensions 22](https://developer.android.com/sdkExtensions)

```
public static final int FAILURE_PERMISSION_DENIED
```

Indicates that the operation failed because the caller did not have the required permissions.
This can happen when trying to perform resolution, discovery, or callback registration
without the `https://developer.android.com/reference/android/Manifest.permission#ACCESS_LOCAL_NETWORK` permission.

This failure is passed with `https://developer.android.com/reference/android/net/nsd/NsdManager.ResolveListener#onResolveFailed(android.net.nsd.NsdServiceInfo,%20int)`,
`https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener#onStartDiscoveryFailed(java.lang.String,%20int)`, or
`https://developer.android.com/reference/android/net/nsd/NsdManager.ServiceInfoCallback#onServiceInfoCallbackRegistrationFailed(int)`.

<br />

Constant Value:

7
(0x00000007)


### NSD_STATE_DISABLED

Added in [API level 16](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int NSD_STATE_DISABLED
```

Network service discovery is disabled

<br />

**See also:**

- `https://developer.android.com/reference/android/net/nsd/NsdManager#ACTION_NSD_STATE_CHANGED`

Constant Value:

1
(0x00000001)


### NSD_STATE_ENABLED

Added in [API level 16](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int NSD_STATE_ENABLED
```

Network service discovery is enabled

<br />

**See also:**

- `https://developer.android.com/reference/android/net/nsd/NsdManager#ACTION_NSD_STATE_CHANGED`

Constant Value:

2
(0x00000002)


### PROTOCOL_DNS_SD

Added in [API level 16](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int PROTOCOL_DNS_SD
```

Dns based service discovery protocol

<br />

Constant Value:

1
(0x00000001)


### SERVICE_PERMISSION_DENIED

Added in [API level 37](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  
Also in [T Extensions 22](https://developer.android.com/sdkExtensions)

```
public static final int SERVICE_PERMISSION_DENIED
```

Indicates the caller is not allowed to register service info callbacks or resolve a service.

This is a result code for
`https://developer.android.com/reference/android/net/nsd/NsdManager#checkPermissionForService(java.lang.String,%20java.lang.String,%20java.util.concurrent.Executor,%20java.util.function.IntConsumer)`.

<br />

Constant Value:

2
(0x00000002)


### SERVICE_PERMISSION_GRANTED

Added in [API level 37](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  
Also in [T Extensions 22](https://developer.android.com/sdkExtensions)

```
public static final int SERVICE_PERMISSION_GRANTED
```

Indicates the caller can register service info callbacks or resolve a service.

This is a result code for
`https://developer.android.com/reference/android/net/nsd/NsdManager#checkPermissionForService(java.lang.String,%20java.lang.String,%20java.util.concurrent.Executor,%20java.util.function.IntConsumer)`.

<br />

Constant Value:

1
(0x00000001)


## Public methods

### checkPermissionForService

Added in [API level 37](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  
Also in [T Extensions 22](https://developer.android.com/sdkExtensions)

```
public void checkPermissionForService (String serviceName, 
                String serviceType, 
                Executor executor, 
                IntConsumer resultReceiver)
```

Check whether the caller can register service info callbacks or resolve a service.

Starting from target SDK `https://developer.android.com/reference/android/os/Build.VERSION_CODES#CINNAMON_BUN`, unless apps
have the `https://developer.android.com/reference/android/Manifest.permission#ACCESS_LOCAL_NETWORK` permission, they can only
register service info callbacks or resolve services that were selected in a UI picker, as
per `https://developer.android.com/reference/android/net/nsd/DiscoveryRequest#FLAG_SHOW_PICKER`.

The system will remember whether a user has selected a service in the past, but access
may be revoked for storage reasons or by the user. This method allows checking whether
access to the service was granted in the picker and not revoked.

The `resultReceiver` will be called using the provided `https://developer.android.com/reference/java/util/concurrent/Executor` with either
`https://developer.android.com/reference/android/net/nsd/NsdManager#SERVICE_PERMISSION_GRANTED` or `https://developer.android.com/reference/android/net/nsd/NsdManager#SERVICE_PERMISSION_DENIED`.

<br />

| Parameters ||
|---|---|
| `serviceName` | `String`: Instance name of the service. This value cannot be `null`. <br /> |
| `serviceType` | `String`: Type of the service, e.g. _ipp._tcp. This value cannot be `null`. <br /> |
| `executor` | `Executor`: The `https://developer.android.com/reference/java/util/concurrent/Executor` on which to invoke the receiver. This value cannot be `null`. <br /> |
| `resultReceiver` | `IntConsumer`: The `https://developer.android.com/reference/java/util/function/IntConsumer` to receive the permission check result code; will be either `https://developer.android.com/reference/android/net/nsd/NsdManager#SERVICE_PERMISSION_GRANTED` or `https://developer.android.com/reference/android/net/nsd/NsdManager#SERVICE_PERMISSION_DENIED`. This value cannot be `null`. <br /> |

### discoverServices

Added in [API level 33](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  
Also in [T Extensions 3](https://developer.android.com/sdkExtensions)

```
public void discoverServices (String serviceType, 
                int protocolType, 
                NetworkRequest networkRequest, 
                Executor executor, 
                NsdManager.DiscoveryListener listener)
```

Initiate service discovery to browse for instances of a service type. Service discovery
consumes network bandwidth and will continue until the application calls
`https://developer.android.com/reference/android/net/nsd/NsdManager#stopServiceDiscovery(android.net.nsd.NsdManager.DiscoveryListener)`.

The function call immediately returns after sending a request to start service
discovery to the framework. The application is notified of a success to initiate
discovery through the callback `https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener#onDiscoveryStarted(java.lang.String)` or a failure
through `https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener#onStartDiscoveryFailed(java.lang.String,%20int)`.

Upon successful start, application is notified when a service is found with
`https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener#onServiceFound(android.net.nsd.NsdServiceInfo)` or when a service is lost with
`https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener#onServiceLost(android.net.nsd.NsdServiceInfo)`.

Upon failure to start, service discovery is not active and application does
not need to invoke `https://developer.android.com/reference/android/net/nsd/NsdManager#stopServiceDiscovery(android.net.nsd.NsdManager.DiscoveryListener)`

The application should call `https://developer.android.com/reference/android/net/nsd/NsdManager#stopServiceDiscovery(android.net.nsd.NsdManager.DiscoveryListener)` when discovery of this
service type is no longer required, and/or whenever the application is paused or
stopped.

During discovery, new networks may connect or existing networks may disconnect - for
example if wifi is reconnected. When a service was found on a network that disconnects,
`https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener#onServiceLost(android.net.nsd.NsdServiceInfo)` will be called. If a new network connects that
matches the `https://developer.android.com/reference/android/net/NetworkRequest`, `https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener#onServiceFound(android.net.nsd.NsdServiceInfo)` will be called
for services found on that network. Applications that do not want to track networks
themselves are encouraged to use this method instead of other overloads of
`discoverServices`, as they will receive proper notifications when a service becomes
available or unavailable due to network changes.


Requires `https://developer.android.com/reference/android/Manifest.permission#ACCESS_NETWORK_STATE`

<br />

| Parameters ||
|---|---|
| `serviceType` | `String`: The service type being discovered. Examples include "_http._tcp" for http services or "_ipp._tcp" for printers. This value cannot be `null`. <br /> |
| `protocolType` | `int`: The service discovery protocol <br /> |
| `networkRequest` | `NetworkRequest`: Request specifying networks that should be considered when discovering. This value cannot be `null`. <br /> |
| `executor` | `Executor`: Executor to run listener callbacks with. This value cannot be `null`. <br /> |
| `listener` | `NsdManager.DiscoveryListener`: The listener notifies of a successful discovery and is used to stop discovery on this serviceType through a call on `https://developer.android.com/reference/android/net/nsd/NsdManager#stopServiceDiscovery(android.net.nsd.NsdManager.DiscoveryListener)`. This value cannot be `null`. <br /> |

### discoverServices

Added in [API level 35](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  
Also in [T Extensions 3](https://developer.android.com/sdkExtensions)

```
public void discoverServices (DiscoveryRequest discoveryRequest, 
                Executor executor, 
                NsdManager.DiscoveryListener listener)
```

Initiates service discovery to browse for instances of a service type. Service discovery
consumes network bandwidth and will continue until the application calls
`https://developer.android.com/reference/android/net/nsd/NsdManager#stopServiceDiscovery(android.net.nsd.NsdManager.DiscoveryListener)`.

The function call immediately returns after sending a request to start service
discovery to the framework. The application is notified of a success to initiate
discovery through the callback `https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener#onDiscoveryStarted(java.lang.String)` or a failure
through `https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener#onStartDiscoveryFailed(java.lang.String,%20int)`.

Upon successful start, application is notified when a service is found with
`https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener#onServiceFound(android.net.nsd.NsdServiceInfo)` or when a service is lost with
`https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener#onServiceLost(android.net.nsd.NsdServiceInfo)`.

Upon failure to start, service discovery is not active and application does
not need to invoke `https://developer.android.com/reference/android/net/nsd/NsdManager#stopServiceDiscovery(android.net.nsd.NsdManager.DiscoveryListener)`

The application should call `https://developer.android.com/reference/android/net/nsd/NsdManager#stopServiceDiscovery(android.net.nsd.NsdManager.DiscoveryListener)` when discovery of this
service type is no longer required, and/or whenever the application is paused or
stopped.

<br />

| Parameters ||
|---|---|
| `discoveryRequest` | `DiscoveryRequest`: the `https://developer.android.com/reference/android/net/nsd/DiscoveryRequest` object which specifies the discovery parameters such as service type, subtype and network. This value cannot be `null`. <br /> |
| `executor` | `Executor`: Executor to run listener callbacks with. This value cannot be `null`. <br /> |
| `listener` | `NsdManager.DiscoveryListener`: The listener notifies of a successful discovery and is used to stop discovery on this serviceType through a call on `https://developer.android.com/reference/android/net/nsd/NsdManager#stopServiceDiscovery(android.net.nsd.NsdManager.DiscoveryListener)`. This value cannot be `null`. <br /> |

### discoverServices

Added in [API level 16](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  
Also in [T Extensions 3](https://developer.android.com/sdkExtensions)

```
public void discoverServices (String serviceType, 
                int protocolType, 
                NsdManager.DiscoveryListener listener)
```

Initiate service discovery to browse for instances of a service type. Service discovery
consumes network bandwidth and will continue until the application calls
`https://developer.android.com/reference/android/net/nsd/NsdManager#stopServiceDiscovery(android.net.nsd.NsdManager.DiscoveryListener)`.

The function call immediately returns after sending a request to start service
discovery to the framework. The application is notified of a success to initiate
discovery through the callback `https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener#onDiscoveryStarted(java.lang.String)` or a failure
through `https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener#onStartDiscoveryFailed(java.lang.String,%20int)`.

Upon successful start, application is notified when a service is found with
`https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener#onServiceFound(android.net.nsd.NsdServiceInfo)` or when a service is lost with
`https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener#onServiceLost(android.net.nsd.NsdServiceInfo)`.

Upon failure to start, service discovery is not active and application does
not need to invoke `https://developer.android.com/reference/android/net/nsd/NsdManager#stopServiceDiscovery(android.net.nsd.NsdManager.DiscoveryListener)`

The application should call `https://developer.android.com/reference/android/net/nsd/NsdManager#stopServiceDiscovery(android.net.nsd.NsdManager.DiscoveryListener)` when discovery of this
service type is no longer required, and/or whenever the application is paused or
stopped.

<br />

| Parameters ||
|---|---|
| `serviceType` | `String`: The service type being discovered. Examples include "_http._tcp" for http services or "_ipp._tcp" for printers <br /> |
| `protocolType` | `int`: The service discovery protocol <br /> |
| `listener` | `NsdManager.DiscoveryListener`: The listener notifies of a successful discovery and is used to stop discovery on this serviceType through a call on `https://developer.android.com/reference/android/net/nsd/NsdManager#stopServiceDiscovery(android.net.nsd.NsdManager.DiscoveryListener)`. Cannot be null. Cannot be in use for an active service discovery. <br /> |

### discoverServices

Added in [API level 33](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  
Also in [T Extensions 3](https://developer.android.com/sdkExtensions)

```
public void discoverServices (String serviceType, 
                int protocolType, 
                Network network, 
                Executor executor, 
                NsdManager.DiscoveryListener listener)
```

Initiate service discovery to browse for instances of a service type. Service discovery
consumes network bandwidth and will continue until the application calls
`https://developer.android.com/reference/android/net/nsd/NsdManager#stopServiceDiscovery(android.net.nsd.NsdManager.DiscoveryListener)`.

The function call immediately returns after sending a request to start service
discovery to the framework. The application is notified of a success to initiate
discovery through the callback `https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener#onDiscoveryStarted(java.lang.String)` or a failure
through `https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener#onStartDiscoveryFailed(java.lang.String,%20int)`.

Upon successful start, application is notified when a service is found with
`https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener#onServiceFound(android.net.nsd.NsdServiceInfo)` or when a service is lost with
`https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener#onServiceLost(android.net.nsd.NsdServiceInfo)`.

Upon failure to start, service discovery is not active and application does
not need to invoke `https://developer.android.com/reference/android/net/nsd/NsdManager#stopServiceDiscovery(android.net.nsd.NsdManager.DiscoveryListener)`

The application should call `https://developer.android.com/reference/android/net/nsd/NsdManager#stopServiceDiscovery(android.net.nsd.NsdManager.DiscoveryListener)` when discovery of this
service type is no longer required, and/or whenever the application is paused or
stopped.

<br />

| Parameters ||
|---|---|
| `serviceType` | `String`: The service type being discovered. Examples include "_http._tcp" for http services or "_ipp._tcp" for printers. This value cannot be `null`. <br /> |
| `protocolType` | `int`: The service discovery protocol <br /> |
| `network` | `Network`: Network to discover services on, or null to discover on all available networks <br /> |
| `executor` | `Executor`: Executor to run listener callbacks with. This value cannot be `null`. <br /> |
| `listener` | `NsdManager.DiscoveryListener`: The listener notifies of a successful discovery and is used to stop discovery on this serviceType through a call on `https://developer.android.com/reference/android/net/nsd/NsdManager#stopServiceDiscovery(android.net.nsd.NsdManager.DiscoveryListener)`. This value cannot be `null`. <br /> |

### registerService

Added in [API level 16](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  
Also in [T Extensions 3](https://developer.android.com/sdkExtensions)

```
public void registerService (NsdServiceInfo serviceInfo, 
                int protocolType, 
                NsdManager.RegistrationListener listener)
```

Register a service to be discovered by other services.

The function call immediately returns after sending a request to register service
to the framework. The application is notified of a successful registration
through the callback `https://developer.android.com/reference/android/net/nsd/NsdManager.RegistrationListener#onServiceRegistered(android.net.nsd.NsdServiceInfo)` or a failure
through `https://developer.android.com/reference/android/net/nsd/NsdManager.RegistrationListener#onRegistrationFailed(android.net.nsd.NsdServiceInfo,%20int)`.

The application should call `https://developer.android.com/reference/android/net/nsd/NsdManager#unregisterService(android.net.nsd.NsdManager.RegistrationListener)` when the service
registration is no longer required, and/or whenever the application is stopped.

<br />

| Parameters ||
|---|---|
| `serviceInfo` | `NsdServiceInfo`: The service being registered <br /> |
| `protocolType` | `int`: The service discovery protocol <br /> |
| `listener` | `NsdManager.RegistrationListener`: The listener notifies of a successful registration and is used to unregister this service through a call on `https://developer.android.com/reference/android/net/nsd/NsdManager#unregisterService(android.net.nsd.NsdManager.RegistrationListener)`. Cannot be null. Cannot be in use for an active service registration. <br /> |

### registerService

Added in [version 36.1](https://developer.android.com/topic/libraries/support-library/revisions)  
Also in [T Extensions 3](https://developer.android.com/sdkExtensions)

```
public void registerService (AdvertisingRequest advertisingRequest, 
                Executor executor, 
                NsdManager.RegistrationListener listener)
```

Register a service to be discovered by other services.

The function call immediately returns after sending a request to register service
to the framework. The application is notified of a successful registration
through the callback `https://developer.android.com/reference/android/net/nsd/NsdManager.RegistrationListener#onServiceRegistered(android.net.nsd.NsdServiceInfo)` or a failure
through `https://developer.android.com/reference/android/net/nsd/NsdManager.RegistrationListener#onRegistrationFailed(android.net.nsd.NsdServiceInfo,%20int)`.

The application should call `https://developer.android.com/reference/android/net/nsd/NsdManager#unregisterService(android.net.nsd.NsdManager.RegistrationListener)` when the service
registration is no longer required, and/or whenever the application is stopped.

<br />

| Parameters ||
|---|---|
| `advertisingRequest` | `AdvertisingRequest`: service being registered. This value cannot be `null`. <br /> |
| `executor` | `Executor`: Executor to run listener callbacks with. This value cannot be `null`. <br /> |
| `listener` | `NsdManager.RegistrationListener`: The listener notifies of a successful registration and is used to unregister this service through a call on `https://developer.android.com/reference/android/net/nsd/NsdManager#unregisterService(android.net.nsd.NsdManager.RegistrationListener)`. Cannot be null. <br /> |

### registerService

Added in [API level 33](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  
Also in [T Extensions 3](https://developer.android.com/sdkExtensions)

```
public void registerService (NsdServiceInfo serviceInfo, 
                int protocolType, 
                Executor executor, 
                NsdManager.RegistrationListener listener)
```

Register a service to be discovered by other services.

The function call immediately returns after sending a request to register service
to the framework. The application is notified of a successful registration
through the callback `https://developer.android.com/reference/android/net/nsd/NsdManager.RegistrationListener#onServiceRegistered(android.net.nsd.NsdServiceInfo)` or a failure
through `https://developer.android.com/reference/android/net/nsd/NsdManager.RegistrationListener#onRegistrationFailed(android.net.nsd.NsdServiceInfo,%20int)`.

The application should call `https://developer.android.com/reference/android/net/nsd/NsdManager#unregisterService(android.net.nsd.NsdManager.RegistrationListener)` when the service
registration is no longer required, and/or whenever the application is stopped.

<br />

| Parameters ||
|---|---|
| `serviceInfo` | `NsdServiceInfo`: The service being registered. This value cannot be `null`. <br /> |
| `protocolType` | `int`: The service discovery protocol <br /> |
| `executor` | `Executor`: Executor to run listener callbacks with. This value cannot be `null`. <br /> |
| `listener` | `NsdManager.RegistrationListener`: The listener notifies of a successful registration and is used to unregister this service through a call on `https://developer.android.com/reference/android/net/nsd/NsdManager#unregisterService(android.net.nsd.NsdManager.RegistrationListener)`. Cannot be null. <br /> |

### registerServiceInfoCallback

Added in [API level 34](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  
Also in [T Extensions 7](https://developer.android.com/sdkExtensions)

```
public void registerServiceInfoCallback (NsdServiceInfo serviceInfo, 
                Executor executor, 
                NsdManager.ServiceInfoCallback listener)
```

Register a callback to listen for updates to a service.

An application can listen to a service to continuously monitor availability of given service.
The callback methods will be called on the passed executor. And service updates are sent with
continuous calls to `https://developer.android.com/reference/android/net/nsd/NsdManager.ServiceInfoCallback#onServiceUpdated(android.net.nsd.NsdServiceInfo)`.

This is different from `https://developer.android.com/reference/android/net/nsd/NsdManager#resolveService(android.net.nsd.NsdServiceInfo,%20android.net.nsd.NsdManager.ResolveListener)` which provides one shot service information.

This API listens to updates for one service at a time. Applications need to cancel the
registration before registering the same callback instance again. Upon failure to register a
callback for example if it's a duplicated registration, the application is notified through
`https://developer.android.com/reference/android/net/nsd/NsdManager.ServiceInfoCallback#onServiceInfoCallbackRegistrationFailed(int)` with
`https://developer.android.com/reference/android/net/nsd/NsdManager#FAILURE_BAD_PARAMETERS`.

<br />

| Parameters ||
|---|---|
| `serviceInfo` | `NsdServiceInfo`: the service to receive updates for. This value cannot be `null`. <br /> |
| `executor` | `Executor`: Executor to run callbacks with. This value cannot be `null`. <br /> |
| `listener` | `NsdManager.ServiceInfoCallback`: to receive callback upon service update. This value cannot be `null`. <br /> |

### registerServiceInfoCallback

Added in [API level 37](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  
Also in [T Extensions 7](https://developer.android.com/sdkExtensions)

```
public void registerServiceInfoCallback (DiscoveryRequest discoveryRequest, 
                Executor executor, 
                NsdManager.ServiceInfoCallback listener)
```

Register a callback to discover and track updates of services.

This method combines
`https://developer.android.com/reference/android/net/nsd/NsdManager#discoverServices(android.net.nsd.DiscoveryRequest,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.DiscoveryListener)` and
`https://developer.android.com/reference/android/net/nsd/NsdManager#registerServiceInfoCallback(android.net.nsd.NsdServiceInfo,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.ServiceInfoCallback)` by
finding services as per the provided `https://developer.android.com/reference/android/net/nsd/DiscoveryRequest`, and continuously monitoring
availability and properties of the discovered services.

This API may cause more network traffic than using
`https://developer.android.com/reference/android/net/nsd/NsdManager#discoverServices(android.net.nsd.DiscoveryRequest,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.DiscoveryListener)` and only calling
`https://developer.android.com/reference/android/net/nsd/NsdManager#registerServiceInfoCallback(android.net.nsd.NsdServiceInfo,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.ServiceInfoCallback)` for
select services, because it automatically queries all service information for all discovered
services. However most mDNS advertisers reply with their full service information in one
discovery reply, in which case there is no additional traffic, and this API saves the cost of
registering multiple listeners for discovering and resolving services.

Applications need to cancel the registration before registering the same callback instance
again. Upon failure to register a callback, the application is notified through
`https://developer.android.com/reference/android/net/nsd/NsdManager.ServiceInfoCallback#onServiceInfoCallbackRegistrationFailed(int)`.

<br />

| Parameters ||
|---|---|
| `discoveryRequest` | `DiscoveryRequest`: the `https://developer.android.com/reference/android/net/nsd/DiscoveryRequest` object which specifies the discovery parameters such as service type, subtype and network. This value cannot be `null`. <br /> |
| `executor` | `Executor`: Executor to run listener callbacks with. This value cannot be `null`. <br /> |
| `listener` | `NsdManager.ServiceInfoCallback`: The listener to be notified of found, updated or lost services. This value cannot be `null`. <br /> |

### resolveService

Added in [API level 33](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  
Also in [T Extensions 3](https://developer.android.com/sdkExtensions)   
Deprecated in [API level
34](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void resolveService (NsdServiceInfo serviceInfo, 
                Executor executor, 
                NsdManager.ResolveListener listener)
```


**This method was deprecated
in API level 34.**   

the returned ServiceInfo may get stale at any time after resolution, including
immediately after the callback is called, and may not contain some service information that
could be delivered later, like additional host addresses. Prefer using
`https://developer.android.com/reference/android/net/nsd/NsdManager#registerServiceInfoCallback(android.net.nsd.DiscoveryRequest,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.ServiceInfoCallback)`, which will keep the application up-to-date with the
state of the service.

Resolve a discovered service. An application can resolve a service right before
establishing a connection to fetch the IP and port details on which to setup
the connection.

<br />

| Parameters ||
|---|---|
| `serviceInfo` | `NsdServiceInfo`: service to be resolved. This value cannot be `null`. <br /> |
| `executor` | `Executor`: Executor to run listener callbacks with. This value cannot be `null`. <br /> |
| `listener` | `NsdManager.ResolveListener`: to receive callback upon success or failure. This value cannot be `null`. <br /> |

### resolveService

Added in [API level 16](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  
Also in [T Extensions 3](https://developer.android.com/sdkExtensions)   
Deprecated in [API level
34](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void resolveService (NsdServiceInfo serviceInfo, 
                NsdManager.ResolveListener listener)
```


**This method was deprecated
in API level 34.**   

the returned ServiceInfo may get stale at any time after resolution, including
immediately after the callback is called, and may not contain some service information that
could be delivered later, like additional host addresses. Prefer using
`https://developer.android.com/reference/android/net/nsd/NsdManager#registerServiceInfoCallback(android.net.nsd.DiscoveryRequest,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.ServiceInfoCallback)`, which will keep the application up-to-date with the
state of the service.

Resolve a discovered service. An application can resolve a service right before
establishing a connection to fetch the IP and port details on which to setup
the connection.

<br />

| Parameters ||
|---|---|
| `serviceInfo` | `NsdServiceInfo`: service to be resolved <br /> |
| `listener` | `NsdManager.ResolveListener`: to receive callback upon success or failure. Cannot be null. Cannot be in use for an active service resolution. <br /> |

### stopServiceDiscovery

Added in [API level 16](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void stopServiceDiscovery (NsdManager.DiscoveryListener listener)
```

Stop service discovery initiated with `https://developer.android.com/reference/android/net/nsd/NsdManager#discoverServices(android.net.nsd.DiscoveryRequest,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.DiscoveryListener)`. An active service
discovery is notified to the application with `https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener#onDiscoveryStarted(java.lang.String)`
and it stays active until the application invokes a stop service discovery. A successful
stop is notified to with a call to `https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener#onDiscoveryStopped(java.lang.String)`.

Upon failure to stop service discovery, application is notified through
`https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener#onStopDiscoveryFailed(java.lang.String,%20int)`.

If the listener is not already registered, for apps running on devices with T SDK
extension \< 22, this will throw with `https://developer.android.com/reference/java/lang/IllegalArgumentException`.

<br />

| Parameters ||
|---|---|
| `listener` | `NsdManager.DiscoveryListener`: This should be the listener object that was passed to `https://developer.android.com/reference/android/net/nsd/NsdManager#discoverServices(android.net.nsd.DiscoveryRequest,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.DiscoveryListener)`. It identifies the discovery that should be stopped and notifies of a successful or unsuccessful stop. In API versions 20 and above, the listener object may be used for another service discovery once the callback has been called. In API versions \<= 19, there is no entirely reliable way to know when a listener may be re-used, and a new listener should be created for each service discovery request. <br /> |

### stopServiceResolution

Added in [API level 34](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  
Also in [T Extensions 7](https://developer.android.com/sdkExtensions)

```
public void stopServiceResolution (NsdManager.ResolveListener listener)
```

Stop service resolution initiated with `https://developer.android.com/reference/android/net/nsd/NsdManager#resolveService(android.net.nsd.NsdServiceInfo,%20android.net.nsd.NsdManager.ResolveListener)`.

A successful stop is notified with a call to `https://developer.android.com/reference/android/net/nsd/NsdManager.ResolveListener#onResolutionStopped(android.net.nsd.NsdServiceInfo)`.

Upon failure to stop service resolution for example if resolution is done or the
requester stops resolution repeatedly, the application is notified
`https://developer.android.com/reference/android/net/nsd/NsdManager.ResolveListener#onStopResolutionFailed(android.net.nsd.NsdServiceInfo,%20int)` with `https://developer.android.com/reference/android/net/nsd/NsdManager#FAILURE_OPERATION_NOT_RUNNING`

If the listener is not already registered, for apps running on devices with T SDK
extension \< 22, this will throw with `https://developer.android.com/reference/java/lang/IllegalArgumentException`.

<br />

| Parameters ||
|---|---|
| `listener` | `NsdManager.ResolveListener`: This should be a listener object that was passed to `https://developer.android.com/reference/android/net/nsd/NsdManager#resolveService(android.net.nsd.NsdServiceInfo,%20android.net.nsd.NsdManager.ResolveListener)`. It identifies the resolution that should be stopped and notifies of a successful or unsuccessful stop. This value cannot be `null`. <br /> |

### unregisterService

Added in [API level 16](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void unregisterService (NsdManager.RegistrationListener listener)
```

Unregister a service registered through `https://developer.android.com/reference/android/net/nsd/NsdManager#registerService(android.net.nsd.AdvertisingRequest,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.RegistrationListener)`. A successful
unregister is notified to the application with a call to
`https://developer.android.com/reference/android/net/nsd/NsdManager.RegistrationListener#onServiceUnregistered(android.net.nsd.NsdServiceInfo)`.

<br />

| Parameters ||
|---|---|
| `listener` | `NsdManager.RegistrationListener`: This should be the listener object that was passed to `https://developer.android.com/reference/android/net/nsd/NsdManager#registerService(android.net.nsd.AdvertisingRequest,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.RegistrationListener)`. It identifies the service that should be unregistered and notifies of a successful or unsuccessful unregistration via the listener callbacks. In API versions 20 and above, the listener object may be used for another service registration once the callback has been called. In API versions \<= 19, there is no entirely reliable way to know when a listener may be re-used, and a new listener should be created for each service registration request. If the listener is not already registered, for apps running on devices with T SDK extension \< 22, this will throw with `https://developer.android.com/reference/java/lang/IllegalArgumentException`. |

### unregisterServiceInfoCallback

Added in [API level 34](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  
Also in [T Extensions 7](https://developer.android.com/sdkExtensions)

```
public void unregisterServiceInfoCallback (NsdManager.ServiceInfoCallback listener)
```

Unregister a callback registered with `https://developer.android.com/reference/android/net/nsd/NsdManager#registerServiceInfoCallback(android.net.nsd.DiscoveryRequest,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.ServiceInfoCallback)`.

A successful unregistration is notified with a call to
`https://developer.android.com/reference/android/net/nsd/NsdManager.ServiceInfoCallback#onServiceInfoCallbackUnregistered()`. The same callback can only be
reused after this is called.

If the listener is not already registered, for apps running on devices with T SDK
extension \< 22, this will throw with `https://developer.android.com/reference/java/lang/IllegalArgumentException`.

<br />

| Parameters ||
|---|---|
| `listener` | `NsdManager.ServiceInfoCallback`: This should be a listener object that was passed to `https://developer.android.com/reference/android/net/nsd/NsdManager#registerServiceInfoCallback(android.net.nsd.DiscoveryRequest,%20java.util.concurrent.Executor,%20android.net.nsd.NsdManager.ServiceInfoCallback)`. It identifies the registration that should be unregistered and notifies of a successful or unsuccessful stop. This value cannot be `null`. <br /> |