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地图,比如百度地图,德高地图,都有详细的开发文档!!!而且功能强大.)

更多相关文章

  1. Android(安卓)java.lang.SecurityException: Failed to find pro
  2. Android(安卓)- 使用AIDL设计远程接口
  3. Android(安卓)NDK 错误解决方法(持续更新ing)
  4. Android(安卓)获取包名,版本信息及VersionName名称
  5. 安卓复选框(Checkbox)
  6. Android(安卓)Intent参数传递
  7. Android(安卓)javah -jni 找不到类的解决方法
  8. android p状态栏,插入sim卡,关闭数据流量,状态栏卡图标右下角有X图标
  9. Ubuntu下安装Android(安卓)NDK

随机推荐

  1. Android跨进程通信之小例子(一)
  2. android UI进阶之仿iphone的tab效果 (Andr
  3. Mono for Android(安卓)(1) 之布局
  4. android应用安全——签名机制
  5. Unity3D调用android方法(非插件方式)
  6. OProfile在Andorid上使用
  7. eclipse的graphical layout窗口工作不正
  8. vlc编译
  9. Android札记【2】——系统的认识心中的An
  10. Android官方开发指南翻译(1)-什么是Andro