android 所有的服务,Android NSD未发现所有服务

答案可能有点晚,但我发现他们的开发者网站上的android给NSD的一个很好的解决方案。我做了一些修改,它工作得很好。

public class NsdClient {

private Context mContext;

private NsdManager mNsdManager;

NsdManager.DiscoveryListener mDiscoveryListener;

//To find all the available networks SERVICE_TYPE = "_services._dns-sd._udp"

public static final String SERVICE_TYPE = "_hap._tcp.";

public static final String TAG = "NsdClient";

private static ArrayList ServicesAvailable = new ArrayList<>();

public NsdClient(Context context) {

mContext = context;

mNsdManager = (NsdManager) context.getSystemService(Context.NSD_SERVICE);

}

public void initializeNsd() {

initializeDiscoveryListener();

}

public void initializeDiscoveryListener() {

mDiscoveryListener = new NsdManager.DiscoveryListener() {

@Override

public void onDiscoveryStarted(String regType) {

Log.d(TAG, "Service discovery started " + regType);

}

@Override

public void onServiceFound(NsdServiceInfo service) {

Log.d(TAG, "Service discovery success " + service);

AVAILABLE_NETWORKS.add(service);

if (!service.getServiceType().equals(SERVICE_TYPE)) {

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, "Resolving Services: " + service);

mNsdManager.resolveService(service, new initializeResolveListener());

}

}

@Override

public void onServiceLost(NsdServiceInfo service) {

Log.e(TAG, "service lost" + service);

if (ServicesAvailable.equals(service)) {

ServicesAvailable = 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);

mNsdManager.stopServiceDiscovery(this);

}

@Override

public void onStopDiscoveryFailed(String serviceType, int errorCode) {

Log.e(TAG, "Discovery failed: Error code:" + errorCode);

mNsdManager.stopServiceDiscovery(this);

}

};

}

public class initializeResolveListener implements NsdManager.ResolveListener {

@Override

public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {

Log.e(TAG, "Resolve failed " + errorCode);

switch (errorCode) {

case NsdManager.FAILURE_ALREADY_ACTIVE:

Log.e(TAG, "FAILURE ALREADY ACTIVE");

mNsdManager.resolveService(serviceInfo, new initializeResolveListener());

break;

case NsdManager.FAILURE_INTERNAL_ERROR:

Log.e(TAG, "FAILURE_INTERNAL_ERROR");

break;

case NsdManager.FAILURE_MAX_LIMIT:

Log.e(TAG, "FAILURE_MAX_LIMIT");

break;

}

}

@Override

public void onServiceResolved(NsdServiceInfo serviceInfo) {

Log.e(TAG, "Resolve Succeeded. " + serviceInfo);

if (serviceInfo.getServiceName().equals(mServiceName)) {

Log.d(TAG, "Same IP.");

return;

}

}

}

public void stopDiscovery() {

mNsdManager.stopServiceDiscovery(mDiscoveryListener);

}

public List getChosenServiceInfo() {

return ServicesAvailable;

}

public void discoverServices() {

mNsdManager.discoverServices(

SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener);

}

}

希望它这有助于

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android应用程序中搜索MDNS服务,可以使用Android网络框架中的Network Service Discovery(NSD)API。以下是搜索MDNS服务的一般步骤: 1. 创建NsdManager实例: ``` NsdManager nsdManager = (NsdManager) context.getSystemService(Context.NSD_SERVICE); ``` 2. 创建NsdManager.DiscoveryListener实例,并实现onDiscoveryStarted、onServiceFound、onServiceLost和onDiscoveryStopped等回调方法: ``` NsdManager.DiscoveryListener discoveryListener = new NsdManager.DiscoveryListener() { @Override public void onDiscoveryStarted(String regType) { // 发现服务 } @Override public void onServiceFound(NsdServiceInfo serviceInfo) { // 找到服务 } @Override public void onServiceLost(NsdServiceInfo serviceInfo) { // 丢失服务 } @Override public void onDiscoveryStopped(String serviceType) { // 停止搜索 } @Override public void onStartDiscoveryFailed(String serviceType, int errorCode) { // 开始搜索失败 } @Override public void onStopDiscoveryFailed(String serviceType, int errorCode) { // 停止搜索失败 } }; ``` 3. 创建NsdManager.ResolveListener实例,并实现onServiceResolved回调方法: ``` NsdManager.ResolveListener resolveListener = new NsdManager.ResolveListener() { @Override public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) { // 解析服务信息失败 } @Override public void onServiceResolved(NsdServiceInfo serviceInfo) { // 解析服务信息成功 } }; ``` 4. 开始搜索MDNS服务: ``` nsdManager.discoverServices("_http._tcp", NsdManager.PROTOCOL_DNS_SD, discoveryListener); ``` 其中,第一个参数是服务的类型,可以根据实际情况进行修改。第二个参数是协议类型,NSD API支持DNS-SD协议和mDNS协议,这里使用DNS-SD协议。第三个参数是DiscoveryListener实例。 5. 在onServiceFound回调方法中,获取到NsdServiceInfo实例,然后调用它的resolve方法解析服务信息: ``` nsdManager.resolveService(serviceInfo, resolveListener); ``` 其中,第一个参数是NsdServiceInfo实例,第二个参数是ResolveListener实例。 6. 在onServiceResolved回调方法中,获取到服务的IP地址和端口号等信息,然后可以使用它们来连接服务。 注意,搜索MDNS服务需要在AndroidManifest.xml中添加以下权限: ``` <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> ``` 同时,如果应用程序运行在Android 9.0及以上版本的设备上,则需要在AndroidManifest.xml中添加以下配置: ``` <application ... android:usesCleartextTraffic="true" ... > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值