Java tutorial
package org.drulabs.localdash.nsddiscovery; /* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import android.content.Context; import android.content.Intent; import android.net.nsd.NsdServiceInfo; import android.net.nsd.NsdManager; import android.os.Build; import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import org.drulabs.localdash.notification.NotificationToast; public class NsdHelper { public static final String BROADCAST_TAG = "NSDBroadcast"; public static final String KEY_SERVICE_INFO = "serviceinfo"; Context mContext; private LocalBroadcastManager broadcaster; NsdManager mNsdManager; NsdManager.ResolveListener mResolveListener; NsdManager.DiscoveryListener mDiscoveryListener; NsdManager.RegistrationListener mRegistrationListener; public static final String SERVICE_TYPE = "_localdash._tcp"; // There is an additional dot at the end of service name most probably by os, this is to // rectify that problem public static final String SERVICE_TYPE_PLUS_DOT = SERVICE_TYPE + "."; public static final String TAG = "NSDHelperDXDX: "; private static final String DEFAULT_SERVICE_NAME = "LocalDashKK"; public String mServiceName = DEFAULT_SERVICE_NAME; NsdServiceInfo mService; public NsdHelper(Context context) { mContext = context; mNsdManager = (NsdManager) context.getSystemService(Context.NSD_SERVICE); broadcaster = LocalBroadcastManager.getInstance(mContext); } public void initializeNsd() { initializeResolveListener(); //mNsdManager.init(mContext.getMainLooper(), this); } public void initializeDiscoveryListener() { mDiscoveryListener = new NsdManager.DiscoveryListener() { @Override public void onDiscoveryStarted(String regType) { Log.d(TAG, "Service discovery started"); } @Override public void onServiceFound(NsdServiceInfo service) { Log.d(TAG, "Service discovery success" + service); String serviceType = service.getServiceType(); Log.d(TAG, "Service discovery success: " + service.getServiceName()); // For some reason the service type received has an extra dot with it, hence // handling that case boolean isOurService = serviceType.equals(SERVICE_TYPE) || serviceType.equals(SERVICE_TYPE_PLUS_DOT); if (!isOurService) { Log.d(TAG, "Unknown Service Type: " + service.getServiceType()); } else if (service.getServiceName().equals(mServiceName)) { Log.d(TAG, "Same machine: " + mServiceName); } else if (service.getServiceName().contains(mServiceName)) { Log.d(TAG, "different machines. (" + service.getServiceName() + "-" + mServiceName + ")"); mNsdManager.resolveService(service, mResolveListener); } } @Override public void onServiceLost(NsdServiceInfo service) { Log.e(TAG, "service lost" + service); if (mService == service) { mService = null; } } @Override public void onDiscoveryStopped(String serviceType) { Log.i(TAG, "Discovery stopped: " + serviceType); } @Override public void onStartDiscoveryFailed(String serviceType, int errorCode) { Log.e(TAG, "Discovery failed: Error code:" + errorCode); } @Override public void onStopDiscoveryFailed(String serviceType, int errorCode) { Log.e(TAG, "Discovery failed: Error code:" + errorCode); } }; } public void initializeResolveListener() { mResolveListener = new NsdManager.ResolveListener() { @Override public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) { Log.e(TAG, "Resolve failed" + errorCode); } @Override public void onServiceResolved(NsdServiceInfo serviceInfo) { Log.v(TAG, "Resolve Succeeded. " + serviceInfo); if (serviceInfo.getServiceName().equals(mServiceName)) { Log.d(TAG, "Same IP."); return; } mService = serviceInfo; Intent intent = new Intent(BROADCAST_TAG); // intent.putExtra(KEY_SERVICE_INFO, mService); broadcaster.sendBroadcast(intent); } }; } public void initializeRegistrationListener() { mRegistrationListener = new NsdManager.RegistrationListener() { @Override public void onServiceRegistered(NsdServiceInfo NsdServiceInfo) { mServiceName = NsdServiceInfo.getServiceName(); Log.d(TAG, "Service registered: " + NsdServiceInfo); NotificationToast.showToast(mContext, "Service registered"); } @Override public void onRegistrationFailed(NsdServiceInfo arg0, int arg1) { Log.d(TAG, "Service registration failed: " + arg1); NotificationToast.showToast(mContext, "Service registration failed"); } @Override public void onServiceUnregistered(NsdServiceInfo arg0) { Log.d(TAG, "Service unregistered: " + arg0.getServiceName()); NotificationToast.showToast(mContext, "Service unregistered"); } @Override public void onUnregistrationFailed(NsdServiceInfo serviceInfo, int errorCode) { Log.d(TAG, "Service unregistration failed: " + errorCode); NotificationToast.showToast(mContext, "Service un-registration failed"); } }; } public void registerService(int port) { tearDown(); // Cancel any previous registration request initializeRegistrationListener(); NsdServiceInfo serviceInfo = new NsdServiceInfo(); serviceInfo.setPort(port); serviceInfo.setServiceName(mServiceName); serviceInfo.setServiceType(SERVICE_TYPE); Log.v(TAG, Build.MANUFACTURER + " registering service: " + port); mNsdManager.registerService(serviceInfo, NsdManager.PROTOCOL_DNS_SD, mRegistrationListener); } public void discoverServices() { stopDiscovery(); // Cancel any existing discovery request initializeDiscoveryListener(); mNsdManager.discoverServices(SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener); } public void stopDiscovery() { if (mDiscoveryListener != null) { try { mNsdManager.stopServiceDiscovery(mDiscoveryListener); } finally { } mDiscoveryListener = null; } } public NsdServiceInfo getChosenServiceInfo() { return mService; } public void tearDown() { if (mRegistrationListener != null) { try { mNsdManager.unregisterService(mRegistrationListener); } finally { } mRegistrationListener = null; } } }