【问题标题】:Android AVD unable to notice JmDNS servicesAndroid AVD 无法注意到 JmDNS 服务
【发布时间】:2012-03-27 23:31:47
【问题描述】:

我在让 JmDNS 与我的 Android AVD 一起工作时遇到了一些困难。我创建了 3 个应用程序。一个注册 ServiceListener 并记录任何活动的 Android 应用程序,一个与 android 应用程序执行相同操作的 Java 应用程序,以及另一个注册服务的 Java 应用程序。 Java 侦听器应用程序将接听其他 Java 应用程序,但 android 应用程序不会。我还尝试过同时运行两个 AVD 以查看它们是否会相互接收,而它们不会。我还应该提到我拥有 INTERNET 和 CHANGE_WIFI_MULSTICAST_STATE 的权限。这是我的代码:

Android 应用程序:

public class BonjourActivity extends Activity {

    // Multicast
    private WifiManager wifi;
    private MulticastLock lock;
    private JmDNS jmdns;
    private String type = "_im._tcp.local.";
    private ServiceListener listener;
    private ServiceInfo serviceInfo;

    // On Create
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Multicast
        wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        lock = wifi.createMulticastLock("");
        lock.setReferenceCounted(true);
        lock.acquire();

        // JmDNS
        new AsyncTask<Object, Object, Object>(){
            @Override
            protected Object doInBackground(Object... params) {
                // Create JmDNS
                try {
                    jmdns = JmDNS.create();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                return null;
            }
             protected void onPostExecute(Object result) {
                 // Add Listener
                 jmdns.addServiceListener(type, listener = new ServiceListener(){
                        @Override
                        public void serviceAdded(ServiceEvent ev) {
                            jmdns.requestServiceInfo(ev.getType(), ev.getName(), 1);
                        }
                        @Override
                        public void serviceRemoved(ServiceEvent ev) {
                            Log.d("Service", "Service Removed: " + ev.getName());
                        }
                        @Override
                        public void serviceResolved(ServiceEvent ev) {
                            Log.d("Service", "Service Resolved: " + ev.getInfo().getURL());
                        }
                    });
             }
        }.execute(); 
    }

    // On Destroy
    public void onDestroy(){
        // Release Lock
        if (lock != null){
            lock.release();
        }
        // Close JmDNS
        if (jmdns != null){
            jmdns.removeServiceListener(type, listener);
            try {
                jmdns.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        super.onDestroy();
    }
}

Java 侦听器应用程序:

public class Listener {

    private static JmDNS jmdns;
    private static String type = "_im._tcp.local.";
    private static ServiceListener serviceListener;
    private static ServiceInfo serviceInfo;

    // Main
    public static void main(String args[]){

        try {
            jmdns = JmDNS.create();
            jmdns.addServiceListener(type, serviceListener = new ServiceListener(){
                @Override
                public void serviceAdded(ServiceEvent ev) {
                    System.out.println("Service Added: " + ev.getName());
                    jmdns.requestServiceInfo(ev.getType(), ev.getName(), 1);
                }
                @Override
                public void serviceRemoved(ServiceEvent ev) {
                    System.out.println("Service Removed: " + ev.getName());
                }
                @Override
                public void serviceResolved(ServiceEvent ev) {
                    System.out.println("Service Resolved: " + ev.getInfo().getURL());
                }
            });
            System.out.println("Listener Added");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

Java 发送器应用程序:

public class Sender {

    private static JmDNS jmdns;
    private static String type = "_im._tcp.local.";
    private static ServiceListener serviceListener;
    private static ServiceInfo serviceInfo;

    // Main
    public static void main(String args[]){

        try {
            jmdns = JmDNS.create();
            serviceInfo = ServiceInfo.create(type, "Test IM Service", 55555, "Instant messaging test service");
            jmdns.registerService(serviceInfo);
            System.out.println("Sender: Service Created");
            new Timer().schedule(new TimerTask(){
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    System.out.println("Closing..");
                    jmdns.unregisterAllServices();
                    try {
                        jmdns.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.exit(0);
                }
            }, 10000);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

此外,当我尝试运行应用程序时,LogCat 会给我一些错误:

NetworkManagementSocketTagger setKernelCountSet(10009,0) 失败,错误码 -2

WifiStateMachine 错误!未处理的消息{ what=131157 when=-1ms }

可能有人知道为什么 android 应用程序无法接收其他应用程序生成的 JmDNS 服务吗?

【问题讨论】:

  • 将 jmdns.addServiceListener(... 代码块从 onPostExecute() 移至 doInBackground(),最好不要将监听器创建为内联匿名类。

标签: android service bonjour avd jmdns


【解决方案1】:

请注意,模拟器中运行的虚拟设备与计算机不在同一个网络中。服务发现可能不起作用。我的 jmdns 实现在模拟器中不起作用。在真实设备上试用。 并前往http://home.heeere.com/tech-androidjmdns.html了解更多详情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多