miatech
miatech

Reputation: 2268

how to get hostname from android device

I'm implementing a method that gets the hostname of android device. I'm using InetAddress class for this. however, I'm getting fatal exception. Here's the method. I added a try/catch block, but still not working. Any help appreciated. Edited and added exception error

/**
     * getHostname returns the hostname of android device as string
     *
     * @param context
     * @return hostname
     */

    public String getHostname(Context context) {
        String hostName;
        try {
            InetAddress netHost = InetAddress.getLocalHost();
            hostName = netHost.getHostName();
        } catch (UnknownHostException ex) {
            hostName = null;
        }

        return hostName;
    }

fatal exception

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.george.droidnet, PID: 23439
                  java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.george.droidnet/com.example.george.droidnet.TcpConfigActivity}: android.os.NetworkOnMainThreadException
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
                      at android.app.ActivityThread.-wrap11(ActivityThread.java)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                      at android.os.Handler.dispatchMessage(Handler.java:102)
                      at android.os.Looper.loop(Looper.java:148)
                      at android.app.ActivityThread.main(ActivityThread.java:5417)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                   Caused by: android.os.NetworkOnMainThreadException
                      at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
                      at java.net.InetAddress.lookupHostByName(InetAddress.java:431)
                      at java.net.InetAddress.getLocalHost(InetAddress.java:409)
                      at com.example.george.droidnet.TcpConfigActivity.getHostname(TcpConfigActivity.java:100)
                      at com.example.george.droidnet.TcpConfigActivity.onCreate(TcpConfigActivity.java:40)
                      at android.app.Activity.performCreate(Activity.java:6237)
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
                      at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:148) 
                      at android.app.ActivityThread.main(ActivityThread.java:5417) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Upvotes: 0

Views: 9401

Answers (3)

Tom Rutchik
Tom Rutchik

Reputation: 1692

AsyncTask was deprepicate in API 30

Here's a kotlin solution:

            StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.Builder().permitAll().build())
            val t = Thread() {
                val x = InetAddress.getLocalHost()
                println (x)
            }.run()

Notice that you also need to set a ThreadPolicy in order to run this code.

This code works, but it really doesn't solve the intent of the posted question, because the hostname you get from using this method is "localhost".

Upvotes: 0

CodeBr3akerSon
CodeBr3akerSon

Reputation: 33

Man, in Java you can't "do network things" on main thread. To do it, you have to put it into AsyncTask, like this:

public String getHostName() {
    AsyncTack<Void, Void, String> task = new AsyncTask<Void, Void, String>() {
        @Override
        protected Void doInBackground(Void... voids) {
            String hostName;
            try {
                InetAddress netHost = InetAddress.getLocalHost();
                hostName = netHost.getHostName();
            } catch (UnknownHostException ex) {
                hostName = null;
            }

            return hostName;
        }
    };

    task.execute();
    try {
        return task.get();
    } catch (Exception e) {
        return null;
    }
}

This code should work.

Upvotes: 1

Diego Torres Milano
Diego Torres Milano

Reputation: 69189

Caused by: android.os.NetworkOnMainThreadException

Use another thread to do networking. AsyncTask may help you.

Upvotes: 0

Related Questions