您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Android開發如何獲取手機內網IP地址與外網IP地址,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
Android是一種基于Linux內核的自由及開放源代碼的操作系統,主要使用于移動設備,如智能手機和平板電腦,由美國Google公司和開放手機聯盟領導及開發。
在進行Android應用開發過程中,有時候會遇到獲取當前Android設備所使用的網絡IP地址的場景,有時候需要本地的網絡IP地址,即局域網地址,更多的時候是需要當前網絡的真實的對外IP地址,即真實的網絡地址,如大數據分析時往往需要Android設備上傳本地的外網地址。本文對各種IP地址的獲取進行了總結。
首先用大家比較熟悉的電腦端局域網地址和外網地址的獲取方式對比一下:(1)、電腦端局域網地址獲取方式,可以通過在終端命令行輸入ipconfig進行查看,如下圖IPv地址標識的就是本機的局域網地址:
(2)、電腦端外網地址的獲取方式,可以通過在瀏覽器里面查詢,如在百度頁面搜索“IP地址查詢”查看本地外網地址,如下圖是筆者本機的外網地址:
本地IP地址有兩種情況:一是wifi下,二是移動網絡下
// wifi下獲取本地網絡IP地址(局域網地址) public static String getLocalIPAddress(Context context) { WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); if (wifiManager != null) { @SuppressLint("MissingPermission") WifiInfo wifiInfo = wifiManager.getConnectionInfo(); String ipAddress = intIP2StringIP(wifiInfo.getIpAddress()); return ipAddress; } return ""; }
// 獲取有限網IP public static String getHostIp() { 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() && inetAddress instanceof Inet4Address) { return inetAddress.getHostAddress(); } } } } catch (Exception ex) { } return "0.0.0.0"; }
獲取Android設備的外網地址,即當前Wifi網絡真正的網絡地址,也即是網絡運營商分配給用戶的IP地址。
獲取外網地址的原理:通過訪問外網網站,從網站返回的數據中解析本地的IP地址。PS:在本地是無法獲取到外網的IP地址的,需要借助服務器。
/** * 獲取外網ip地址(非本地局域網地址)的方法 */ public static String getOutNetIP() { String ipAddress = ""; try { String address = "http://ip.taobao.com/service/getIpInfo2.php?ip=myip"; URL url = new URL(address); HttpURLConnection connection = (HttpURLConnection) url .openConnection(); connection.setUseCaches(false); connection.setRequestMethod("GET"); connection.setRequestProperty("user-agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.7 Safari/537.36"); //設置瀏覽器ua 保證不出現503 if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) { InputStream in = connection.getInputStream(); // 將流轉化為字符串 BufferedReader reader = new BufferedReader( new InputStreamReader(in)); String tmpString; StringBuilder retJSON = new StringBuilder(); while ((tmpString = reader.readLine()) != null) { retJSON.append(tmpString + "\n"); } JSONObject jsonObject = new JSONObject(retJSON.toString()); String code = jsonObject.getString("code"); Log.e(TAG, "提示:" +retJSON.toString()); if (code.equals("0")) { JSONObject data = jsonObject.getJSONObject("data"); ipAddress = data.getString("ip")/* + "(" + data.getString("country") + data.getString("area") + "區" + data.getString("region") + data.getString("city") + data.getString("isp") + ")"*/; Log.e(TAG, "您的IP地址是:" + ipAddress); } else { Log.e(TAG, "IP接口異常,無法獲取IP地址!"); } } else { Log.e(TAG, "網絡連接異常,無法獲取IP地址!"); } } catch (Exception e) { Log.e(TAG, "獲取IP地址時出現異常,異常信息是:" + e.toString()); } return ipAddress; }
@SuppressLint("MissingPermission") public static String getIpAddress(Context context) { if (context == null) { return ""; } ConnectivityManager conManager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); try { NetworkInfo info = conManager.getActiveNetworkInfo(); if (info != null && info.isConnected()) { // 3/4g網絡 if (info.getType() == ConnectivityManager.TYPE_MOBILE) { return getHostIp(); } else if (info.getType() == ConnectivityManager.TYPE_WIFI) { // return getLocalIPAddress(context); // 局域網地址 return getOutNetIP(); // 外網地址 } else if (info.getType() == ConnectivityManager.TYPE_ETHERNET) { // 以太網有限網絡 return getHostIp(); } } } catch (Exception e) { return ""; } return ""; }
下面在為大家提供兩個獲取手機IP地址的實例源碼
獲取內網IP地址
/** * 獲取ip地址 * @return */ public static String getHostIP() { String hostIp = null; try { Enumeration nis = NetworkInterface.getNetworkInterfaces(); InetAddress ia = null; while (nis.hasMoreElements()) { NetworkInterface ni = (NetworkInterface) nis.nextElement(); Enumeration<InetAddress> ias = ni.getInetAddresses(); while (ias.hasMoreElements()) { ia = ias.nextElement(); if (ia instanceof Inet6Address) { continue;// skip ipv6 } String ip = ia.getHostAddress(); if (!"127.0.0.1".equals(ip)) { hostIp = ia.getHostAddress(); break; } } } } catch (SocketException e) { Log.i("yao", "SocketException"); e.printStackTrace(); } return hostIp; }
獲取外網IP地址
/** * 獲取IP地址 * @return */ public static String GetNetIp() { URL infoUrl = null; InputStream inStream = null; String line = ""; try { infoUrl = new URL("http://pv.sohu.com/cityjson?ie=utf-8"); URLConnection connection = infoUrl.openConnection(); HttpURLConnection httpConnection = (HttpURLConnection) connection; int responseCode = httpConnection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { inStream = httpConnection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(inStream, "utf-8")); StringBuilder strber = new StringBuilder(); while ((line = reader.readLine()) != null) strber.append(line + "\n"); inStream.close(); // 從反饋的結果中提取出IP地址 int start = strber.indexOf("{"); int end = strber.indexOf("}"); String json = strber.substring(start, end + 1); if (json != null) { try { JSONObject jsonObject = new JSONObject(json); line = jsonObject.optString("cip"); } catch (JSONException e) { e.printStackTrace(); } } return line; } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return line; }
關于“Android開發如何獲取手機內網IP地址與外網IP地址”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。