无须引入第三方定位,单纯依赖v4包,如果只是需要简单的定位,那么这份工具类可以很好地帮助到你,老司机不多说,辛酸的话语都留在了代码里了,上效果演示

LocationDemo

Demo牛逼地显示是当时查内存泄漏查吐血的功劳,具体坑可以查看相关Demo代码,下面开始开车,嘟嘟嘟嘟~

站点

isGpsEnabled : 判断Gps是否可用

isLocationEnabled : 判断定位是否可用

openGpsSettings : 打开Gps设置界面

register : 注册

unregister : 注销

getAddress : 根据经纬度获取地理位置

getCountryName : 根据经纬度获取所在国家

getLocality : 根据经纬度获取所在地

getStreet : 根据经纬度获取所在街道

具体路线

import android.content.Context;

import android.content.Intent;

import android.location.Address;

import android.location.Criteria;

import android.location.Geocoder;

import android.location.Location;

import android.location.LocationListener;

import android.location.LocationManager;

import android.location.LocationProvider;

import android.os.Bundle;

import android.provider.Settings;

import java.io.IOException;

import java.util.List;

import java.util.Locale;

/**

*

* author: Blankj

* blog : http://blankj.com

* time : 16/11/13

* desc : 定位相关工具类

*

*/

public class LocationUtils {

private static OnLocationChangeListener mListener;

private static MyLocationListener myLocationListener;

private static LocationManager mLocationManager;

private LocationUtils() {

throw new UnsupportedOperationException("u can't instantiate me...");

}

/**

* 判断Gps是否可用

*

* @return {@code true}: 是
{@code false}: 否

*/

public static boolean isGpsEnabled(Context context) {

LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

return lm.isProviderEnabled(LocationManager.GPS_PROVIDER);

}

/**

* 判断定位是否可用

*

* @return {@code true}: 是
{@code false}: 否

*/

public static boolean isLocationEnabled(Context context) {

LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

return lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER) || lm.isProviderEnabled(LocationManager.GPS_PROVIDER);

}

/**

* 打开Gps设置界面

*/

public static void openGpsSettings(Context context) {

Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

context.startActivity(intent);

}

/**

* 注册

*

使用完记得调用{@link #unregister()}

*

需添加权限 {@code }

*

需添加权限 {@code }

*

需添加权限 {@code }

*

如果{@code minDistance}为0,则通过{@code minTime}来定时更新;

*

{@code minDistance}不为0,则以{@code minDistance}为准;

*

两者都为0,则随时刷新。

*

* @param minTime 位置信息更新周期(单位:毫秒)

* @param minDistance 位置变化最小距离:当位置距离变化超过此值时,将更新位置信息(单位:米)

* @param listener 位置刷新的回调接口

* @return {@code true}: 初始化成功
{@code false}: 初始化失败

*/

public static boolean register(Context context, long minTime, long minDistance, OnLocationChangeListener listener) {

if (listener == null) return false;

mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

mListener = listener;

if (!isLocationEnabled(context)) {

ToastUtils.showShortToastSafe(context, "无法定位,请打开定位服务");

return false;

}

String provider = mLocationManager.getBestProvider(getCriteria(), true);

Location location = mLocationManager.getLastKnownLocation(provider);

if (location != null) listener.getLastKnownLocation(location);

if (myLocationListener == null) myLocationListener = new MyLocationListener();

mLocationManager.requestLocationUpdates(provider, minTime, minDistance, myLocationListener);

return true;

}

/**

* 注销

*/

public static void unregister() {

if (mLocationManager != null) {

if (myLocationListener != null) {

mLocationManager.removeUpdates(myLocationListener);

myLocationListener = null;

}

mLocationManager = null;

}

}

/**

* 设置定位参数

*

* @return {@link Criteria}

*/

private static Criteria getCriteria() {

Criteria criteria = new Criteria();

//设置定位精确度 Criteria.ACCURACY_COARSE比较粗略,Criteria.ACCURACY_FINE则比较精细

criteria.setAccuracy(Criteria.ACCURACY_FINE);

//设置是否要求速度

criteria.setSpeedRequired(false);

// 设置是否允许运营商收费

criteria.setCostAllowed(false);

//设置是否需要方位信息

criteria.setBearingRequired(false);

//设置是否需要海拔信息

criteria.setAltitudeRequired(false);

// 设置对电源的需求

criteria.setPowerRequirement(Criteria.POWER_LOW);

return criteria;

}

/**

* 根据经纬度获取地理位置

*

* @param context 上下文

* @param latitude 纬度

* @param longitude 经度

* @return {@link Address}

*/

public static Address getAddress(Context context, double latitude, double longitude) {

Geocoder geocoder = new Geocoder(context, Locale.getDefault());

try {

List

addresses = geocoder.getFromLocation(latitude, longitude, 1);

if (addresses.size() > 0) return addresses.get(0);

} catch (IOException e) {

e.printStackTrace();

}

return null;

}

/**

* 根据经纬度获取所在国家

*

* @param context 上下文

* @param latitude 纬度

* @param longitude 经度

* @return 所在国家

*/

public static String getCountryName(Context context, double latitude, double longitude) {

Address address = getAddress(context, latitude, longitude);

return address == null ? "unknown" : address.getCountryName();

}

/**

* 根据经纬度获取所在地

*

* @param context 上下文

* @param latitude 纬度

* @param longitude 经度

* @return 所在地

*/

public static String getLocality(Context context, double latitude, double longitude) {

Address address = getAddress(context, latitude, longitude);

return address == null ? "unknown" : address.getLocality();

}

/**

* 根据经纬度获取所在街道

*

* @param context 上下文

* @param latitude 纬度

* @param longitude 经度

* @return 所在街道

*/

public static String getStreet(Context context, double latitude, double longitude) {

Address address = getAddress(context, latitude, longitude);

return address == null ? "unknown" : address.getAddressLine(0);

}

private static class MyLocationListener

implements LocationListener {

/**

* 当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发

*

* @param location 坐标

*/

@Override

public void onLocationChanged(Location location) {

if (mListener != null) {

mListener.onLocationChanged(location);

}

}

/**

* provider的在可用、暂时不可用和无服务三个状态直接切换时触发此函数

*

* @param provider 提供者

* @param status 状态

* @param extras provider可选包

*/

@Override

public void onStatusChanged(String provider, int status, Bundle extras) {

if (mListener != null) {

mListener.onStatusChanged(provider, status, extras);

}

switch (status) {

case LocationProvider.AVAILABLE:

LogUtils.d("onStatusChanged", "当前GPS状态为可见状态");

break;

case LocationProvider.OUT_OF_SERVICE:

LogUtils.d("onStatusChanged", "当前GPS状态为服务区外状态");

break;

case LocationProvider.TEMPORARILY_UNAVAILABLE:

LogUtils.d("onStatusChanged", "当前GPS状态为暂停服务状态");

break;

}

}

/**

* provider被enable时触发此函数,比如GPS被打开

*/

@Override

public void onProviderEnabled(String provider) {

}

/**

* provider被disable时触发此函数,比如GPS被关闭

*/

@Override

public void onProviderDisabled(String provider) {

}

}

public interface OnLocationChangeListener {

/**

* 获取最后一次保留的坐标

*

* @param location 坐标

*/

void getLastKnownLocation(Location location);

/**

* 当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发

*

* @param location 坐标

*/

void onLocationChanged(Location location);

/**

* provider的在可用、暂时不可用和无服务三个状态直接切换时触发此函数

*

* @param provider 提供者

* @param status 状态

* @param extras provider可选包

*/

void onStatusChanged(String provider, int status, Bundle extras);//位置状态发生改变

}

}

终点站

好了,终点站到了,如果对本次旅途满意的话,请给五星好评哦,毕竟老司机牺牲了很多时间才换来这么一份工具类,如果该工具类依赖其他工具类,都可以在我的

android 经纬度工具类,工具类之LocationUtils(定位工具类)相关推荐

  1. android 定位工具类,高德地图定位工具类

    引言 定位功能初始化设置时耗时较多,如果放在Activity中操作,难免会有Activity切换较慢的问题.通过该工具类,可以实现一次初始化,多处随时调用.具有占用资源少,使用方便,便于复用,速度快, ...

  2. android gps定位工具类,工具类之LocationUtils(定位工具类)

    无须引入第三方定位,单纯依赖v4包,如果只是需要简单的定位,那么这份工具类可以很好地帮助到你,老司机不多说,辛酸的话语都留在了代码里了,上效果演示 LocationDemo Demo牛逼地显示是当时查 ...

  3. Android旋转视频工具类,Android开发实现的IntentUtil跳转多功能工具类【包含视频、音频、图片、摄像头等操作功能】...

    本文实例讲述了Android开发实现的IntentUtil跳转多功能工具类.分享给大家供大家参考,具体如下: 说明:此工具类是本人开发中总结下来的,还有其它的跳转亲给我留言,希望大家一起把这个工具类打 ...

  4. 【Android 插件化】Hook 插件化框架 ( 反射工具类 | 反射常用操作整理 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  5. Android开发实战《手机安全卫士》——5.“高级工具”模块实现 获取经纬度 锁屏 卸载

    文章目录 1.手机防盗--接收短信播放音乐 2.手机防盗--定位方式 3.手机防盗--获取经纬度坐标 4.手机防盗--设备管理器使用 5.手机防盗--锁屏 & 数据清除 & 卸载 6. ...

  6. Google Hangouts拆分成类Slack的Chat和视频通话工具Meet

    Google做聊天服务并没有什么好履历,但是搜索巨头做社交之心一直未死(这一点跟阿里挺像啊).Hangouts.Allo.Android Messenger.Duo等等可以用前赴后继来形容.在经过几年 ...

  7. 【Flutter】JSON 模型转换 ( JSON 序列化工具 | JSON 手动序列化 | 根据 JSON 编写 Dart 模型类 | 在线自动根据 JSON 转换 Dart 类 )

    文章目录 一.JSON 序列化工具 二.JSON 手动序列化 三.根据 JSON 编写 Dart 模型类 四.在线自动转换 五.相关资源 一.JSON 序列化工具 JSON 格式比较简单的话 , 使用 ...

  8. Java中字符串工具类继承org.apache.commons.lang3.StringUtils类代码

    场景 转换为字节数组:是否包含字符串:替换掉HTML标签方法:替换为手机识别的HTML,去掉样式及属性,保留回车: 缩略字符串(不区分中英文字符):转换为Double类型:转换为Float类型:转换为 ...

  9. c mysql实体类生成工具_【干货分享】C# 实体类生成工具

    前言: 项目实战中不论是业务编码还是通用编码,总会归纳出一些通用的工具类.放入项目中一劳永逸,让兄弟姐妹们避免编写重复代码.所以利用了工作之余的时间,将这些散落在多个项目中精致优雅的工具类,归纳起来形 ...

最新文章

  1. DotNET(C#) Socket基本编程 (1)
  2. pycharm 运行控制台中文乱码解决办法
  3. 【Android RTMP】音频数据采集编码 ( AAC 音频格式解析 | FLV 音频数据标签解析 | AAC 音频数据标签头 | 音频解码配置信息 )
  4. POJ 3461 kmp 应用
  5. Log保存文件-Android
  6. div背景透明_为什么css3实现background-image和半透明边框这么麻烦
  7. 清明节特辑 |记忆存储、声音还原、性格模仿……AI可以让人类永生吗?
  8. “稿费+股权”能打造亿万富翁作家?
  9. VLFeat在matlab和vs中安装
  10. 材料成型及控制工程学计算机吗,材料成型及控制工程
  11. 电信运营商移动互联网发展分析
  12. 郑捷《机器学习算法原理与编程实践》学习笔记(第四章 推荐系统原理)(一)推荐系统概述...
  13. 第3章 结构之法——电话号码对应英语单词
  14. Feedback from Microsoft
  15. 计算机网络原理第七章——Internet 原理
  16. 我接触过的广东美食——流口水
  17. 金融相关时间序列分析全指南
  18. java sbt_SBT管理java项目
  19. 计算机基础(18)——为什么每次下载东西到一半都会失败?
  20. 汇编与接口技术课程总结1——汇编程序debug调试

热门文章

  1. Hack The Box——SneakyMailer
  2. 热门Java开发工具IDEA入门指南——IntelliJ IDEA概述(下)
  3. c语言的中打印出鸟图形,教你画出一只萌萌哒小鸟【PS教程】
  4. 员工转正申请书_员工转正申请书简短的
  5. Single shot object detection SSD using MobileNet and OpenCV
  6. msp fet430uif驱动
  7. (8)echo 命令
  8. 将tif文件转换成mrc文件
  9. 电脑摄像头未能创建连接服务器,电脑提示未能创建视频预览,请检查设备连接的原因及解决办法...
  10. 安装jre运行环境_如何下载安装java运行环境jre