`
modabobo
  • 浏览: 505935 次
文章分类
社区版块
存档分类
最新评论

(转)Android_GPS

 
阅读更多

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

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

  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:

  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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics