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

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

[java]  view plain copy
  1. // 获取系统位置服务的引用  
  2. LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);  
  3.    
  4. // 定义对位置变化的监听函数  
  5. LocationListener locationListener = new LocationListener() {  
  6.     public void onLocationChanged(Location location) {  
  7.       // Called when a new location is found by the network location provider.  
  8.       makeUseOfNewLocation(location);  
  9.     }  
  10.    
  11.     public void onStatusChanged(String provider, int status, Bundle extras) {}  
  12.    
  13.     public void onProviderEnabled(String provider) {}  
  14.    
  15.     public void onProviderDisabled(String provider) {}  
  16.   };  
  17.    
  18. //向位置服务注册监听函数来接受位置更新  
  19. locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 00, 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
  1. package com.tianjf.locationgpsdemo;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6. import android.location.Criteria;  
  7. import android.location.Location;  
  8. import android.location.LocationListener;  
  9. import android.location.LocationManager;  
  10. import android.os.Bundle;  
  11. import android.provider.Settings;  
  12. import android.widget.TextView;  
  13. import android.widget.Toast;  
  14.   
  15. public class MainActivity extends Activity {  
  16.   
  17.     TextView mTextView;  
  18.     LocationManager mLocationManager;  
  19.   
  20.     @Override  
  21.     protected void onCreate(Bundle savedInstanceState) {  
  22.         super.onCreate(savedInstanceState);  
  23.         setContentView(R.layout.activity_main);  
  24.   
  25.         mTextView = (TextView) findViewById(R.id.text_view);  
  26.   
  27.         mLocationManager = (LocationManager) this  
  28.                 .getSystemService(Context.LOCATION_SERVICE);  
  29.         openGPSSetting();  
  30.         getLocation();  
  31.     }  
  32.   
  33.     private void openGPSSetting() {  
  34.         if (mLocationManager  
  35.                 .isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) {  
  36.             Toast.makeText(this"GPS模块正常", Toast.LENGTH_SHORT).show();  
  37.             return;  
  38.         }  
  39.   
  40.         Toast.makeText(this"请开启GPS!", Toast.LENGTH_SHORT).show();  
  41.         // 跳转到GPS的设置页面  
  42.         Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);  
  43.         startActivityForResult(intent, 0); // 此为设置完成后返回到获取界面  
  44.     }  
  45.   
  46.     private void getLocation() {  
  47.         // android通过criteria选择合适的地理位置服务  
  48.         Criteria criteria = new Criteria();  
  49.         criteria.setAccuracy(Criteria.ACCURACY_FINE);// 高精度  
  50.         criteria.setAltitudeRequired(false);// 设置不需要获取海拔方向数据  
  51.         criteria.setBearingRequired(false);// 设置不需要获取方位数据  
  52.         criteria.setCostAllowed(true);// 设置允许产生资费  
  53.         criteria.setPowerRequirement(Criteria.POWER_LOW);// 低功耗  
  54.   
  55.         String provider = mLocationManager.getBestProvider(criteria, true);// 获取GPS信息  
  56.         Location location = mLocationManager.getLastKnownLocation(provider);// 通过GPS获取位置  
  57.         updateUIToNewLocation(location);  
  58.         // 设置监听器,自动更新的最小时间为间隔N秒(这里的单位是微秒)或最小位移变化超过N米(这里的单位是米)  
  59.         mLocationManager.requestLocationUpdates(provider, 1 * 10000.00001F,  
  60.                 locationListener);  
  61.     }  
  62.   
  63.     private void updateUIToNewLocation(Location location) {  
  64.         if (location != null) {  
  65.             mTextView.setText("纬度:" + location.getLatitude() + "\n经度"  
  66.                     + location.getLongitude());  
  67.             // Location类的方法:  
  68.             // getAccuracy():精度(ACCESS_FINE_LOCATION/ACCESS_COARSE_LOCATION)  
  69.             // getAltitude():海拨  
  70.             // getBearing():方位,行动方向  
  71.             // getLatitude():纬度  
  72.             // getLongitude():经度  
  73.             // getProvider():位置提供者(GPS/NETWORK)  
  74.             // getSpeed():速度  
  75.             // getTime():时刻   
  76.         } else {  
  77.             mTextView.setText("无法获取地理信息");  
  78.         }  
  79.     }  
  80.   
  81.     // 定义对位置变化的监听函数  
  82.     LocationListener locationListener = new LocationListener() {  
  83.         public void onLocationChanged(Location location) {  
  84.             System.out.println("onLocationChanged");  
  85.             System.out.println("纬度:" + location.getLatitude() + "\n经度"  
  86.                     + location.getLongitude());  
  87.         }  
  88.   
  89.         public void onStatusChanged(String provider, int status, Bundle extras) {  
  90.             System.out.println("onStatusChanged");  
  91.             System.out.println("privider:" + provider);  
  92.             System.out.println("status:" + status);  
  93.             System.out.println("extras:" + extras);  
  94.         }  
  95.   
  96.         public void onProviderEnabled(String provider) {  
  97.             System.out.println("onProviderEnabled");  
  98.             System.out.println("privider:" + provider);  
  99.         }  
  100.   
  101.         public void onProviderDisabled(String provider) {  
  102.             System.out.println("onProviderDisabled");  
  103.             System.out.println("privider:" + provider);  
  104.         }  
  105.     };  
  106. }  

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

更多相关文章

  1. Android开发人员不得不收集的代码(blankj:utilcode)
  2. android Uri获取真实路径转换成File的方法
  3. 使用Android提供的模拟任意地理位置,报java.lang.IllegalArgument
  4. 申请Google Map密钥
  5. Android(安卓)使用自定义注解代替重复写findViewById代码
  6. android Uri获取真实路径转换成File的方法
  7. Android学习心得(六)——位置服务
  8. Android软件开发之获取通讯录联系人信息 + android联系人信息的
  9. Android菜鸟日记29-杂记

随机推荐

  1. android:WALLPAPER_CHANGED不适用于三星Ga
  2. Android NFC 近场通讯开发全解
  3. 通过不在android游标中工作的顺序
  4. Android全屏模式,沉浸模式。粘性沉浸模式
  5. 制作动态表格(最好的方法)
  6. Android短彩信源码解析-短信发送流程(三)
  7. android app启动就闪退怎么办?
  8. 如何设计数据库模型来记录客户的历史活动
  9. Android百度地图定位定到了海里,定到了非
  10. android插件化-apkplug中以监听方式获取O