Vì vậy, một cái gì đó để xem xét là Formatter.formatIpAddress(int) đang được chấp nhận:
Phương pháp này đã được tán thành trong mức API 12. Sử dụng getHostAddress(), mà hỗ trợ cả IPv4 và địa chỉ IPv6. Phương thức này không hỗ trợ địa chỉ IPv6.
Vì vậy, việc sử dụng formatIpAddress(int)
có thể không phải là giải pháp dài hạn tốt, mặc dù nó sẽ hoạt động.
Dưới đây là một giải pháp tiềm năng nếu bạn đang tìm kiếm để hoàn toàn trên có được địa chỉ IP cho giao diện WiFi:
protected String wifiIpAddress(Context context) {
WifiManager wifiManager = (WifiManager) context.getSystemService(WIFI_SERVICE);
int ipAddress = wifiManager.getConnectionInfo().getIpAddress();
// Convert little-endian to big-endianif needed
if (ByteOrder.nativeOrder().equals(ByteOrder.LITTLE_ENDIAN)) {
ipAddress = Integer.reverseBytes(ipAddress);
}
byte[] ipByteArray = BigInteger.valueOf(ipAddress).toByteArray();
String ipAddressString;
try {
ipAddressString = InetAddress.getByAddress(ipByteArray).getHostAddress();
} catch (UnknownHostException ex) {
Log.e("WIFIIP", "Unable to get host address.");
ipAddressString = null;
}
return ipAddressString;
}
Như đã nêu trong phản ứng trước đó, bạn cần phải thiết lập như sau trong AndroidManifest.xml của bạn:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
Lưu ý rằng đây chỉ là giải pháp mẫu. Bạn nên dành thời gian để kiểm tra các giá trị null và như vậy để đảm bảo rằng UX là trơn tru.
Điều trớ trêu là một mặt Google không dùng nữa formatIpAddress(int)
, nhưng vẫn có getIpAddress() vẫn trả về giá trị số nguyên. Địa chỉ IP là một int cũng quy định nó cho việc tuân thủ IPv6.
Tiếp theo là sự thật rằng sự kết thúc có thể hoặc không có thể là một vấn đề. Tôi đã chỉ thử nghiệm ba thiết bị và tất cả chúng đều là người nhỏ tuổi. Nó có vẻ như endianness có thể khác nhau tùy thuộc vào phần cứng, mặc dù chúng tôi đang chạy trong máy ảo này vẫn có thể là một vấn đề. Vì vậy, để được ở bên an toàn, tôi đã thêm một kiểm tra cuối cùng trong mã.
getByAddress(byte[]) dường như muốn giá trị số nguyên là số cuối lớn. Từ nghiên cứu này nó xuất hiện rằng thứ tự byte mạng là lớn-endian. Làm cho tinh thần vì một địa chỉ như 192.168.12.22 là một số lớn.
Kiểm tra HammerNet Dự án GitHub. Nó thực thi mã trên cùng với một loạt các kiểm tra sanity, khả năng xử lý mặc định cho AVD, kiểm tra đơn vị, và những thứ khác. Tôi đã phải thực hiện điều này cho một ứng dụng của tôi và quyết định mở nguồn thư viện.
Bạn dường như mong đợi IP riêng tư. Điều này sẽ giúp. http://stackoverflow.com/questions/6064510/how-to-get-ip-address-of-the-device –