Wednesday, January 13, 2010

Lấy địa chỉ IP của máy android của bạn!

Cũng chưa có kinh nghiệm nhiều trong lập trình android.
Nhưng mình vừa học được cách lấy ip từ máy android share cho mọi người tham khảo:
Đầu tiên bạn có thể thấy trong lớp WifiInfo có phương thức getIpAddress().
Nhưng kết quả trả về lại là một số nguyên:

WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int ipAddress = wifiInfo.getIpAddress();

Hình như đây không phải là cách đúng.

Một cách khác cũng khá triển vọng là bạn có thể tạo một kết nối socket (socket connection) và dùng thể hiện của Socket để lấy địa chỉ ip của máy mình.
try {
    Socket socket = new Socket("www.androidvn.net", 80);
    Log.i("", socket.getLocalAddress().toString());
} catch (Exception e) {
    Log.i("", e.getMessage());
}

Nhưng cách này hình như lại có một số điểm bất lợi:
    + Bạn tạo ra một kết nối, tạo ra một lưu lượng vận chuyển dẫn đến người dùng có thể bị đánh vào cước :D.
    + Doạn chương trình này được quyết định bởi server mà bạn kết nối tới.
    + Tại đây có thể xảy ra Exception.

Tư tưởng đúng cho trường hợp này là tìm và lặp trên tất các các giao tiếp mạng và tất cả địa chỉ IP :D.

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

Nếu hàm trả về null có nghĩa là không có kết nối nào available.
Nếu hàm trả về một String thì đó là địa chỉ ip hiện tại của thiết bị khi kết nối wifi hay 3G.

No comments:

Post a Comment