网站首页
网站导航
Ctrl+D收藏
首 页
代码段
源码包
文档库
工具箱
代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
Java
】
定位相关
作者:
步政
/ 发布于
2017-2-21
/
77
package com.blankj.utilcode.utils; 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; /** * <pre> * author: Blankj * blog : http://blankj.com * time : 16/11/13 * desc : 定位相关工具类 * </pre> */ 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() { LocationManager lm = (LocationManager) Utils.getContext().getSystemService(Context.LOCATION_SERVICE); return lm.isProviderEnabled(LocationManager.GPS_PROVIDER); } /** * 判断定位是否可用 * * @return {@code true}: 是{@code false}: 否 */ public static boolean isLocationEnabled() { LocationManager lm = (LocationManager) Utils.getContext().getSystemService(Context.LOCATION_SERVICE); return lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER) || lm.isProviderEnabled(LocationManager.GPS_PROVIDER); } /** * 打开Gps设置界面 */ public static void openGpsSettings() { Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Utils.getContext().startActivity(intent); } /** * 注册 * 使用完记得调用{@link #unregister()} * 需添加权限 {@code <uses-permission android:name="android.permission.INTERNET"/>} * 需添加权限 {@code <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>} * 需添加权限 {@code <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>} * 如果{@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(long minTime, long minDistance, OnLocationChangeListener listener) { if (listener == null) return false; mLocationManager = (LocationManager) Utils.getContext().getSystemService(Context.LOCATION_SERVICE); mListener = listener; if (!isLocationEnabled()) { ToastUtils.showShortToastSafe("无法定位,请打开定位服务"); 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 latitude 纬度 * @param longitude 经度 * @return {@link Address} */ public static Address getAddress(double latitude, double longitude) { Geocoder geocoder = new Geocoder(Utils.getContext(), Locale.getDefault()); try { List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1); if (addresses.size() > 0) return addresses.get(0); } catch (IOException e) { e.printStackTrace(); } return null; } /** * 根据经纬度获取所在国家 * * @param latitude 纬度 * @param longitude 经度 * @return 所在国家 */ public static String getCountryName(double latitude, double longitude) { Address address = getAddress(latitude, longitude); return address == null ? "unknown" : address.getCountryName(); } /** * 根据经纬度获取所在地 * * @param latitude 纬度 * @param longitude 经度 * @return 所在地 */ public static String getLocality(double latitude, double longitude) { Address address = getAddress(latitude, longitude); return address == null ? "unknown" : address.getLocality(); } /** * 根据经纬度获取所在街道 * * @param latitude 纬度 * @param longitude 经度 * @return 所在街道 */ public static String getStreet(double latitude, double longitude) { Address address = getAddress(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 通过Build获取手机硬件信息
.
Android代码获取手机品牌、手机型号、手机唯一序列号
.
Map集合中嵌套list
.
Redis通用操作类
.
如何获取视频的总时长
.
获取本地视频缩略图和时长
.
mybatis 不同数据库的like 模糊查询语句
.
微信小程序参数二维码生成带背景图加字体(无限生成)
.
小程序获取openid和unionid java实现
.
获取文件目录
可能有用的
.
android 通过Build获取手机硬件信息
.
Android代码获取手机品牌、手机型号、手机唯一序列号
.
SQL SERVER 查询每日新增用户数量、次留数量
.
获取浏览器滚动条宽度
.
利用Cookie保存数据,在浏览器页面显示用户上次访问时
.
Map集合中嵌套list
.
html5将文字生成图片
.
文字浮在图片上方
.
HTML中怎样在图片的右边显示文字
.
利用ffmpeg将MP4文件切成ts和m3u8
步政
贡献的其它代码
(
7
)
.
手机浏览器跳转微信,wap跳转微信浏览器打开网页代码
.
自建Map集合
.
获取主机所有网络接口
.
表格点击行高亮显示
.
定位相关
.
创建外部表
.
自动调整iframe的高度
地图
本站
我们
服务
版权
联系
回馈
博客