Tôi đang cố gắng chạy một ứng dụng bằng Android Native Service Discovery nhưng đôi khi khi tôi chạy ứng dụng, nó không phát hiện tất cả các dịch vụ từ mạng của tôi. Tôi đang chạy mã từ https://github.com/joeluchoa/nsd bằng cách sử dụng bốn mối quan hệ thiên hà và hầu hết thời gian mỗi người trong số họ khám phá số lượng dịch vụ khác nhau cùng một lúc.Android NSD không phát hiện tất cả các dịch vụ
Về cơ bản tôi chạy một dịch vụ với một ServerSocket:
ServerSocket server = new ServerSocket(0);
Log.i(TAG, "IP " + server.getInetAddress()
+ ", running on port " + server.getLocalPort());
Intent intent = new Intent(MySocket.this,
MyPresence.class);
intent.putExtra("PORT", server.getLocalPort());
startService(intent);
Sau đó, tôi phát hành nó bằng cách sử dụng phương pháp registerService từ NsdManager:
NsdServiceInfo serviceInfo = new NsdServiceInfo();
serviceInfo.setServiceName(Build.SERIAL + "-" + new Date().getTime());
serviceInfo.setServiceType(SERVICE_TYPE);
serviceInfo.setPort(port);
mNsdManager.registerService(serviceInfo, NsdManager.PROTOCOL_DNS_SD,
mRegistrationListener);
Để khám phá các dịch vụ tôi sử dụng discoverServices phương pháp từ NsdManager:
mNsdManager.discoverServices(SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD,
mDiscoveryListener);
Với mDiscoveryListener như sau:
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");
Log.d(TAG, String.format("%s %s %s %d",
service.getServiceName(), service.getServiceType(),
service.getHost(), service.getPort()));
if (!service.getServiceType().contains(SERVICE_TYPE)) {
Log.d(TAG,
"Unknown Service Type: " + service.getServiceType());
} else if (service.getServiceName().equals(mServiceName)) {
Log.d(TAG, "Same machine: " + mServiceName);
} else {
mNsdManager.resolveService(service, mResolveListener);
}
}
@Override
public void onServiceLost(NsdServiceInfo service) {
Log.e(TAG, "service lost" + service);
}
@Override
public void onDiscoveryStopped(String serviceType) {
Log.i(TAG, serviceType + " Discovery stopped: " + serviceType);
}
@Override
public void onStartDiscoveryFailed(String serviceType, int errorCode) {
Log.e(TAG, serviceType + " Discovery failed: Error code:"
+ errorCode);
mNsdManager.stopServiceDiscovery(this);
}
@Override
public void onStopDiscoveryFailed(String serviceType, int errorCode) {
Log.e(TAG, serviceType + " Discovery failed: Error code:"
+ errorCode);
mNsdManager.stopServiceDiscovery(this);
}
};
Tôi đang làm gì sai? Có ai biết một giải pháp hoặc một workaround cho điều này?
tôi camer acros bài của bạn trong khi cố gắng để sửa chữa một NPE mà dường như bật lên khi tôi có hai thiết bị trong mạng với cùng thông tin NSD ... Vì vậy, tôi không' t có một câu trả lời cho bạn, nhưng tôi nhận thấy rằng bạn đang cố gắng để có được thông tin mà bạn đã không giải quyết trong báo cáo đăng nhập của bạn. –
nó là một thực tế phổ biến cho tất cả các nhà phát triển để làm theo đó bằng cách thử bắt hoặc in ra tất cả các biến để tìm ra các lỗi –
bạn chỉ khám phá các dịch vụ của SERVICE_TYPE, trong ví dụ này là http máy chủ web. –