欢迎访问快速建站网站我们提供建站工具系统

Android根据IP获取位置信息(城市、经纬度等)

作者:jcmp      发布时间:2021-04-23      浏览量:0
最近项目需要用到位置信息,需要利用IP获

最近项目需要用到位置信息,需要利用IP获取到经纬度。 网上的做法很多有的是通过百度api获取到位置,缺点是没有经纬度信息,只有城市等。 这里我找到了一个链接可以获取到具体的经纬度信息的。分别将这两个方法记录下来。这个方法都只需传入IP即可获取到位置信息。

public class LocationUtils { private static final String TAG = "LocationUtils"; /** * http://ip-api.com/json/58.192.32.1?fields=520191&lang=en * 根据ip获取位置信息 * * @param ip * @return {"accuracy":50,"as":"AS4538 China Education and Research Network Center", * "city":"Nanjing","country":"China","countryCode":"CN","isp": * "China Education and Research Network Center","lat":32.0617,"lon":118.7778,"mobile":false, * "org":"China Education and Research Network Center","proxy":false,"query":"58.192.32.1", * "region":"JS","regionName":"Jiangsu","status":"success","timezone":"Asia/Shanghai","zip":""} */ public static JSONObject Ip2Location(String ip) { JSONObject jsonObject = null; String urlStr = "http://ip-api.com/json/" + ip + "?fields=520191&lang=en"; try { URL url = new URL(urlStr); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setRequestMethod("GET"); urlConnection.setReadTimeout(5000);//读取超时 urlConnection.setConnectTimeout(5000); // 连接超时 urlConnection.setDoInput(true); urlConnection.setUseCaches(false); int responseCode = urlConnection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { //找到服务器的情况下,可能还会找到别的网站返回html格式的数据 InputStream is = urlConnection.getInputStream(); BufferedReader buff = new BufferedReader(new InputStreamReader(is, "UTF-8"));//注意编码,会出现乱码 StringBuilder builder = new StringBuilder(); String line = null; while ((line = buff.readLine()) != null) { builder.append(line); } buff.close();//内部会关闭InputStream urlConnection.disconnect(); String res = builder.toString(); Log.i(TAG, "Ip2Location: res -- "+res); if (StringUtils.isJSONString(res)){ jsonObject = new JSONObject(res); } } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ProtocolException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } return jsonObject; } /** * 根据ip通过百度api去获取城市 * @param ip * @return */ public static String Ip2LocationByBaiduApi(String ip){ try { URL url = new URL("http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=" + ip); URLConnection connection = url.openConnection(); BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(),"utf-8")); String line = null; StringBuffer res = new StringBuffer(); while ((line = reader.readLine())!=null){ res.append(line); } reader.close(); String ipAddr = res.toString(); if (StringUtils.isJSONString(ipAddr)){ JSONObject jsonObject = new JSONObject(ipAddr); if ("1".equals(jsonObject.get("ret").toString())){ return jsonObject.get("city").toString(); }else { return "读取失败"; } }else { return "访问后得到的不是json数据, res -- "+ipAddr; } } catch (MalformedURLException e) { e.printStackTrace(); return "读取失败 e -- "+e.getMessage(); } catch (IOException e) { e.printStackTrace(); return "读取失败 e -- "+e.getMessage(); } catch (JSONException e) { e.printStackTrace(); return "读取失败 e -- "+e.getMessage(); } }}