我正在尝试官方的android NSDchat示例,以便在连接到同一个wifi网络的两个Android手机之间进行通信。 将项目导入eclipse之后,我只将目标sdk更改为api级别22而不是16级。我在各种设备上尝试了应用程序,例如带有api 18的samsung设备,带有api 21的htc设备,带有api 21等的asus设备等等适用于其中一些并且不能在其他设备上工作,它也会在不同设备上产生不同的错误。 运行代码时出现空指针异常,当我重新启动设备时,错误就消失了。 也 难道演示应用程序不支持更高的api级别,或者在运行之前是否应该对该代码进行任何更改?
答案 0 :(得分:7)
如果您从Android开发者网站下载了NsdChat示例项目(即ImageIO.read(getClass().getClassLoader().getResourceAsStream("troll.png"));
或其他内容),则该项目代码可能已过期。
尝试使用主分支上的最新代码...您可以将其复制并粘贴到here的示例项目中。
答案 1 :(得分:2)
是的,但是不是很简单。要连接两个设备,您需要按以下顺序执行以下操作:
然后您就可以正常开始发送消息了。
主要,您需要确保两个设备都注册了该服务。这是因为此玩具示例处理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 个字符。 通过这种方式,您可以更改找到的服务中第二台机器的名称