zoukankan      html  css  js  c++  java
  • 关于Android自带的定位处理

    工作需要这里对Android自带定位做个小小的记录,GPS测试过可用,网络的,需要再次测试,但是方式都差不多,简单总结如下。

    1、首先需要添加权限

      <!-- 这个权限用于访问GPS定位-->
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
        <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
        <!-- 这个权限用于进行网络定位-->
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
        <!--网络权限-->
        <uses-permission android:name="android.permission.INTERNET" />

    2、然后推荐在服务里做定位处理MyService可以继承Location网上很多,这里不再继承 LocationListener 了,继承的方法有很多上面有链接。

    主要代码实现如下

    要使用的参数

        private LocationManager mLocationManager;
        private Location mLocation;
        private double lat = 0;
        private double lng = 0;
        private double alt = 0;
        // The minimum distance to change Updates in meters
        private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 刷新距离10m
        // The minimum time between updates in milliseconds
        private static final long MIN_TIME_BW_UPDATES = 1000 * 5; // 5 秒

    onCreate方法里

     @Override
        public void onCreate() {
            super.onCreate();
            PDALogger.d("onCreate");
            ctx = PdaApplication.getInstance();
            getLocation();//读取手机端GPS
            mHandler.postDelayed(uploadGPSRunnable, 3000);
        }

    下面是这个方法getLocation(),划线部分可要可不要

    public Location getLocation() {
            mLocationManager = (LocationManager) ctx.getSystemService(LOCATION_SERVICE);
            // getting GPS status
            boolean isGPSEnabled = mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
            // getting network status
            boolean isNetworkEnabled = mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    
            if (!isGPSEnabled && !isNetworkEnabled) {
                // no network provider is enabled
            } else {
                if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                }
                //get the location by gps
                if (isGPSEnabled) {
                    if (mLocation == null) {
                        mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, mGPSLocationListener);
                        PDALogger.d("GPS Enabled");
                        if(mLocationManager!=null){
                            mLocation = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        }
                    }
                } else if (isNetworkEnabled) {// First get location from Network Provider
                    if(mLocation==null){
                        mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, mNetWorkLocationListener);
                        PDALogger.d("Network");
                        if(mLocationManager!=null){
                            mLocation = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        }
                    }
                }
    
            }
            return mLocation;
        }

    这里是两个监听器GPS和网络的

    /**
         * GPS定位监听器
         */
        public final LocationListener mGPSLocationListener = new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {
                updateToNewLocation(location);
            }
    
            @Override
            public void onProviderDisabled(String provider) {
                updateToNewLocation(null);
            }
    
            @Override
            public void onProviderEnabled(String provider) {
            }
    
            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {
            }
        };
    
        /**
         * 网络定位监听器
         */
        public final LocationListener mNetWorkLocationListener = new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {
                updateToNewLocation(location);
            }
    
            @Override
            public void onProviderDisabled(String provider) {
                updateToNewLocation(null);
            }
    
            @Override
            public void onProviderEnabled(String provider) {
            }
    
            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {
            }
        };

    定位数据保存,划线处可不要

     /**
         * 定位数据随时保存
         * @param location
         * @return
         */
        private Location updateToNewLocation(Location location) {
            String latLongString;
            if (location != null) {
                lat = location.getLatitude();
                lng = location.getLongitude();
                alt = location.getAltitude();
                 latLongString = "
    纬度:" + lat + "
    经度:" + lng + "
    海拔:" + alt;
                 PDALogger.d(latLongString);
                mLocation = mLocation;
            } else {
                PDALogger.d("无法获取地理信息,请稍后...");
            }
            return location;
        }

    上面就是整个代码使用的方式了,下面是整个Service代码

    package com.xvli.comm;
    
    import android.Manifest;
    import android.app.Service;
    import android.content.Context;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.content.res.Configuration;
    import android.location.Location;
    import android.location.LocationListener;
    import android.location.LocationManager;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.IBinder;
    import android.os.Message;
    import android.support.v4.app.ActivityCompat;
    
    import com.xvli.application.PdaApplication;
    import com.xvli.utils.PDALogger;
    
    public class MyService extends Service {
        private Context ctx;
        private LocationManager mLocationManager;
        private Location mLocation;
        private double lat = 0;
        private double lng = 0;
        private double alt = 0;
        // The minimum distance to change Updates in meters
        private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 刷新距离10m
        // The minimum time between updates in milliseconds
        private static final long MIN_TIME_BW_UPDATES = 1000 * 5; // 5 秒
    
    
        public MyService() {
        }
    
        Handler mHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                switch (msg.what) {
                    case 1:
                        PDALogger.d("onCreate");
                }
            }
        };
    
        @Override
        public IBinder onBind(Intent intent) {
            // TODO: Return the communication channel to the service.
            throw new UnsupportedOperationException("Not yet implemented");
        }
    
        @Override
        public void onCreate() {
            super.onCreate();
            PDALogger.d("onCreate");
            ctx = PdaApplication.getInstance();
            getLocation();//读取手机端GPS
            mHandler.postDelayed(uploadGPSRunnable, 3000);
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            PDALogger.d("onStartCommand");
            return super.onStartCommand(intent, flags, startId);
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            PDALogger.d("onDestroy");
            if (uploadGPSRunnable != null) {
                mHandler.removeCallbacks(uploadGPSRunnable);
            }
    
            //=================================
            //关闭定位监听器
            if (mLocationManager != null) {
                if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                    return;
                }
                mLocationManager.removeUpdates(mGPSLocationListener);
                mLocationManager.removeUpdates(mNetWorkLocationListener);
                mLocationManager = null;
            }
    
        }
    
        @Override
        public boolean onUnbind(Intent intent) {
            PDALogger.d("onUnbind");
            return super.onUnbind(intent);
        }
    
        @Override
        public void onRebind(Intent intent) {
            PDALogger.d("onRebind");
            super.onRebind(intent);
        }
    //============================================================================
        Runnable uploadGPSRunnable = new Runnable() {
            @Override
            public void run() {
                PDALogger.d("这里上传GPS:经度:"+lat+",维度:"+lng+",海拔:"+alt);
                mHandler.postDelayed(this, Config.GPSTIME * 1000);
            }
        };
    
        /**
         * GPS定位监听器
         */
        public final LocationListener mGPSLocationListener = new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {
                updateToNewLocation(location);
            }
    
            @Override
            public void onProviderDisabled(String provider) {
                updateToNewLocation(null);
            }
    
            @Override
            public void onProviderEnabled(String provider) {
            }
    
            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {
            }
        };
    
        /**
         * 网络定位监听器
         */
        public final LocationListener mNetWorkLocationListener = new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {
                updateToNewLocation(location);
            }
    
            @Override
            public void onProviderDisabled(String provider) {
                updateToNewLocation(null);
            }
    
            @Override
            public void onProviderEnabled(String provider) {
            }
    
            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {
            }
        };
    
        /**
         * 定位数据随时保存
         * @param location
         * @return
         */
        private Location updateToNewLocation(Location location) {
            String latLongString;
            if (location != null) {
                lat = location.getLatitude();
                lng = location.getLongitude();
                alt = location.getAltitude();
                 latLongString = "
    纬度:" + lat + "
    经度:" + lng + "
    海拔:" + alt;
                 PDALogger.d(latLongString);
                mLocation = mLocation;
            } else {
                PDALogger.d("无法获取地理信息,请稍后...");
            }
            return location;
        }
    
    
        public Location getLocation() {
            mLocationManager = (LocationManager) ctx.getSystemService(LOCATION_SERVICE);
            // getting GPS status
            boolean isGPSEnabled = mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
            // getting network status
            boolean isNetworkEnabled = mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    
            if (!isGPSEnabled && !isNetworkEnabled) {
                // no network provider is enabled
            } else {
                if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                }
                //get the location by gps
                if (isGPSEnabled) {
                    if (mLocation == null) {
                        mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, mGPSLocationListener);
                        PDALogger.d("GPS Enabled");
                        if(mLocationManager!=null){
                            mLocation = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        }
                    }
                } else if (isNetworkEnabled) {// First get location from Network Provider
                    if(mLocation==null){
                        mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, mNetWorkLocationListener);
                        PDALogger.d("Network");
                        if(mLocationManager!=null){
                            mLocation = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        }
                    }
                }
    
            }
            return mLocation;
        }
    
    }
    View Code
  • 相关阅读:
    大数加法、乘法实现的简单版本
    hdu 4027 Can you answer these queries?
    zoj 1610 Count the Colors
    2018 徐州赛区网赛 G. Trace
    1495 中国好区间 尺取法
    LA 3938 动态最大连续区间 线段树
    51nod 1275 连续子段的差异
    caioj 1172 poj 2823 单调队列过渡题
    数据结构和算法题
    一个通用分页类
  • 原文地址:https://www.cnblogs.com/bxfx111/p/5091061.html
Copyright © 2011-2022 走看看