3

Is there a way in Android API to list connected devices, when Android phone is acting as WiFi router?

And also is there a way to interefere with routed request to serve a welcome/login page?

Piotr Müller
  • 5,323
  • 5
  • 55
  • 82

1 Answers1

4

This is an answer from another stackoverflow question, I read it before two month and don´t know from which user the answer is from, but this should work. WifiManager gives You what You need:

Main.java

import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import com.whitebyte.hotspotclients.R;
import com.whitebyte.wifihotspotutils.ClientScanResult;
import com.whitebyte.wifihotspotutils.WifiApManager;

public class Main extends Activity {
      TextView textView1;
      WifiApManager wifiApManager;

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

    textView1 = (TextView) findViewById(R.id.textView1);
    wifiApManager = new WifiApManager(this);

    scan();
}

private void scan() {
    ArrayList<ClientScanResult> clients = wifiApManager.getClientList(false);

    textView1.append("Clients: \n");
    for (ClientScanResult clientScanResult : clients) {
        textView1.append("####################\n");
        textView1.append("IpAddr: " + clientScanResult.getIpAddr() + "\n");
        textView1.append("Device: " + clientScanResult.getDevice() + "\n");
        textView1.append("HWAddr: " + clientScanResult.getHWAddr() + "\n");
        textView1.append("isReachable: " + clientScanResult.isReachable() + "\n");
    }
}

ClientScanResult.java

public class ClientScanResult {

private String IpAddr;

private String HWAddr;

private String Device;

private boolean isReachable;

public ClientScanResult(String ipAddr, String hWAddr, String device, boolean isReachable) {
    super();
    IpAddr = ipAddr;
    HWAddr = hWAddr;
    Device = device;
    this.setReachable(isReachable);
}

public String getIpAddr() {
    return IpAddr;
}

public void setIpAddr(String ipAddr) {
    IpAddr = ipAddr;
}

public String getHWAddr() {
    return HWAddr;
}

public void setHWAddr(String hWAddr) {
    HWAddr = hWAddr;
}

public String getDevice() {
    return Device;
}

public void setDevice(String device) {
    Device = device;
}

public void setReachable(boolean isReachable) {
    this.isReachable = isReachable;
}

public boolean isReachable() {
    return isReachable;
}

WIFI_AP_STATE.java

 public enum WIFI_AP_STATE 
 {
    WIFI_AP_STATE_DISABLING, WIFI_AP_STATE_DISABLED, WIFI_AP_STATE_ENABLING, WIFI_AP_STATE_ENABLED, WIFI_AP_STATE_FAILED
 }

WifiApManager.java

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.InetAddress;
import java.util.ArrayList;
import android.content.Context;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.util.Log;

public class WifiApManager {
private final WifiManager mWifiManager;

public WifiApManager(Context context) {
    mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
}



/**
 * Gets a list of the clients connected to the Hotspot, reachable timeout is 300
 * @param onlyReachables {@code false} if the list should contain unreachable (probably disconnected) clients, {@code true} otherwise
 * @return ArrayList of {@link ClientScanResult}
 */
public ArrayList<ClientScanResult> getClientList(boolean onlyReachables) {
    return getClientList(onlyReachables, 300);
}

/**
 * Gets a list of the clients connected to the Hotspot 
 * @param onlyReachables {@code false} if the list should contain unreachable (probably disconnected) clients, {@code true} otherwise
 * @param reachableTimeout Reachable Timout in miliseconds
 * @return ArrayList of {@link ClientScanResult}
 */
public ArrayList<ClientScanResult> getClientList(boolean onlyReachables, int reachableTimeout) {
    BufferedReader br = null;
    ArrayList<ClientScanResult> result = null;

    try {
        result = new ArrayList<ClientScanResult>();
        br = new BufferedReader(new FileReader("/proc/net/arp"));
        String line;
        while ((line = br.readLine()) != null) {
            String[] splitted = line.split(" +");

            if ((splitted != null) && (splitted.length >= 4)) {
                // Basic sanity check
                String mac = splitted[3];

                if (mac.matches("..:..:..:..:..:..")) {
                    boolean isReachable = InetAddress.getByName(splitted[0]).isReachable(reachableTimeout);

                    if (!onlyReachables || isReachable) {
                        result.add(new ClientScanResult(splitted[0], splitted[3], splitted[5], isReachable));
                    }
                }
            }
        }
    } catch (Exception e) {
        Log.e(this.getClass().toString(), e.getMessage());
    } finally {
        try {
            br.close();
        } catch (IOException e) {
            Log.e(this.getClass().toString(), e.getMessage());
        }
    }

    return result;
}
}
Sagar Maiyad
  • 12,655
  • 9
  • 63
  • 99
  • I think this is not about Android Phone acting as WiFi router but just scanning for access points in range of Android Phone. I mean a situation when you can start wifi router inside your phone and other devices like computers see your phone as a router – Piotr Müller Jun 08 '13 at 09:40
  • check this link http://stackoverflow.com/questions/8324215/ip-address-of-device-using-phone-as-access-point – Sagar Maiyad Jun 08 '13 at 09:42
  • @killer_PL you should not "edit out" the answer you accepted. If it's not the answer you are looking for don't accept it. If you have found an answer to your question, share it as an other answer or share it as a comment. – vinczemarton Jun 08 '13 at 09:54
  • But 1. Segi found it. 2. Currently accepted answer is totally off-topic, anyone who arrive on that page will be confused. I edited it because real answer is **only in Segi comment**, and answer content is now (after my edit revert) offtopic and invalid. – Piotr Müller Jun 08 '13 at 10:03
  • @killer_PL you can actually "unaccept" an answer in that case, but since Segi edited his answer it's irrelevant now. – vinczemarton Jun 09 '13 at 10:14