Android网络服务发现示例Nsdchat不起作用

7
我正在尝试使用官方的Android NSDchat示例,在连接到相同的WiFi网络的两个Android手机之间进行通信。 将项目导入Eclipse后,我只将目标SDK更改为API级别22,而不是16。我在各种设备上尝试了该应用程序,例如具有API 18的三星设备、具有API 21的HTC设备、具有API 21的华硕设备等。它在某些设备上运行正常,而在其他设备上则无法正常工作,并且在不同的设备上会产生不同的错误。 在运行代码时,我遇到了空指针异常,当我重新启动设备时,错误消失了。 此外, 是因为演示应用程序不支持更高的API级别,还是在运行之前应该对代码进行任何更改?
3个回答

9
如果您从Android Developers网站下载了NsdChat示例项目(例如NsdChat.zip或类似文件),那么该项目代码可能已过时。请尝试使用master分支上的最新代码... 您可以从这里复制并粘贴到您的示例项目中。

1
不知道这个。看起来代码中有相当多微妙的差异。 - Daniel Wilson
1
它有用吗?我正在尝试同样的库,但似乎无法连接两个设备。 - vipul mittal
1
我在4个不同的设备上测试了NsdChat,但是对等设备从未被定位。三星S5迷你版,Xperia Z3迷你版,Xperia Z1迷你版,LG G4。 - bremen_matt

3

是的,它可以工作,但并不直接。要连接两个设备,您需要按照以下顺序执行以下操作:

  1. 在设备1上单击注册
  2. 在设备2上单击注册
  3. 等待5秒钟,然后在设备1上单击发现
  4. 再等待5秒钟,然后在设备1上单击连接

然后您就可以正常发送消息了。

主要需要确保两个设备都注册了该服务。这是因为这个玩具示例处理onServiceFound()回调的方式。它认为如果服务的名称与用于注册它的名称完全相同(即NsdChat),则意味着它是本地实例。因此,当您使用相同的服务名称注册第二个设备时,NSD会分配一个不同的名称(NsdChat(1)),该名称被视为可连接的有效远程服务。 这个玩具示例实际上只是一个起点,我认为它很适合学习NSD的基础知识,但不能像现在这样使用。


1
对我来说,它在一个设备上可以工作,但另一个设备无法发送。 - Themelis

1
这对我有效:

        @Override
        public void onServiceFound(NsdServiceInfo service) {
            
            if(mServiceName.length()==7)mServiceName=mServiceName.substring(0,mServiceName.length()-1);
            
            Toast.makeText(mContext,"msg "+mServiceName, Toast.LENGTH_SHORT).show();
            Log.d(TAG, "Service discovery success" + 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)){
                mNsdManager.resolveService(service, mResolveListener);
            }
        }

mServiceName="NsdChat"有7个字符。 这样您就可以更改找到的服务上第二台机器的名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接