6

我正在尝试使用官方的 android NSDchat 示例在连接到同一个 wifi 网络的两部 android 手机之间进行通信。将项目导入 Eclipse 后,我只将目标 sdk 更改为 api 级别 22 而不是 16。我在各种设备上尝试了该应用程序,如 api 18 的三星设备、api 21 的 htc 设备、api 21 的华硕设备等。对其中一些有效,对另一些无效,而且它在不同的设备上给出不同的错误。运行代码时出现空指针异常,当我重新启动设备时,错误消失了。此外,演示应用程序是否不支持更高的 api 级别,或者在运行之前是否应该对该代码进行任何更改?

4

3 回答 3

9

如果您从 Android 开发者网站下载了 NsdChat 示例项目(即NsdChat.zip或类似的内容),则该项目代码可能已过时。

尝试使用 master 分支上的最新代码...您可以从此处将其复制并粘贴到您的示例项目中。

于 2016-01-31T00:21:39.933 回答
3

是的,它有效,但它并不简单。要连接两个设备,您需要按此顺序执行以下操作:

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

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

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

于 2018-07-13T00:17:02.690 回答
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 个字符。通过这种方式,您可以更改找到的服务上的第二台机器的名称

于 2021-05-31T07:14:18.517 回答