30

Android アプリに bonjour/zero conf を実装しようとしています。利用可能なすべてのデバイスを検索するために jmDns ライブラリを使用しています。同じネットワーク内のデバイスを検索するために使用しているコードは次のとおりです。

public class ListDevices extends ListActivity {
    JmDNS jmdns;
    JmDNSImpl impl;
    MulticastLock lock;
    protected ServiceListener listener;
    protected ServiceInfo info;
    public ListView lv;
    public ArrayList<String> deviceList;
    public int cancel = 0;
    public final static String TAG = "ListDevices";

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        deviceList = new ArrayList<String>();
        showAllPrinters();

        setListAdapter(new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, deviceList));

        lv = getListView();
        lv.setTextFilterEnabled(true);

        lv.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // When clicked, show a toast with the TextView text
                Toast.makeText(getApplicationContext(),
                       ((TextView) view).getText(), Toast.LENGTH_SHORT).show();
            }
        });
        this.listener = new ServiceListener() {
            public void serviceAdded(ServiceEvent event) {
                deviceList.add("Service added   : " + event.getName() + "."
                        + event.getType());
                Log.v(TAG, "Service added   : " + event.getName() + "."
                        + event.getType());
            }

            public void serviceRemoved(ServiceEvent event) {
                deviceList.add("Service removed : " + event.getName() + "."
                        + event.getType());
                Log.v(TAG, "Service removed : " + event.getName() + "."
                        + event.getType());
            }

            public void serviceResolved(ServiceEvent event) {
                deviceList.add("Service resolved: " + event.getInfo());
                Log.v(TAG, "Service resolved: " + event.getInfo());
            }
        };
    }

    public void showAllPrinters() {
        Log.d("ListDevices", "in showAllPrinters");
        try {

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

            InetAddress inetAddress = getLocalIpAddress();
            jmdns = JmDNS.create(inetAddress, "TEST");

            ServiceInfo[] infos = jmdns.list("_http._tcp.local.");

            if (infos != null && infos.length > 0) {
                for (int i = 0; i < infos.length; i++) {
                    deviceList.add(infos[i].getName());
                }
            } else {
                deviceList.add("No device found.");
            }
            impl = (JmDNSImpl) jmdns;

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public InetAddress getLocalIpAddress() {
        try {
            for (Enumeration<NetworkInterface> en = NetworkInterface
                    .getNetworkInterfaces(); en.hasMoreElements();) {
                NetworkInterface intf = (NetworkInterface) en.nextElement();
                for (Enumeration<InetAddress> enumIpAddr = intf
                        .getInetAddresses(); enumIpAddr.hasMoreElements();) {
                    InetAddress inetAddress = (InetAddress) enumIpAddr
                            .nextElement();
                    if (!inetAddress.isLoopbackAddress()) {
                        return inetAddress;
                    }
                }
            }
        } catch (SocketException ex) {
            Log.e("ListDevices", ex.toString());
        }
        return null;
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (isFinishing()) {
            lock.release();
        }
    }
}

基本的に、利用可能なすべてのデバイスのリストを表示できるように、それらをリストに追加しています。このコードを実行すると、例外やエラーのようなものは発生しません。しかし一方で、私のリストには何も追加されていません [PS: ネットワークには少なくとも 5 ~ 6 台の PC と Mac があります。

また、このコードからリストを取得しようとしました:

jmdns.addServiceListener("_http._tcp.local.", listener);

listenerアクティビティの で定義されonCreateます。しかし、これもデバイスを返しませんでした。

私がここで間違っていることを提案してください。どんな助けでも大歓迎です!

4

5 に答える 5

19

Android 4.1 は、Bonjour スタックをさまざまな用語でまとめているように見えるNetwork Service Discoveryを追加します。また、 DNS-SD (および UPnP?) を直接公開するandroid.net.wifi.p2p.WifiP2pManagerという下位レベルの API も確認できます。

基礎となる mDNSResponder デーモンは常に実行されているわけではなく、現在私が知る限り、システム全体の DNS ルックアップ (ブラウザーなどから) には使用されていないことに注意してください。

于 2012-10-30T20:28:00.980 に答える
5

コードに関して具体的なヘルプを提供することはできませんが、少なくとも一部のハンドセットと (私が信じている) エミュレーターで、Android と mDNS に問題があることは確かです。

詳細はこちら:

http://rgladwell.wordpress.com/2010/04/18/gotchas-android-and-multicast-dns/

于 2011-01-11T10:31:47.960 に答える
4

電話でマルチキャストが有効になっていることを知っていますか? http://home.heeere.com/tech-androidjmdns.htmlを参照してください。

また、「_http.tcp」サービスの代わりに「_ipp._tcp.local」(または類似のもの) を探す必要があります。しかし、それはテスト用ですよね?:-)

于 2011-08-11T09:22:04.437 に答える
4

上記のコメントで述べたように、ネイティブの Android サポートは機能していないか、完全に実装されていないため、TXT レコードを取得できません (Android v5.1 以降)。また、jmDns ライブラリを検出のために機能させることもできませんでした。私はついにmdnsjava プロジェクトを見つけましたが、それは私にとって非常に簡単に機能しました。そのサンプル コードは正しくないことに注意してください。すべての IPP プリンターを同期的に検索するために使用したコードのサンプルを次に示します。

    String type[] = {"_ipp._tcp.local."};
    Lookup resolve = null;
    try {
        resolve = new Lookup(type, Type.ANY, DClass.IN);
        ServiceInstance[] records = resolve.lookupServices();
        for (ServiceInstance record : records) {
            Log.d(TAG, record.toString());
            Map txtMap = record.getTextAttributes();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

また、 dnsjava ライブラリを libs フォルダーと build.gradleに追加する必要があることにも注意してください。バージョン 2.1.7 を使用しました。

于 2015-08-06T20:53:16.870 に答える
3

Android の Play ストアにある既存のツールを使用して、最初にローカル ネットワークをスキャンし、スキャンしたいサービスがあることを確認します。次に、jmDNS キーワードをチェックして、ネットワークをスキャンできます。

ただし、一部の Android 4.x デバイスでは jmDns が機能しないという既知の問題があります。

于 2014-06-11T19:12:53.373 に答える