GPS (Global Position System,全球定位系统)是20世纪70年代由美国陆海空三军联合研制的新一代空间卫星导航定位系统。 Android 的位置服务中,有两个重要的类LocationManager和LocationProvider提供了一系列方法来处理位置相关的问题,包括查询一个已知位置;注册/注销来自某个 LocationProvider的周期性的位置更新;以及注册/注销接近某个坐标时对一个已定义Intent的触发等。今天我们就来看看Android 中LocatinManager的简单使用,以获取当前所在的位置为例。

首先,我们需要获取LocationManager的一个实例,这里需要注意的是他的实例只能通过下面这种方式来获取,直接实例化LocationManager是不被允许的。

Java代码 LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); LocationManagerlocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

得到了LocationManager的实例locatonManager以后,我们通过下面的语句来注册一个周期性的位置更新。 Java代码 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000 ,0 , locationListener); locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, locationListener);

这句代码告诉系统,我们需要从GPS获取位置信息,并且是每隔1000ms更新一次,并且不考虑位置的变化。最后一个参数是LocationListener的一个引用,我们必须要实现这个类。 Java代码 private final LocationListener locationListener =newLocationListener() { public void onLocationChanged(Location location) {//当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发 // log it when the location changes if (location !=null ) { Log.i("SuperMap","Location changed : Lat: " + location.getLatitude() + " Lng: " + location.getLongitude()); } } public void onProviderDisabled(String provider) { // Provider被disable时触发此函数,比如GPS被关闭 } public void onProviderEnabled(String provider) { //Provider被enable时触发此函数,比如GPS被打开 } public void onStatusChanged(String provider,int status, Bundle extras) { // Provider的转态在可用、暂时不可用和无服务三个状态直接切换时触发此函数 } }; private finalLocationListener locationListener = new LocationListener() { public void onLocationChanged(Locationlocation) { //当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发 // log it when the location changes if (location != null) { Log.i("SuperMap", "Location changed : Lat: " + location.getLatitude() + "Lng: " + location.getLongitude()); } } public void onProviderDisabled(Stringprovider) { // Provider被disable时触发此函数,比如GPS被关闭 } public void onProviderEnabled(Stringprovider) { // Provider被enable时触发此函数,比如GPS被打开 } public void onStatusChanged(Stringprovider, int status, Bundle extras) { // Provider的转态在可用、暂时不可用和无服务三个状态直接切换时触发此函数 } };

以上的这些步骤一般应当在Activity的onCreate()阶段完成。

在成功注册了一个周期性坐标更新以后,我们就随时可以通过下面的方法来取得当前的坐标了。 Java代码 Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); double latitude = location.getLatitude(); //经度 doublelongitude = location.getLongitude(); //纬度 double altitude =location.getAltitude(); //海拔 Location location =locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); double latitude =location.getLatitude(); //经度 double longitude =location.getLongitude(); //纬度 double altitude =location.getAltitude(); //海拔

不过这时候,如果你尝试去运行这个LocationSample的话程序启动时多半就会报错,因为我们没有设置GPS相关的权限,解决方法也相当简单,在AndroidManifest.xml中的block里添加下面这句即可解决权限的问题。 Java代码 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
如果是在模拟器中调试的话,我们有两种方法来设置一个模拟的坐标值,第一种是通过DDMS,我们可以在eclipse的ADT插件中使用这种方法,只要打开"Window" --&gt; "Show View" 中打开"Emulator Control" View即可看到如下的设置窗口,我们可以手动,或者通过KML和GPX文件来设置一个坐标。

另一种方法是使用geo命令,我们需要telnet到本机的5554端口(telnet localhost 5554 ),然后在命令行下输入类似于 geo fix -121.45356 46.51119 4392 这样的命令,后面三个参数分别代表了经度、纬度和(可选的)海拔。

完整案例如下:
java 代码:
import java.util.List; import android.app.Activity; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.location.LocationProvider; import android.os.Bundle; import android.widget.TextView; public class LocationTest extends Activity implementsLocationListener { /** Calledwhen the activity is first created. */ private LocationManager lm; private TextView tvOutput; private String best; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout. main); lm = (LocationManager) this.getSystemService( LOCATION_SERVICE); // 从系统服务中获得位置管理器 tvOutput = (TextView) findViewById(R.id. textView1); getMyLocation(); } public void getMyLocation() { log("location providers"); dumpProviders(); // 输出所有位置提供者(network, gps等) Criteria criteria = new Criteria(); // 定义规则 criteria.setAccuracy(Criteria. ACCURACY_FINE); // 精确位置 best = lm.getBestProvider(criteria, true); // 获得最合适的提供者 log("\n best provider is :" + best); Location location = lm.getLastKnownLocation(best); // 获得最后可知的位置 dumpLocation(location); } // 获得所有提供者信息 public void dumpProviders() { List<String> list = lm.getAllProviders(); for (String string : list) { dumpProvider(string); } } // 输出到TextView private void log(String string) { tvOutput.append(string + "\n"); } // 获得每个位置提供者 public void dumpProvider(String provider) { LocationProvider lp = lm.getProvider(provider); StringBuffer sb = new StringBuffer(); sb.append("\n位置提供者名称:" + lp.getName()); sb.append("\n提供者是否可用:" + lm.isProviderEnabled(provider)); sb.append("\n 是否精确位置:" + lp.getAccuracy()); sb.append("\n是否省电模式:" + lp.getPowerRequirement()); sb.append("\n 是否需要网路:" + lp.requiresNetwork()); sb.append("\n 是否需要无线网络:" + lp.requiresCell()); sb.append("\n 是否需要GPS:" + lp.requiresSatellite()); log(sb.toString()); } public void dumpLocation(Location location) { if (location == null) { log("\n[Locationunknowen]"); return; } log("\nLocation is:" +location.toString()); } // 位置改变时获得坐标 @Override public void onLocationChanged(Location arg0) { dumpLocation(arg0); } // 暂停时删除更新位置 @Override protected void onPause() { super.onPause(); lm.removeUpdates( this); } // 恢复时请求更新位置 @Override protected void onResume() { super.onResume(); //绑定临听 lm.requestLocationUpdates(best, 1500, 1, this); } @Override public void onProviderDisabled(String arg0) { log("\nprovider disabled :" + arg0); } @Override public void onProviderEnabled(String arg0) { log("\nprovider enabled :" + arg0); } // 状态改变时 @Override public void onStatusChanged(String arg0, int arg1, Bundle arg2) { log("\nstatus changed:provider:" + arg0 + ",status=" + arg1 + ",extra="+ arg2); } }

AndroidManifest.xml
<?xml version= "1.0"encoding= "utf-8"?> <manifest xmlns:android= "http://schemas.android.com/apk/res/android" package= "com.gps" android:versionCode= "1" android:versionName= "1.0"> <uses-permission android:name= "android.permission.ACCESS_COARSE_LOCATION"></uses-permission> <uses-permission android:name= "android.permission.ACCESS_FINE_LOCATION"></uses-permission> <application android:icon= "@drawable/icon"android:label= "@string/app_name"> <activity android:name= ".LocationTest" android:label= "@string/app_name"> <intent-filter> <action android:name= "android.intent.action.MAIN" /> <category android:name= "android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>

</manifest>




更多相关文章

  1. 004. Android界面刷新没有调用OnMeasure
  2. Android(安卓)文字绘制,多行文字绘制
  3. Android中Listview的平滑滚动(smoothScrollToPositionFromTop方
  4. 使用Android(安卓)Studio安装NDK并配置环境变量
  5. Android(安卓)使用SeekBar时动态显示进度且随SeekBar一起移动
  6. android游戏引擎andengine学习系列六:Physics物理碰撞效果理解
  7. Android(安卓)简单通用的基类
  8. android中scrollTo和scrollBy的理解~~
  9. Android——百度地图开发、添加覆盖物、地理编码和反地理编码、

随机推荐

  1. Java 流行的工作流引擎
  2. 关于修改工作流引擎退回规则的声明-ccflo
  3. 驰骋工作流引擎——发起前置导航设计
  4. CentOS7.6 安装 QtSDK 出错:You need a C+
  5. 关于驰骋BPM对银行行业的问题答复
  6. 驰骋工作流引擎设计系列15 流程中途结束
  7. IntelliJ IDEA启动画面的秘密:当编程遇到
  8. 驰骋工作流引擎设计系列01 流程元素设计
  9. 驰骋工作流引擎设计系列02 流程实例的生
  10. Java线程池总结