一、LocationManager
LocationMangager,位置管理器。要想操作定位相关设备,必须先定义个LocationManager。我们可以通过如下代码创建LocationManger对象。
1 | LocationManger locationManager=(LocationManager) this .getSystemService(Context.LOCATION_SERVICE); |
二、LocationListener
LocationListener,位置监听,监听位置变化,监听设备开关与状态。
01 | private LocationListener locationListener= new LocationListener() { |
06 |
public void onLocationChanged(Location location) { |
08 |
Log.i(TAG, "时间:" +location.getTime()); |
09 |
Log.i(TAG, "经度:" +location.getLongitude()); |
10 |
Log.i(TAG, "纬度:" +location.getLatitude()); |
11 |
Log.i(TAG, "海拔:" +location.getAltitude()); |
17 |
public void onStatusChanged(String provider, int status, Bundle extras) { |
20 |
case LocationProvider.AVAILABLE: |
21 |
Log.i(TAG, "当前GPS状态为可见状态" ); |
24 |
case LocationProvider.OUT_OF_SERVICE: |
25 |
Log.i(TAG, "当前GPS状态为服务区外状态" ); |
28 |
case LocationProvider.TEMPORARILY_UNAVAILABLE: |
29 |
Log.i(TAG, "当前GPS状态为暂停服务状态" ); |
37 |
public void onProviderEnabled(String provider) { |
38 |
Location location=lm.getLastKnownLocation(provider); |
45 |
public void onProviderDisabled(String provider) { |
三、Location
Location,位置信息,通过Location可以获取时间、经纬度、海拔等位置信息。上面采用locationListener里面的onLocationChanged()来获取location,下面讲述如何主动获取location。
1 | Location location=locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); |
2 | system.out.println( "时间:" +location.getTime()); |
3 | system.out.println( "经度:" +location.getLongitude()); |
注意:Location location=new Location(LocationManager.GPS_PROVIDER)方式获取的location的各个参数值都是为0。
四、GpsStatus.Listener
GpsStatus.Listener ,GPS状态监听,包括GPS启动、停止、第一次定位、卫星变化等事件。
02 |
GpsStatus.Listener listener = new GpsStatus.Listener() { |
03 |
public void onGpsStatusChanged( int event) { |
06 |
case GpsStatus.GPS_EVENT_FIRST_FIX: |
10 |
case GpsStatus.GPS_EVENT_SATELLITE_STATUS: |
13 |
GpsStatus gpsStatus=lm.getGpsStatus( null ); |
15 |
int maxSatellites = gpsStatus.getMaxSatellites(); |
17 |
Iterator<GpsSatellite> iters = gpsStatus.getSatellites().iterator(); |
19 |
while (iters.hasNext() && count <= maxSatellites) { |
20 |
GpsSatellite s = iters.next(); |
23 |
System.out.println( "搜索到:" +count+ "颗卫星" ); |
26 |
case GpsStatus.GPS_EVENT_STARTED: |
30 |
case GpsStatus.GPS_EVENT_STOPPED: |
37 | lm.addGpsStatusListener(listener); |
五、GpsStatus
01 | GpsStatus,GPS状态信息,上面在卫星状态变化时,我们就用到了GpsStatus。 |
04 | GpsStatus gpsStatus = locationManager.getGpsStatus( null ); |
06 | int maxSatellites = gpsStatus.getMaxSatellites(); |
08 | int costTime=gpsStatus.getTimeToFirstFix(); |
10 | Iterable<GpsSatellite> iterable=gpsStatus.getSatellites(); |
12 | Iterator<GpsSatellite> itrator=iterable.iterator(); |
六、GpsSatellite
GpsSatellite,定位卫星,包含卫星的方位、高度、伪随机噪声码、信噪比等信息。
02 | Iterable<GpsSatellite> iterable=gpsStatus.getSatellites(); |
04 | Iterator<GpsSatellite> itrator=iterable.iterator(); |
06 | ArrayList<GpsSatellite> satelliteList= new ArrayList<GpsSatellite>(); |
08 | int maxSatellites=gpsStatus.getMaxSatellites(); |
09 | while (itrator.hasNext() && count <= maxSatellites) { |
10 |
GpsSatellite satellite = itrator.next(); |
11 |
satelliteList.add(satellite); |
14 | System.out.println( "总共搜索到" +count+ "颗卫星" ); |
16 | for ( int i= 0 ;i<satelliteList.size();i++){ |
18 |
System.out.println(satelliteList.get(i).getAzimuth()); |
20 |
System.out.println(satelliteList.get(i).getElevation()); |
22 |
System.out.println(satelliteList.get(i).getPrn()); |
24 |
System.out.println(satelliteList.get(i).getSnr()); |
26 |
System.out.println(satelliteList.get(i).hasAlmanac()); |
28 |
System.out.println(satelliteList.get(i).hasEphemeris()); |
30 |
System.out.println(satelliteList.get(i).hasAlmanac()); |
为了便于理解,接下来模拟一个案例,如何在程序代码中使用GPS获取位置信息。
第一步:新建一个Android工程项目,命名为mygps,目录结构如下
第二步:修改main.xml布局文件,修改内容如下:
01 | <? xml version = "1.0" encoding = "utf-8" ?> |
02 | < LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android" |
03 |
android:orientation = "vertical" |
04 |
android:layout_width = "fill_parent" |
05 |
android:layout_height = "fill_parent" > |
06 |
< EditText android:layout_width = "fill_parent" |
07 |
android:layout_height = "wrap_content" |
08 |
android:cursorVisible = "false" |
09 |
android:editable = "false" |
10 |
android:id = "@+id/editText" /> |
第三步:实用Adnroid平台的GPS设备,需要添加上权限
1 | < uses-permission android:name = "android.permission.ACCESS_FINE_LOCATION" /> |
2 | < uses-permission android:name = "android.permission.ACCESS_COARSE_LOCATION" /> |
第四步:修改核心组件activity,修改内容如下
001 | package com.ljq.activity; |
003 | import java.util.Iterator; |
005 | import android.app.Activity; |
006 | import android.content.Context; |
007 | import android.content.Intent; |
008 | import android.location.Criteria; |
009 | import android.location.GpsSatellite; |
010 | import android.location.GpsStatus; |
011 | import android.location.Location; |
012 | import android.location.LocationListener; |
013 | import android.location.LocationManager; |
014 | import android.location.LocationProvider; |
015 | import android.os.Bundle; |
016 | import android.provider.Settings; |
017 | import android.util.Log; |
018 | import android.widget.EditText; |
019 | import android.widget.Toast; |
021 | public class GpsActivity extends Activity { |
022 |
private EditText editText; |
023 |
private LocationManager lm; |
024 |
private static final String TAG= "GpsActivity" ; |
027 |
protected void onDestroy() { |
030 |
lm.removeUpdates(locationListener); |
036 |
public void onCreate(Bundle savedInstanceState) { |
037 |
super .onCreate(savedInstanceState); |
038 |
setContentView(R.layout.main); |
040 |
editText=(EditText)findViewById(R.id.editText); |
041 |
lm=(LocationManager)getSystemService(Context.LOCATION_SERVICE); |
044 |
if (!lm.isProviderEnabled(LocationManager.GPS_PROVIDER)){ |
045 |
Toast.makeText( this , "请开启GPS导航..." , Toast.LENGTH_SHORT).show(); |
047 |
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); |
048 |
startActivityForResult(intent, 0 ); |
053 |
String bestProvider = lm.getBestProvider(getCriteria(), true ); |
056 |
Location location= lm.getLastKnownLocation(bestProvider); |
059 |
lm.addGpsStatusListener(listener); |
069 |
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000 , 1 , locationListener); |
073 |
private LocationListener locationListener= new LocationListener() { |
078 |
public void onLocationChanged(Location location) { |
080 |
Log.i(TAG, "时间:" +location.getTime()); |
081 |
Log.i(TAG, "经度:" +location.getLongitude()); |
082 |
Log.i(TAG, "纬度:" +location.getLatitude()); |
083 |
Log.i(TAG, "海拔:" +location.getAltitude()); |
089 |
public void onStatusChanged(String provider, int status, Bundle extras) { |
092 |
case LocationProvider.AVAILABLE: |
093 |
Log.i(TAG, "当前GPS状态为可见状态" ); |
096 |
case LocationProvider.OUT_OF_SERVICE: |
097 |
Log.i(TAG, "当前GPS状态为服务区外状态" ); |
100 |
case LocationProvider.TEMPORARILY_UNAVAILABLE: |
101 |
Log.i(TAG, "当前GPS状态为暂停服务状态" ); |
109 |
public void onProviderEnabled(String provider) { |
110 |
Location location=lm.getLastKnownLocation(provider); |
117 |
public void onProviderDisabled(String provider) { |
125 |
GpsStatus.Listener listener = new GpsStatus.Listener() { |
126 |
public void onGpsStatusChanged( int event) { |
129 |
case GpsStatus.GPS_EVENT_FIRST_FIX: |
133 |
case GpsStatus.GPS_EVENT_SATELLITE_STATUS: |
136 |
GpsStatus gpsStatus=lm.getGpsStatus( null ); |
138 |
int maxSatellites = gpsStatus.getMaxSatellites(); |
140 |
Iterator<GpsSatellite> iters = gpsStatus.getSatellites().iterator(); |
142 |
while (iters.hasNext() && count <= maxSatellites) { |
143 |
GpsSatellite s = iters.next(); |
146 |
System.out.println( "搜索到:" +count+ "颗卫星" ); |
149 |
case GpsStatus.GPS_EVENT_STARTED: |
153 |
case GpsStatus.GPS_EVENT_STOPPED: |
165 |
private void updateView(Location location){ |
167 |
editText.setText( "设备位置信息\n\n经度:" ); |
168 |
editText.append(String.valueOf(location.getLongitude())); |
169 |
editText.append( "\n纬度:" ); |
170 |
editText.append(String.valueOf(location.getLatitude())); |
173 |
editText.getEditableText().clear(); |
181 |
private Criteria getCriteria(){ |
182 |
Criteria criteria= new Criteria(); |
184 |
criteria.setAccuracy(Criteria.ACCURACY_FINE); |
186 |
criteria.setSpeedRequired( false ); |
188 |
criteria.setCostAllowed( false ); |
190 |
criteria.setBearingRequired( false ); |
192 |
criteria.setAltitudeRequired( false ); |
194 |
criteria.setPowerRequirement(Criteria.POWER_LOW); |
转载于:https://blog.51cto.com/andywuchuanlong/1288030