{"id":2973,"date":"2014-03-12T23:58:04","date_gmt":"2014-03-12T23:58:04","guid":{"rendered":"https:\/\/unknownerror.org\/index.php\/2014\/03\/12\/list-jmdns-services-in-android-app-collection-of-common-programming-errors-2\/"},"modified":"2014-03-12T23:58:04","modified_gmt":"2014-03-12T23:58:04","slug":"list-jmdns-services-in-android-app-collection-of-common-programming-errors-2","status":"publish","type":"post","link":"https:\/\/unknownerror.org\/index.php\/2014\/03\/12\/list-jmdns-services-in-android-app-collection-of-common-programming-errors-2\/","title":{"rendered":"List JmDNS Services in Android App-Collection of common programming errors"},"content":{"rendered":"<ul>\n<li><img decoding=\"async\" src=\"http:\/\/www.gravatar.com\/avatar\/b66c479cd8053b791b5266f29407c817?s=32&amp;d=identicon&amp;r=PG\" \/><br \/>\nuser268397<\/p>\n<p>I&#8217;m trying to list some JmDNS services that I discover in my Android app and whenever I call this method my app crashes in the emulator? I tried commenting out blocks of code and code inside methods and it still crashes on the emulator. Anybody have any ideas?<\/p>\n<pre><code>import java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.ScheduledExecutorService;\nimport java.util.concurrent.TimeUnit;\n\nimport javax.jmdns.JmDNS;\nimport javax.jmdns.ServiceInfo;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.net.ConnectivityManager;\nimport android.net.NetworkInfo.State;\nimport android.net.wifi.WifiInfo;\nimport android.net.wifi.WifiManager;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.os.Message;\nimport android.util.Log;\nimport android.view.View;\nimport android.widget.AdapterView;\nimport android.widget.Button;\nimport android.widget.ListAdapter;\nimport android.widget.ListView;\nimport android.widget.SimpleAdapter;\nimport android.widget.Toast;\n\n\n\/**\n * The main activity, which list the available services in the local network.\n * \n *\/\npublic class ConnectActivity extends Activity {\n\nprivate final static String LOG_TAG = ConnectActivity.class.getSimpleName();\n\n\/\/ ===================View Models===================\n\/\/ The view model of the service info list\nprivate List serviceInfoList = new ArrayList();\n\nprivate ServiceServer server = null;\n\n\/** Called when the activity is first created. *\/\n@Override\npublic void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n    setContentView(R.layout.connect);\n\n    this.initViewModels();\n    this.initEventHandlers();\n\n    this.initMockData();\n\n    if (!checkWifiStatus()) {\n        \/\/ this.showToast(\"No wifi network!\");\n    }\n\n    server = new ServiceServer(\"Whooznear\");\n    int startedPort = server.start();\n    Log.i(LOG_TAG, \"Started at \" + startedPort);\n\n\n    ScheduledExecutorService scheduleTaskExecutor = Executors.newScheduledThreadPool(5);\n\n    \/\/ This schedule a runnable task every second\n    scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {\n      public void run() {\n        \/\/Put Thread Code Here\n        \/\/refreshServices();\n      }\n    }, 0, 1, TimeUnit.SECONDS);\n\n\n}\n\nprivate void refreshServices() {\n    new Thread(new Runnable() {\n        public void run() {\n            Log.i(LOG_TAG, \"refresh services...\");\n\n            testUpdateService();\n\n            JmDNS registry = null;\n            try {\n                registry = JmDNS.create();\n\n                List enabledServices = LocalEnvironment\n                        .getEnabledServices(ConnectActivity.this);\n                for (String serviceName : enabledServices) {\n                    String serviceType = LocalEnvironment\n                            .getServiceTypeByTitle(serviceName);\n                    Log.i(LOG_TAG, \"Register service...\" + serviceType);\n\n                    String text = \"Test service\";\n                    Map properties = new HashMap();\n                    properties.put(\"srvname\", text.getBytes());\n                    ServiceInfo service = ServiceInfo.create(serviceType,\n                            \"apache-someuniqueid\", 80, 0, 0, true,\n                            properties);\n\n                    registry.registerService(service);\n                    Log.i(LOG_TAG, \"List service...\" + service.getType());\n                    final ServiceInfo[] services = registry.list(service\n                            .getType());\n                    Log.i(LOG_TAG, services.length + \" services (\"\n                            + serviceType + \") is found.\");\n                    ConnectActivity.this.runOnUiThread(new Runnable() {\n                        public void run() {\n                            for (ServiceInfo service : services) {\n                                serviceInfoList\n                                        .add(new ServiceInfoViewModel(service));\n                            }\n                            notifyServiceListChanged();\n                        }\n                    });\n                }\n            } catch (Exception ex) {\n                ex.printStackTrace();\n                Log.e(LOG_TAG, ex.toString());\n            }\n        }\n    }).start();\n}\n\nprivate void onRefreshButtonClicked(View source) {\n    this.showToast(\"Clicked \" + ((Button) source).getText());\n    this.refreshServices();\n}\n\n\/*private void onSettingsButtonClicked(View source) {\n    Intent intent = new Intent();\n    intent.setClass(this, SettingsActivity.class);\n    this.startActivityForResult(intent, RESULT_OK);\n}*\/\n\nprivate void onServiceListItemSelected(AdapterView arg0, View arg1,\n        int arg2, long arg3) {\n    ServiceInfoViewModel selectedService = serviceInfoList.get(arg2);\n    Log.i(LOG_TAG, \"Selected service at \" + selectedService.getServiceIp());\n    Intent intent = new Intent();\n    intent.putExtra(\"ServiceName\", selectedService.getServiceName());\n    intent.putExtra(\"ServiceAddress\", selectedService.getServiceIp());\n    intent.setClass(this, ProfileActivity.class);\n    this.startActivityForResult(intent, RESULT_OK);\n}\n\n@Override\nprotected void onActivityResult(int requestCode, int resultCode, Intent data) {\n    \/\/ TODO Auto-generated method stub\n    switch (resultCode) {\n    case RESULT_OK:\n        break;\n    default:\n        break;\n    }\n}\n\nprivate void initViewModels() {\n    ListView servicesListView = (ListView) this\n            .findViewById(R.id.servicesListView);\n    ListAdapter servicesListAdapter = new SimpleAdapter(this,\n            serviceInfoList, android.R.layout.simple_list_item_2,\n            new String[] { \"serviceName\", \"serviceDesc\" }, new int[] {\n                    android.R.id.text1, android.R.id.text2 });\n    servicesListView.setAdapter(servicesListAdapter);\n}\n\n\/**\n * Initialize the event handlers\n *\/\nprivate void initEventHandlers() {\n    \/\/ Service List View\n    ListView servicesListView = (ListView) this\n            .findViewById(R.id.servicesListView);\n    servicesListView\n            .setOnItemClickListener(new AdapterView.OnItemClickListener() {\n                public void onItemClick(AdapterView arg0, View arg1,\n                        int arg2, long arg3) {\n                    onServiceListItemSelected(arg0, arg1, arg2, arg3);\n                }\n            });\n\n    \/\/ Refresh Button\n    \/*Button refreshButton = (Button) this\n            .findViewById(R.id.refreshServiceButton);\n    refreshButton.setOnClickListener(new Button.OnClickListener() {\n        public void onClick(View source) {\n            onRefreshButtonClicked(source);\n        }\n    });*\/\n\n    \/\/ Settings Button\n    \/*Button settingsButton = (Button) this\n            .findViewById(R.id.appSettingsButton);\n    settingsButton.setOnClickListener(new Button.OnClickListener() {\n        public void onClick(View source) {\n            onSettingsButtonClicked(source);\n        }\n    });*\/\n}\n\nprivate void initMockData() {\n}\n\nprivate boolean checkWifiStatus() {\n    try {\n        ConnectivityManager conMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); \/\/ Network\n        State wifiState = conMan.getNetworkInfo(\n                ConnectivityManager.TYPE_WIFI).getState();\n\n        WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);\n        WifiInfo info = wifi.getConnectionInfo();\n        Log.i(LOG_TAG, \"IP Address:\" + info.getIpAddress());\n        LocalEnvironment.LocalIPAddress = info.getIpAddress();\n        LocalEnvironment.LocalIdentity = info.getMacAddress();\n\n        return wifiState == State.CONNECTED;\n    } catch (Exception ex) {\n        Log.e(this.getClass().getName(), \"Check Wifi Status Failed!\", ex);\n        this.showToast(ex.toString());\n        return false;\n    }\n\n}\n\nprivate void notifyServiceListChanged() {\n    ListView servicesListView = (ListView) this\n            .findViewById(R.id.servicesListView);\n    ((SimpleAdapter) servicesListView.getAdapter()).notifyDataSetChanged();\n}\n\nprivate void testUpdateService() {\n    String text = \"Test hypothetical web server\";\n    Map properties = new HashMap();\n    properties.put(\"srvname\", text.getBytes());\n    ServiceInfo service = ServiceInfo.create(\"_html._tcp.local.\",\n            \"apache-someuniqueid\", 80, 0, 0, true, properties);\n    JmDNS registry = null;\n    Exception occuredEx = null;\n    int serviceCount = 0;\n    try {\n        registry = JmDNS.create();\n        registry.registerService(service);\n\n        ServiceInfo[] services = registry.list(service.getType());\n\n        serviceCount = services.length;\n        Log.d(LOG_TAG, serviceCount + \" services found\");\n    } catch (IOException ex) {\n        this.showToast(ex.toString());\n        occuredEx = ex;\n    } finally {\n        if (registry != null) {\n            try {\n                registry.close();\n            } catch (IOException ex) {\n                this.showToast(ex.toString());\n                occuredEx = ex;\n            }\n        }\n    }\n}\n\nprivate void showToast(String text) {\n    Toast.makeText(this, text, Toast.LENGTH_SHORT).show();\n}\n\nprivate void showToast(int id) {\n    ListView servicesListView = (ListView) this\n            .findViewById(R.id.servicesListView);\n\n    Toast.makeText(this, servicesListView.getItemAtPosition(id).toString(),\n            Toast.LENGTH_SHORT).show();\n}\n}\n<\/code><\/pre>\n<p>This is the code I&#8217;m using to call the method above:<\/p>\n<pre><code>Intent myIntent = new Intent(ProfileActivity.this, ConnectActivity.class);\nProfileActivity.this.startActivity(myIntent);\n<\/code><\/pre>\n<p>Here is the stack trace:<\/p>\n<pre><code>01-09 23:42:39.951: E\/com.whooznear.android.ConnectActivity(1532): Check Wifi Status Failed!\n01-09 23:42:39.951: E\/com.whooznear.android.ConnectActivity(1532): java.lang.SecurityException: ConnectivityService: Neither user 10036 nor current process has android.permission.ACCESS_NETWORK_STATE.\n01-09 23:42:39.951: E\/com.whooznear.android.ConnectActivity(1532):  at android.os.Parcel.readException(Parcel.java:1321)\n01-09 23:42:39.951: E\/com.whooznear.android.ConnectActivity(1532):  at android.os.Parcel.readException(Parcel.java:1275)\n01-09 23:42:39.951: E\/com.whooznear.android.ConnectActivity(1532):  at android.net.IConnectivityManager$Stub$Proxy.getNetworkInfo(IConnectivityManager.java:469)\n01-09 23:42:39.951: E\/com.whooznear.android.ConnectActivity(1532):  at android.net.ConnectivityManager.getNetworkInfo(ConnectivityManager.java:264)\n01-09 23:42:39.951: E\/com.whooznear.android.ConnectActivity(1532):  at com.whooznear.android.ConnectActivity.checkWifiStatus(ConnectActivity.java:214)\n01-09 23:42:39.951: E\/com.whooznear.android.ConnectActivity(1532):  at com.whooznear.android.ConnectActivity.onCreate(ConnectActivity.java:60)\n01-09 23:42:39.951: E\/com.whooznear.android.ConnectActivity(1532):  at android.app.Activity.performCreate(Activity.java:4397)\n01-09 23:42:39.951: E\/com.whooznear.android.ConnectActivity(1532):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)\n01-09 23:42:39.951: E\/com.whooznear.android.ConnectActivity(1532):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1779)\n01-09 23:42:39.951: E\/com.whooznear.android.ConnectActivity(1532):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831)\n01-09 23:42:39.951: E\/com.whooznear.android.ConnectActivity(1532):  at android.app.ActivityThread.access$500(ActivityThread.java:122)\n01-09 23:42:39.951: E\/com.whooznear.android.ConnectActivity(1532):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1024)\n01-09 23:42:39.951: E\/com.whooznear.android.ConnectActivity(1532):  at android.os.Handler.dispatchMessage(Handler.java:99)\n01-09 23:42:39.951: E\/com.whooznear.android.ConnectActivity(1532):  at android.os.Looper.loop(Looper.java:132)\n01-09 23:42:39.951: E\/com.whooznear.android.ConnectActivity(1532):  at android.app.ActivityThread.main(ActivityThread.java:4123)\n01-09 23:42:39.951: E\/com.whooznear.android.ConnectActivity(1532):  at java.lang.reflect.Method.invokeNative(Native Method)\n01-09 23:42:39.951: E\/com.whooznear.android.ConnectActivity(1532):  at java.lang.reflect.Method.invoke(Method.java:491)\n01-09 23:42:39.951: E\/com.whooznear.android.ConnectActivity(1532):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)\n01-09 23:42:39.951: E\/com.whooznear.android.ConnectActivity(1532):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)\n01-09 23:42:39.951: E\/com.whooznear.android.ConnectActivity(1532):  at dalvik.system.NativeStart.main(Native Method)\n01-09 23:42:39.991: I\/ServiceServer(1532): java.net.SocketException: Permission denied\n01-09 23:42:40.032: I\/ConnectActivity(1532): Started at -1\n01-09 23:42:40.041: W\/dalvikvm(1532): threadid=9: thread exiting with uncaught exception (group=0x40    014760)\n01-09 23:42:40.071: E\/AndroidRuntime(1532): FATAL EXCEPTION: Thread-12\n01-09 23:42:40.071: E\/AndroidRuntime(1532): java.lang.NullPointerException\n01-09 23:42:40.071: E\/AndroidRuntime(1532):     at com.whooznear.android.ServiceServer.serverThreadProc(ServiceServer.java:61)\n01-09 23:42:40.071: E\/AndroidRuntime(1532):     at com.whooznear.android.ServiceServer.access$0(ServiceServer.java:57)\n01-09 23:42:40.071: E\/AndroidRuntime(1532):     at com.whooznear.android.ServiceServer$1.run(ServiceServer.java:52)\n01-09 23:42:40.693: D\/dalvikvm(1532): GC_CONCURRENT freed 416K, 7% free 7200K\/7687K, paused 6ms+27ms\n01-09 23:42:41.041: E\/com.whooznear.android.ConnectActivity(1532): Check Wifi Status Failed!\n01-09 23:42:41.041: E\/com.whooznear.android.ConnectActivity(1532): java.lang.SecurityException: ConnectivityService: Neither user 10036 nor current process has android.permission.ACCESS_NETWORK_STATE.\n01-09 23:42:41.041: E\/com.whooznear.android.ConnectActivity(1532):  at android.os.Parcel.readException(Parcel.java:1321)\n01-09 23:42:41.041: E\/com.whooznear.android.ConnectActivity(1532):  at android.os.Parcel.readException(Parcel.java:1275)\n01-09 23:42:41.041: E\/com.whooznear.android.ConnectActivity(1532):  at android.net.IConnectivityManager$Stub$Proxy.getNetworkInfo(IConnectivityManager.java:469)\n01-09 23:42:41.041: E\/com.whooznear.android.ConnectActivity(1532):  at android.net.ConnectivityManager.getNetworkInfo(ConnectivityManager.java:264)\n01-09 23:42:41.041: E\/com.whooznear.android.ConnectActivity(1532):  at com.whooznear.android.ConnectActivity.checkWifiStatus(ConnectActivity.java:214)\n01-09 23:42:41.041: E\/com.whooznear.android.ConnectActivity(1532):  at com.whooznear.android.ConnectActivity.onCreate(ConnectActivity.java:60)\n01-09 23:42:41.041: E\/com.whooznear.android.ConnectActivity(1532):  at android.app.Activity.performCreate(Activity.java:4397)\n01-09 23:42:41.041: E\/com.whooznear.android.ConnectActivity(1532):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)\n01-09 23:42:41.041: E\/com.whooznear.android.ConnectActivity(1532):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1779)\n01-09 23:42:41.041: E\/com.whooznear.android.ConnectActivity(1532):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831)\n01-09 23:42:41.041: E\/com.whooznear.android.ConnectActivity(1532):  at android.app.ActivityThread.access$500(ActivityThread.java:122)\n01-09 23:42:41.041: E\/com.whooznear.android.ConnectActivity(1532):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1024)\n01-09 23:42:41.041: E\/com.whooznear.android.ConnectActivity(1532):  at android.os.Handler.dispatchMessage(Handler.java:99)\n01-09 23:42:41.041: E\/com.whooznear.android.ConnectActivity(1532):  at android.os.Looper.loop(Looper.java:132)\n01-09 23:42:41.041: E\/com.whooznear.android.ConnectActivity(1532):  at android.app.ActivityThread.main(ActivityThread.java:4123)\n01-09 23:42:41.041: E\/com.whooznear.android.ConnectActivity(1532):  at java.lang.reflect.Method.invokeNative(Native Method)\n01-09 23:42:41.041: E\/com.whooznear.android.ConnectActivity(1532):  at java.lang.reflect.Method.invoke(Method.java:491)\n01-09 23:42:41.041: E\/com.whooznear.android.ConnectActivity(1532):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)\n01-09 23:42:41.041: E\/com.whooznear.android.ConnectActivity(1532):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)\n01-09 23:42:41.041: E\/com.whooznear.android.ConnectActivity(1532):  at dalvik.system.NativeStart.main(Native Method)\n01-09 23:42:41.151: I\/ServiceServer(1532): java.net.SocketException: Permission denied\n01-09 23:44:09.541: I\/ActivityThread(1575): Pub com.whooznear.android: com.whooznear.android.ProfileProvider\n01-09 23:44:10.054: D\/dalvikvm(1575): GC_FOR_ALLOC freed 40K, 4% free 6337K\/6595K, paused 247ms\n01-09 23:44:10.112: I\/dalvikvm-heap(1575): Grow heap (frag case) to 6.805MB for 588816-byte allocation\n01-09 23:44:10.422: D\/dalvikvm(1575): GC_FOR_ALLOC freed 8K, 4% free 6903K\/7175K, paused 265ms\n01-09 23:44:10.791: D\/dalvikvm(1575): GC_CONCURRENT freed<\/code><\/pre>\n<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>user268397 I&#8217;m trying to list some JmDNS services that I discover in my Android app and whenever I call this method my app crashes in the emulator? I tried commenting out blocks of code and code inside methods and it still crashes on the emulator. Anybody have any ideas? import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-2973","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/unknownerror.org\/index.php\/wp-json\/wp\/v2\/posts\/2973","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/unknownerror.org\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/unknownerror.org\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/unknownerror.org\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/unknownerror.org\/index.php\/wp-json\/wp\/v2\/comments?post=2973"}],"version-history":[{"count":0,"href":"https:\/\/unknownerror.org\/index.php\/wp-json\/wp\/v2\/posts\/2973\/revisions"}],"wp:attachment":[{"href":"https:\/\/unknownerror.org\/index.php\/wp-json\/wp\/v2\/media?parent=2973"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/unknownerror.org\/index.php\/wp-json\/wp\/v2\/categories?post=2973"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/unknownerror.org\/index.php\/wp-json\/wp\/v2\/tags?post=2973"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}