Android可以通过多种方式获取用户位置。本文主要将GPS和NETWORK两种方式。

先简单的介绍下怎么在Android设备上获取用户位置。

[java] view plain copy 在CODE上查看代码片
  1. //获取系统位置服务的引用
  2. LocationManagerlocationManager=(LocationManager)this.getSystemService(Context.LOCATION_SERVICE);
  3. //定义对位置变化的监听函数
  4. LocationListenerlocationListener=newLocationListener(){
  5. publicvoidonLocationChanged(Locationlocation){
  6. //Calledwhenanewlocationisfoundbythenetworklocationprovider.
  7. makeUseOfNewLocation(location);
  8. }
  9. publicvoidonStatusChanged(Stringprovider,intstatus,Bundleextras){}
  10. publicvoidonProviderEnabled(Stringprovider){}
  11. publicvoidonProviderDisabled(Stringprovider){}
  12. };
  13. //向位置服务注册监听函数来接受位置更新
  14. locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,0,locationListener);

首先要获取LocationManager对象,LocationManager不能直接new出来,他是系统的一项服务。

requestLocationUpdates()方法是来更新用户的位置的。第一个参数是Location Provider(位置提供者)的使用类型。(本例中使用的是基于手机信号塔和Wi_FI基站的网络位置提供者)。二个参数是通知之间的最小时间间隔(单位微秒),第三个是通知之间最小的距离变化(单位米)。将两个的值设置为零可以尽可能频繁的获取位置的通知。最后一个参数是 接受位置更新回调函数LocationListener。

为了使用GPS提供者来获取位置的更新,可以将NETWORK_PROVIDER.更改为GPS_PROVIDER。也可以通过两次调用requestLocationUpdates()(一次 NETWORK_PROVIDER ,一次GPS_PROVIDER.)来同时使用GPS和Network Location 内容提供者获取位置更新。

为了能够接受来自 NETWORK_PROVIDER或者GPS_PROVIDER的位置更新,必须在Android 的mainifest的文件中声明ACCESS_COARSE_LOCATION 或者ACCESS_FINE_LOCATION的用户权限。如果没有这些权限,会报错。NETWORK_PROVIDER需要ACCESS_COARSE_LOCATION权限(粗糙的定位权限),GPS_PROVIDER需要ACCESS_FINE_LOCATION权限(精确的定位权限)。当然,如果有ACCESS_FINE_LOCATION权限,NETWORK_PROVIDER和GPS_PROVIDER都能用

LocationListener中的四个回调函数

onLocationChanged:当位置变化时调用

onStatusChanged:此方法在Provider的状态在可用、暂时不可用和无服务三个状态直接切换时被调用。试了一下,在位置提供者为network的前提下,联网和断网此方法会被调用

onProviderEnabled和onProviderDisabled:provider被用户开启或关闭后调用。试了一下,在位置提供者为GPS的前提下,打开和关闭GPS此方法会被调用。

最后附上一个Demo:

[java] view plain copy 在CODE上查看代码片
  1. packagecom.tianjf.locationgpsdemo;
  2. importandroid.app.Activity;
  3. importandroid.content.Context;
  4. importandroid.content.Intent;
  5. importandroid.location.Criteria;
  6. importandroid.location.Location;
  7. importandroid.location.LocationListener;
  8. importandroid.location.LocationManager;
  9. importandroid.os.Bundle;
  10. importandroid.provider.Settings;
  11. importandroid.widget.TextView;
  12. importandroid.widget.Toast;
  13. publicclassMainActivityextendsActivity{
  14. TextViewmTextView;
  15. LocationManagermLocationManager;
  16. @Override
  17. protectedvoidonCreate(BundlesavedInstanceState){
  18. super.onCreate(savedInstanceState);
  19. setContentView(R.layout.activity_main);
  20. mTextView=(TextView)findViewById(R.id.text_view);
  21. mLocationManager=(LocationManager)this
  22. .getSystemService(Context.LOCATION_SERVICE);
  23. openGPSSetting();
  24. getLocation();
  25. }
  26. privatevoidopenGPSSetting(){
  27. if(mLocationManager
  28. .isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)){
  29. Toast.makeText(this,"GPS模块正常",Toast.LENGTH_SHORT).show();
  30. return;
  31. }
  32. Toast.makeText(this,"请开启GPS!",Toast.LENGTH_SHORT).show();
  33. //跳转到GPS的设置页面
  34. Intentintent=newIntent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
  35. startActivityForResult(intent,0);//此为设置完成后返回到获取界面
  36. }
  37. privatevoidgetLocation(){
  38. //android通过criteria选择合适的地理位置服务
  39. Criteriacriteria=newCriteria();
  40. criteria.setAccuracy(Criteria.ACCURACY_FINE);//高精度
  41. criteria.setAltitudeRequired(false);//设置不需要获取海拔方向数据
  42. criteria.setBearingRequired(false);//设置不需要获取方位数据
  43. criteria.setCostAllowed(true);//设置允许产生资费
  44. criteria.setPowerRequirement(Criteria.POWER_LOW);//低功耗
  45. Stringprovider=mLocationManager.getBestProvider(criteria,true);//获取GPS信息
  46. Locationlocation=mLocationManager.getLastKnownLocation(provider);//通过GPS获取位置
  47. updateUIToNewLocation(location);
  48. //设置监听器,自动更新的最小时间为间隔N秒(这里的单位是微秒)或最小位移变化超过N米(这里的单位是米)
  49. mLocationManager.requestLocationUpdates(provider,1*1000,0.00001F,
  50. locationListener);
  51. }
  52. privatevoidupdateUIToNewLocation(Locationlocation){
  53. if(location!=null){
  54. mTextView.setText("纬度:"+location.getLatitude()+"\n经度"
  55. +location.getLongitude());
  56. //Location类的方法:
  57. //getAccuracy():精度(ACCESS_FINE_LOCATION/ACCESS_COARSE_LOCATION)
  58. //getAltitude():海拨
  59. //getBearing():方位,行动方向
  60. //getLatitude():纬度
  61. //getLongitude():经度
  62. //getProvider():位置提供者(GPS/NETWORK)
  63. //getSpeed():速度
  64. //getTime():时刻
  65. }else{
  66. mTextView.setText("无法获取地理信息");
  67. }
  68. }
  69. //定义对位置变化的监听函数
  70. LocationListenerlocationListener=newLocationListener(){
  71. publicvoidonLocationChanged(Locationlocation){
  72. System.out.println("onLocationChanged");
  73. System.out.println("纬度:"+location.getLatitude()+"\n经度"
  74. +location.getLongitude());
  75. }
  76. publicvoidonStatusChanged(Stringprovider,intstatus,Bundleextras){
  77. System.out.println("onStatusChanged");
  78. System.out.println("privider:"+provider);
  79. System.out.println("status:"+status);
  80. System.out.println("extras:"+extras);
  81. }
  82. publicvoidonProviderEnabled(Stringprovider){
  83. System.out.println("onProviderEnabled");
  84. System.out.println("privider:"+provider);
  85. }
  86. publicvoidonProviderDisabled(Stringprovider){
  87. System.out.println("onProviderDisabled");
  88. System.out.println("privider:"+provider);
  89. }
  90. };
  91. }

转自:http://blog.csdn.net/tianjf0514/article/details/8295099

更多相关文章

  1. android 权限大全
  2. Android 所有可访问的权限
  3. Android 调用系统原生相机拍照并储存到指定位置
  4. Android系统权限和root权限大全
  5. Android自定义控件布局刷新自定义控件回到初始位置问题的解决
  6. Android 系统常用权限
  7. Android 给 app默认权限(不弹窗申请权限)
  8. Android内容提供者源码
  9. android学习轨迹之二:Android权限标签uses-permission的书写位置

随机推荐

  1. 如何使用android中的搜索功能
  2. 从android游戏框架看其生命周期!
  3. Android(安卓)webview 调用android浏览器
  4. android sdk 下载地址
  5. Android(安卓)五大布局之(一) 线性布局和相
  6. android中的震动
  7. Android(安卓)BroadcastReceiver 简介
  8. Android中使用log4j
  9. Real Android(安卓)apps leveraging db4o
  10. android 学习笔记(一)