android gps定位工具类,工具类之LocationUtils(定位工具类)
无须引入第三方定位,单纯依赖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 gps定位工具类,工具类之LocationUtils(定位工具类)相关推荐
- android 弹出编辑框,Android编程实现的EditText弹出打开和关闭工具类
本文实例讲述了Android编程实现的EditText弹出打开和关闭工具类.分享给大家供大家参考,具体如下: 需求: 使用代码实现Android的输入框EditText对键盘的关闭弹出的实现. 代码: ...
- Android 获取手机的厂商、型号、Android系统版本号、IMEI、当前系统语言等工具类...
最近在开发中,需要用到一些系统信息,这里我把这些方法写成一个工具类方便以后复用,该工具类有以下6个功能: 1.获取手机制造厂商 2.获取手机型号 3.获取手机系统当前使用的语言 4.获取Android ...
- Android 获取手机的厂商、型号、Android系统版本号、IMEI、当前系统语言等工具类
最近在开发中,需要用到一些系统信息,这里我把这些方法写成一个工具类方便以后复用,该工具类有以下6个功能: 1.获取手机制造厂商 2.获取手机型号 3.获取手机系统当前使用的语言 4.获取Android ...
- Android基础入门教程——8.3.1 三个绘图工具类详解
Android基础入门教程--8.3.1 三个绘图工具类详解 标签(空格分隔): Android基础入门教程 本节引言: 上两小节我们学习了Drawable以及Bitmap,都是加载好图片的,而本节我 ...
- Android开发之制作圆形头像自定义View,直接引用工具类,加快开发速度。带有源代码学习
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 博客园主页:http://www.cnblogs.com/mcxiaobing ...
- Android开发之制作圆形头像自定义View,直接引用工具类,加快开发速度。带有源代码学习...
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 博客园主页:http://www.cnblogs.com/mcxiaobing ...
- Google Hangouts拆分成类Slack的Chat和视频通话工具Meet
Google做聊天服务并没有什么好履历,但是搜索巨头做社交之心一直未死(这一点跟阿里挺像啊).Hangouts.Allo.Android Messenger.Duo等等可以用前赴后继来形容.在经过几年 ...
- 工具条研究手记(2) - 认识CToolBar工具条类
工具条研究手记(2) - 认识CToolBar工具条类 作者:佚名 文章来源:VC知识库 点击数: <script src="http://www.91tech.net/A ...
- 【Flutter】JSON 模型转换 ( JSON 序列化工具 | JSON 手动序列化 | 根据 JSON 编写 Dart 模型类 | 在线自动根据 JSON 转换 Dart 类 )
文章目录 一.JSON 序列化工具 二.JSON 手动序列化 三.根据 JSON 编写 Dart 模型类 四.在线自动转换 五.相关资源 一.JSON 序列化工具 JSON 格式比较简单的话 , 使用 ...
- Java中字符串工具类继承org.apache.commons.lang3.StringUtils类代码
场景 转换为字节数组:是否包含字符串:替换掉HTML标签方法:替换为手机识别的HTML,去掉样式及属性,保留回车: 缩略字符串(不区分中英文字符):转换为Double类型:转换为Float类型:转换为 ...
最新文章
- 裴礼文数学分析中的典型问题与方法第4章一元函数积分学练习
- C语言编程之格式化输出函数printf()说明
- 卷积神经网络中不同类型的卷积方式介绍
- 智伴机器人广西团队_实力加冕 | 柳工喜获全国机器人焊接竞赛三连冠
- SAP Spartacus Storefront 页面 cx-page-layout 的赋值逻辑
- 一文教你如何在生产环境中在Kubernetes上部署Jaeger
- oracle工作日记,Oracle学习日记【4】
- java 投票_java实现投票程序设计
- jenkins配置自动发送邮件
- python 地理处理包:geopandas介绍
- js计算html的font-size
- Javashop 支持全业务模式电商系统
- android设置管理员权限设置,android 获取超级管理员权限,进行锁屏、恢复出厂设置...
- 在cmd中编译C语言方法
- flowable-6.7(一)从工作流与BPMN到flowable
- python加载图片的方法_python实现读取并显示图片的两种方法
- 学习笔记 time模块练习 纪念日计算
- 视频编码器接入指挥调度平台的一种可行方法
- 西门子200SMART(六)数据块
- Python漫画爬虫开源 66漫画 AJAX,包含数据库连接,图片下载处理
热门文章
- python json库函数_python基础之JSON标准库
- matlab龙格库塔法求通解,基于matlab及龙格库塔法求解布拉修斯方程.doc
- 从0搭建一个Springboot+vue前后端分离项目(四)利用Element框架搭建页面主体部分表格与侧边栏
- Python基础教程:函数的定义
- Python脚本后台运行的五种方式
- Python字符串逐字符或逐词反转方法
- Java中的数组怎么弄随机数_Java – 如何从值数组中创建随机数
- mysql配置多个域名访问吗,tomcat部署多个项目,通过域名解析访问,不同的网站...
- php ajax实现编辑资料,怎么用jQuery、Ajax、php实现这样的无刷新编辑功能?
- php输出字符unicode码,[PHP]单字符Unicode编码解码函数