Android GPS使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/linzhihan7410/article/details/53471139

Android中的LocationManager提供了一系列方法来处理地理位置相关的问题
通过getLastKnownLocation(String provider)以及requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)方法可以获取到当前位置

此类提供两种定位方式:GPS定位和网络定位(基站+WIFI)

GPS定位的provider是LocationManager.GPS_PROVIDER, 网络定位则是LocationManager.NETWORK_PROVIDER

这里使用的是GPS定位

流程:
一.对LocationManager以及Criteria进行初始化
二.获取系统定位服务,并通过Criteria得到相应的provider
三.获取UI相应控件,并设置按键监听事件
四.做locationListener监听事件
五.得到定位信息location,通过location得到位置信息 经度,纬度
六.请求位置信息的更新(在监听事件最后,在init方法里面,在Activity的onResume方法里面都要做(原因下面/**/有说))
七.页面退出时,要做资源释放onDestroy()

代码:

public class MainActivity extends Activity implements View.OnClickListener {


    private Button btnGetLocation;                  //这里因为在Oncreate调用了init(),直接获取了,所以这里按键没用
    private TextView tvLocation;                    //使用默认的布局页面里面的TextView
    private LocationManager locationManager;        //location管理
    private LocationListener locationListener;      //location监听
    private String provider;                        //提供者
    private Location location = null;               //这个是用来得到

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //找到相应控件,并设置按键触发事件
        btnGetLocation = (Button) findViewById(R.id.btn_getLocation);
        btnGetLocation.setOnClickListener(this);
        tvLocation = (TextView) findViewById(R.id.tv_location);
        init();                                                 //初始化的方法
    }
    //初始化方法
    private void init() {
        Criteria criteria = new Criteria();             //Criteria用来设置定位配置
        criteria.setAccuracy(Criteria.ACCURACY_FINE);   //设置为最大精度
        criteria.setAltitudeRequired(false);            //不要求海拔信息
        criteria.setBearingRequired(false);             //不要求方位信息
        criteria.setCostAllowed(true);                  //是否允许付费
        criteria.setPowerRequirement(Criteria.POWER_LOW);    //对电量的要求
        String serviceName = Context.LOCATION_SERVICE;      //定位服务
        //获取系统的定位服务
        locationManager = (LocationManager) getSystemService(serviceName); 
        provider = locationManager.getBestProvider(criteria,true);         //得到相应的提供者
        /** 为什么要做多次locationManager.requestLocationUpdates(provider,1000,5,locationListener);
         * 这里一定要对LocationManager进行重新设置监听(在Activity的onResume方法里面)
         * locationManager获取provider的过程不是一次就能成功的
         * locationManager.getLastKnownLocation很可能返回null
         * 如果只在initProvider()中注册一次监听则基本很难成功
         */
        if (provider!=null){
           /* while(location==null)
            {
                locationManager.requestLocationUpdates(provider, 1000, 5, locationListener);
            }*/
            //得到定位信息location   locationManager.requestLocationUpdates() 会返回一个当前的location(其实返回的时候已经是之前的了,在调用此方法的时候才是最新的)
            updateNewLocation(locationManager.requestLocationUpdates(provider, 1000, 5, locationListener));
            listener();
            //更新位置
            locationManager.requestLocationUpdates(provider,1000,5,locationListener);
        }
    }

    private void updateNewLocation(Location location) {
        if(location!=null){
            //处理得到的信息
            double la = location.getLatitude();
            double ln = location.getLongitude();
            String show = "当前的位置信息是: 纬度:"+la+",经度:"+ln;
            tvLocation.setText(show);
        }
    }
    //做locationListener监听事件
    private  void listener(){
        locationListener = new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {
                //在当前位置发送改变后被调用
                updateNewLocation(location);
            }

            /**
             *
             * @param s  与变化相关的location provider名称
             * @param i  状态,如果服务已经停止,并且短时间内不会改变,状态码为:OUT_OF_SERVICE
             *                 如果服务暂时停止,并且在短时间内会恢复,状态码为:TEMPPROARILY_UNAVAILABLE
             *                 如果服务正常有效,状态码为:AVALILABLE
             * @param bundle    一组可选的参数
             */
            @Override
            public void onStatusChanged(String s, int i, Bundle bundle) {
                //provider的状态在可用,暂时不可用和无服务三个状态下直接切换时被调用

            }

            //在Provider被用户开启后调用(这里的开启说的是gps)
            @Override
            public void onProviderEnabled(String s) {

            }

            //在Provider被用户关闭后调用(这里的关闭说的是gps)
            //如果一个已经被关闭了的Provider调用requestLocationUpdates方法,那么这个方法就会被调用
            @Override
            public void onProviderDisabled(String s) {

            }
        };
        locationManager.requestLocationUpdates(provider,6000,1,locationListener);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btn_getLocation:
                listener();
                break;
            default:
                break;
        }
    }

    @Override
    protected void onDestroy() {
        locationManager.removeUpdates(locationListener);
        locationManager.setTestProviderEnabled(provider,false);
        super.onDestroy();
    }

    //页面启动后一直做locationManager获取provider 位置更新
    @Override
    protected void onResume() {
        super.onResume();
        locationManager.requestLocationUpdates(provider,6000,1,locationListener);
    }

    @Override
    protected void onPause() {
        super.onPause();
        locationManager.removeUpdates(locationListener);
    }
}

AndroidManifest文件里添加权限:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.UPDATE_DEVICE_STATS"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> //这一个权限定义后会报错,系统默认处理是去到debug文件里面(默认处理就行了)

总结:GPS遇到的问题点,主要就是locationManager.requestLocationUpdates返回location为null,经过debug后知道,是需要经过多次刷新才会得到
(这里的GPS只是做基本,实际开发中的话,还是使用第三方提供的API地图,比如百度地图,德高地图,都有详细的开发文档!!!而且功能强大.)

猜你喜欢

转载自blog.csdn.net/linzhihan7410/article/details/53471139