GeoIP
[1]. Gradle
dependencies {
compile 'com.maxmind.geoip2:geoip2:2.13.1'
}
[2]. Maven
<dependency>
<groupId>com.maxmind.geoip2</groupId>
<artifactId>geoip2</artifactId>
<version>2.13.1</version>
</dependency>
[3]. 官网API
https://dev.maxmind.com/geoip/geoip2/downloadable/
https://maxmind.github.io/GeoIP2-java/
[4]. 实例
import com.maxmind.geoip2.DatabaseReader
import io.vertx.core.http.HttpServerRequest
import io.vertx.core.json.JsonObject
import org.apache.commons.lang3.StringUtils
import org.slf4j.LoggerFactory
import java.io.File
import java.net.InetAddress
* @Author
* @create 2020/5/27 19:48
object IPUtils {
private val logger = LoggerFactory.getLogger(IPUtils::class.java)
* 获取客户端IP地址
* 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址
* 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址
fun getIP(request: HttpServerRequest): String? {
var ip: String? = null
try {
ip = request.getHeader("X-Forwarded-For")
if (StringUtils.isEmpty(ip) || "unknown".equals(ip, ignoreCase = true)) {
ip = request.getHeader("Proxy-Client-IP")
if (StringUtils.isEmpty(ip) || "unknown".equals(ip, ignoreCase = true)) {
ip = request.getHeader("X-Real-IP")
if (StringUtils.isEmpty(ip) || ip.length == 0 || "unknown".equals(ip, ignoreCase = true)) {
ip = request.getHeader("WL-Proxy-Client-IP")
if (StringUtils.isEmpty(ip) || "unknown".equals(ip, ignoreCase = true)) {
ip = request.getHeader("HTTP_CLIENT_IP")
if (StringUtils.isEmpty(ip) || "unknown".equals(ip, ignoreCase = true)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR")
if (StringUtils.isEmpty(ip) || "unknown".equals(ip, ignoreCase = true)) {
ip = request.remoteAddress().host()
} catch (e: Exception) {
logger.error("IPUtils ERROR ", e)
return ip
* @description: 获得国家
* @param reader
* @param ip
* @return
* @throws Exception
@Throws(Exception::class)
fun getCountry(reader: DatabaseReader, ip: String?): String? {
return reader.city(InetAddress.getByName(ip)).country.names["zh-CN"]
* @description: 获得省份
* @param reader
* @param ip
* @return
* @throws Exception
@Throws(Exception::class)
fun getProvince(reader: DatabaseReader, ip: String?): String? {
return reader.city(InetAddress.getByName(ip)).mostSpecificSubdivision.names["zh-CN"]
* @description: 获得城市
* @param reader
* @param ip
* @return
* @throws Exception
@Throws(Exception::class)
fun getCity(reader: DatabaseReader, ip: String?): String? {
return reader.city(InetAddress.getByName(ip)).city.names["zh-CN"]
* @description: 获得经度
* @param reader
* @param ip
* @return
* @throws Exception
@Throws(Exception::class)
fun getLongitude(reader: DatabaseReader, ip: String?): Double {
return reader.city(InetAddress.getByName(ip)).location.longitude
* @description: 获得纬度
* @param reader
* @param ip
* @return
* @throws Exception
@Throws(Exception::class)
fun getLatitude(reader: DatabaseReader, ip: String?): Double {
return reader.city(InetAddress.getByName(ip)).location.latitude
* ip2loc获取IP信息
fun ip2loc(mmdbPath: String, request: HttpServerRequest): JsonObject {
try {
// 创建 GeoLite2 数据库
val database = File(mmdbPath)
// 读取数据库内容
val reader = DatabaseReader.Builder(database).build()
// 访问IP
val ip = getIP(request)
return JsonObject()
.put("country_name", getCountry(reader, ip))
.put("province_name", getProvince(reader, ip))
.put("city_name", getCity(reader, ip))
.put("longitude", getLongitude(reader, ip))
.put("latitude", getLatitude(reader, ip))
.put("ip", ip)
} catch (e: Exception) {
logger.error("Ip address get failed: {}", e.message)
return JsonObject()
@JvmStatic
fun main(args: Array<String>) {
try {
// String path = req.getSession().getServletContext().getRealPath("/WEB-INF/classes/GeoLite2-City.mmdb");
val path = "D:/GeoLite2-City.mmdb"
// 创建 GeoLite2 数据库
val database = File(path)
// 读取数据库内容
val reader = DatabaseReader.Builder(database).build()
// 访问IP
val ip = "192.168.2.73"
val site = getCountry(reader, ip) + "-" + getProvince(reader, ip) + "-" + getCity(reader, ip) + "-" + getLongitude(reader, ip) + "-" + getLatitude(reader, ip)
println(site)
} catch (e: Exception) {
logger.error("Ip address get failed: {}", e.message)
static BDLocation lastLocation = null;
private LocationClient mLocClient;
public MyLocationListenner myListener = new MyLocationL...
1.需要考虑6.0以上的定位权限
2.因为getLastKnownLocation是获取之前的定位信息,可能这个定位信息为空
所以我们需要先开启定位服务,在定位信息为空的时候requestLocationUpdates获取定位信息
安卓6.0以上的话需要先获取定位权限。权限开启代码不放了,自行查询资料,以下代码...
Android定位主要使用的是基于位置服务(Location Based Service)技术,有了 Android 系统作为载体,我们可以利用定位出的位置进行许多丰富多彩的操作,比如定位城市,根据我们当前的位置,查找要去的目的地的路线等等,因此,现在几乎开发的每一款互联网app产品都有定位功能,好了,现在我们开始学习简单的定位。
轨迹Android
Locus是适用于android的微型kotlin库,只需几行代码即可非常轻松地检索位置。 包括权限模型和位置设置解析在内的所有内容都在内部处理,这消除了开发人员每次必须编写的大量样板代码。
有关更多信息和配置,请参见 !
在这里阅读博客:
Android R支持(如果发现任何问题,请报告)
完全用Kotlin编写
容易初始化
处理权限模型
建立在Kotlin DSL上
清单权限检查
生命周期感知位置更新
位置设置检查
位置设置请求
自定义位置选项配置
自定义关系对话框配置
自定义权限阻止对话框配置
重要信息:自v3.2.0起已弃用
在v3.2.0不推荐使用Locus.configure{}块进行文本自定义。 这意味着已弃用rationaleText , rationaleTitle , blockedTitle , blockedText ,
1 Add it in your root build.gradle at the end of repositories:
allprojects {
repositories {
maven { url 'https://jitpack.io' }
2 Add the dependency
depen
public static String getPhoneIp() {
try {
for (Enumeration en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf =
1. 本次采用的是免费受限普通IP方式, 不够精准, 如有更精确需求可以 花钱 购买高级服务
2. 普通IP方式范围目前仅限定国内IP定位
3. 需要注册获取相关秘钥ak
不多说, 采用百度地图调用方式相对更加简单, 直接上代码
package com.example.demo.utils;
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFact
最近需要做一个拨打电话的功能, 调用第三方接口进行拨号, 而接口中要求经纬度为必传字段, 虽然可以通过app或小程序端获取, 但还是想看看能否通过java来获取到这些具体数据值, 以下为本人查找资料与文档总结出第一种实现方案!
此方法需要用到 GeoIP - > 下载地址
1. 下载使用 GeoIP需要简单的注册一下
2. GeoIP官网上有很多具有倾向性的完整数据, 但有部分是收费的!
3. 此处摘取GeoIP官网中部分需要注意的内容
*GeoLite2免费可下载数据库*
由于即将颁布的数据
关于Android定位功能如何实现的文章实在太多,有些文章着重于Android API的用法,有些则没有整个定位实现的完整流程,有些虽然有流程,但当你按照文章中的步骤实现好之后,很可能会发现各种问题,最常见的问题就是拿不到位置信息。本文会整理Android定位实现的各个步骤,解释其中可能存在的问题,并提供一些最佳实践作为参考。
文章目录获取定位权限在AndroidManifest.xml中增加权限配置检查是否有定位权限申请权限判断请求权限结果弹框提醒用户去设置打开(可选)打开权限设置页面检查定位服务开关检查
在AndroidManifest中添加
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
ko...