Android网络服务发现示例Nsdchat无法正常工作

时间:2015-07-05 05:54:35

标签: android network-service nsd

我正在尝试官方的android NSDchat示例,以便在连接到同一个wifi网络的两个Android手机之间进行通信。 将项目导入eclipse之后,我只将目标sdk更改为api级别22而不是16级。我在各种设备上尝试了应用程序,例如带有api 18的samsung设备,带有api 21的htc设备,带有api 21等的asus设备等等适用于其中一些并且不能在其他设备上工作,它也会在不同设备上产生不同的错误。 运行代码时出现空指针异常,当我重新启动设备时,错误就消失了。 也 难道演示应用程序不支持更高的api级别,或者在运行之前是否应该对该代码进行任何更改?

3 个答案:

答案 0 :(得分:7)

如果您从Android开发者网站下载了NsdChat示例项目(即ImageIO.read(getClass().getClassLoader().getResourceAsStream("troll.png")); 或其他内容),则该项目代码可能已过期。

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

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分: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 个字符。 通过这种方式,您可以更改找到的服务中第二台机器的名称

相关问题