| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- package eVVM.apk.helper.GPS;
- import android.Manifest;
- import android.content.Context;
- import android.content.pm.PackageManager;
- import android.location.Criteria;
- import android.location.Location;
- import android.location.LocationListener;
- import android.location.LocationManager;
- import android.os.Bundle;
- import android.support.annotation.NonNull;
- import android.support.v4.app.ActivityCompat;
- import android.text.TextUtils;
- import java.util.List;
- import static android.content.Context.LOCATION_SERVICE;
- public class LocationUtils {
- private static final long REFRESH_TIME = 5000L;
- private static final float METER_POSITION = 0.0f;
- private static ILocationListener mLocationListener;
- private static LocationListener listener = new MyLocationListener();
- private static class MyLocationListener implements LocationListener {
- @Override
- public void onLocationChanged(Location location) {//定位改变监听
- if (mLocationListener != null) {
- mLocationListener.onSuccessLocation(location);
- }
- }
- @Override
- public void onStatusChanged(String provider, int status, Bundle extras) {//定位状态监听
- }
- @Override
- public void onProviderEnabled(String provider) {//定位状态可用监听
- }
- @Override
- public void onProviderDisabled(String provider) {//定位状态不可用监听
- }
- }
- /**
- * GPS获取定位方式
- */
- public static Location getGPSLocation(@NonNull Context context) {
- Location location = null;
- LocationManager manager = getLocationManager(context);
- //高版本的权限检查
- if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
- return null;
- }
- if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {//是否支持GPS定位
- //获取最后的GPS定位信息,如果是第一次打开,一般会拿不到定位信息,一般可以请求监听,在有效的时间范围可以获取定位信息
- location = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
- }
- return location;
- }
- /**
- * network获取定位方式
- */
- public static Location getNetWorkLocation(Context context) {
- Location location = null;
- LocationManager manager = getLocationManager(context);
- //高版本的权限检查
- if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
- return null;
- }
- if (manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {//是否支持Network定位
- //获取最后的network定位信息
- location = manager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
- }
- return location;
- }
- /**
- * 获取最好的定位方式
- */
- public static Location getBestLocation(Context context, Criteria criteria) {
- Location location;
- LocationManager manager = getLocationManager(context);
- if (criteria == null) {
- criteria = new Criteria();
- }
- String provider = manager.getBestProvider(criteria, true);
- if (TextUtils.isEmpty(provider)) {
- //如果找不到最适合的定位,使用network定位
- location = getNetWorkLocation(context);
- } else {
- //高版本的权限检查
- if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED
- && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
- return null;
- }
- //获取最适合的定位方式的最后的定位权限
- Location lkLocation = manager.getLastKnownLocation(provider);
- if(lkLocation != null){
- location = lkLocation;
- }else {
- location = getLastKnownLocation(context);
- }
- }
- return location;
- }
- private static Location getLastKnownLocation(Context context) {
- if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
- return null;
- }
- LocationManager locationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE);
- List<String> providers = locationManager.getAllProviders();
- Location bestLocation = null;
- for (String provider : providers) {
- Location l = locationManager.getLastKnownLocation(provider);
- if (l == null) {
- continue;
- }
- if (bestLocation == null || l.getAccuracy() < bestLocation.getAccuracy()) {
- // Found best last known location: %s", l);
- bestLocation = l;
- }
- }
- return bestLocation;
- }
- /**
- * 定位监听
- */
- public static void addLocationListener(Context context, String provider, ILocationListener locationListener) {
- addLocationListener(context, provider, REFRESH_TIME, METER_POSITION, locationListener);
- }
- /**
- * 定位监听
- */
- public static void addLocationListener(Context context, String provider, long time, float meter, ILocationListener locationListener) {
- if (locationListener != null) {
- mLocationListener = locationListener;
- }
- if (listener == null) {
- listener = new MyLocationListener();
- }
- LocationManager manager = getLocationManager(context);
- if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
- && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
- return;
- }
- manager.requestLocationUpdates(provider, time, meter, listener);
- }
- /**
- * 取消定位监听
- */
- public static void unRegisterListener(Context context) {
- if (listener != null) {
- LocationManager manager = getLocationManager(context);
- if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
- && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
- return;
- }
- //移除定位监听
- manager.removeUpdates(listener);
- }
- }
- private static LocationManager getLocationManager(@NonNull Context context) {
- return (LocationManager) context.getSystemService(LOCATION_SERVICE);
- }
- /**
- * 自定义接口
- */
- public interface ILocationListener {
- void onSuccessLocation(Location location);
- }
- /**
- * 判断GPS是否开启,GPS或者AGPS开启一个就认为是开启的
- * @param context
- * @return true 表示开启
- */
- public static final boolean isOPen(final Context context) {
- LocationManager locationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE);
- // 通过GPS卫星定位,定位级别可以精确到街(通过24颗卫星定位,在室外和空旷的地方定位准确、速度快)
- boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
- // 通过WLAN或移动网络(3G/2G)确定的位置(也称作AGPS,辅助GPS定位。主要用于在室内或遮盖物(建筑群或茂密的深林等)密集的地方定位)
- boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
- if (gps || network) {
- return true;
- }
- return false;
- }
- }
|