1、LocationMangager:位置管理器。要想操作定位相关设备,必须先定义个LocationManager。
我们可以通过如下代码创建LocationManger对象。
LocationManger locationManager=(LocationManager)this.getSystemService(Context.LOCATION_SERVICE);
LocationManager.GPS_PROVIDER:使用GPS定位
LocationManager.NETWORK_PROVIDER:使用网络定位
在用GPS之前,首先判断GPS模块是否存在或者开启
private void openGPSSettings() {
LocationManager lm= (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
if (lm.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) {
Toast.makeText(this, "GPS模块正常", Toast.LENGTH_SHORT).show();
return;
}
Toast.makeText(this, "请开启GPS!", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Settings.ACTION_SECURITY_SETTINGS);
startActivityForResult(intent,0); //此为设置完成后返回到获取界面
}
2、LocationListener
LocationListener:位置监听,监听位置变化,监听设备开关与状态。
// 位置监听器
LocationListener locationListener = new LocationListener() {
// Provider状态改变时触发
public void onStatusChanged(String provider, int status,
Bundle extras) {
Log.i(TAG, "onStatusChanged()");
}
// Provider可用时触发
public void onProviderEnabled(String provider) {
Log.i(TAG, "onProviderEnabled : " + provider);
}
// Provider失效时触发
public void onProviderDisabled(String provider) {
Log.i(TAG, "onProviderDisabled : " + provider);
}
// 当位置改变时触发
public void onLocationChanged(Location location) {
Log.i(TAG, location.toString());
}
};
//1s更新一次
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000, 0, locationListener);
3、Location
Location:位置信息,通过Location可以获取时间、经纬度、海拔等位置信息。上面采用locationListener里面的onLocationChanged()来获取location,下面讲述如何主动获取location。
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
或者:
// 定义Criteria对象
Criteria criteria = new Criteria();
// 设置定位精确度 Criteria.ACCURACY_COARSE 比较粗略 Criteria.ACCURACY_FINE则比较精细
criteria.setAccuracy(Criteria.ACCURACY_FINE);
// 设置是否需要海拔信息 Altitude
criteria.setAltitudeRequired(true);
// 设置是否需要全方位信息 Bearing
criteria.setBearingRequired(true);
// 设置是否运行运行商收费
criteria.setCostAllowed(true);
// 设置对电源的需求
criteria.setPowerRequirement(Criteria.POWER_LOW);
获取GPS信息提供者
String bestProvider = locationManager.getBestProvider(criteria,true);
Location location = locationManager.getLastKnownLocation(bestProvider);
location.getTime(); //获取时间
location.getLongitude();//获取经度
location.getLatitude(); //获取纬度
4、GpsStatus.Listener
GpsStatus.Listener:GPS状态监听,包括GPS启动、停止、第一次定位、卫星变化等事件。
//状态监听
GpsStatus.Listener listener = new GpsStatus.Listener() {
public void onGpsStatusChanged(int event) {
switch (event) {
//第一次定位
case GpsStatus.GPS_EVENT_FIRST_FIX:
Log.i(TAG, "第一次定位");
break;
//卫星状态改变
case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
Log.i(TAG, "卫星状态改变");
//获取当前状态
GpsStatus gpsStatus=lm.getGpsStatus(null);
//获取卫星颗数的默认最大值
int maxSatellites = gpsStatus.getMaxSatellites();
//创建一个迭代器保存所有卫星
Iterator<GpsSatellite> iters =
gpsStatus.getSatellites().iterator();
int count = 0;
while (iters.hasNext() && count <= maxSatellites) {
GpsSatellite s = iters.next();
count++;
}
System.out.println("搜索到:"+count+"颗卫星");
break;
//定位启动
case GpsStatus.GPS_EVENT_STARTED:
Log.i(TAG, "定位启动");
break;
//定位结束
case GpsStatus.GPS_EVENT_STOPPED:
Log.i(TAG, "定位结束");
break;
}
};
};
//绑定监听状态
lm.addGpsStatusListener(listener);
5、GpsStatus
GpsStatus:GPS状态信息,上面在卫星状态变化时,我们就用到了GpsStatus。
//实例化
GpsStatus gpsStatus = locationManager.getGpsStatus(null); // 获取当前状态
//获取默认最大卫星数
int maxSatellites = gpsStatus.getMaxSatellites();
//获取第一次定位时间(启动到第一次定位)
int costTime=gpsStatus.getTimeToFirstFix();
//获取卫星
Iterable<GpsSatellite> iterable=gpsStatus.getSatellites();
//一般再次转换成Iterator
Iterator<GpsSatellite> itrator=iterable.iterator();
6、GpsSatellite
GpsSatellite,定位卫星,包含卫星的方位、高度、伪随机噪声码、信噪比等信息。
//获取卫星
Iterable<GpsSatellite> iterable=gpsStatus.getSatellites();
//再次转换成Iterator
Iterator<GpsSatellite> itrator=iterable.iterator();
//通过遍历重新整理为ArrayList
ArrayList<GpsSatellite> satelliteList=new ArrayList<GpsSatellite>();
int count=0;
int maxSatellites=gpsStatus.getMaxSatellites();
while (itrator.hasNext() && count <= maxSatellites) {
GpsSatellite satellite = itrator.next();
satelliteList.add(satellite);
count++;
}
System.out.println("总共搜索到"+count+"颗卫星");
//输出卫星信息
for(int i=0;i<satelliteList.size();i++){
//卫星的方位角,浮点型数据
System.out.println(satelliteList.get(i).getAzimuth());
//卫星的高度,浮点型数据
System.out.println(satelliteList.get(i).getElevation());
//卫星的伪随机噪声码,整形数据
System.out.println(satelliteList.get(i).getPrn());
//卫星的信噪比,浮点型数据
System.out.println(satelliteList.get(i).getSnr());
//卫星是否有年历表,布尔型数据
System.out.println(satelliteList.get(i).hasAlmanac());
//卫星是否有星历表,布尔型数据
System.out.println(satelliteList.get(i).hasEphemeris());
//卫星是否被用于近期的GPS修正计算
System.out.println(satelliteList.get(i).hasAlmanac());
}
可能用到的权限:
//设置定位精确度 Criteria.ACCURACY_COARSE 比较粗略 Criteria.ACCURACY_FINE则比较精细。下面两个权限根据自己前面用的定位精确度选择
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
//使用网络权限
<uses-permission android:name="android.permission.INTERNET"/>
//允许程序创建模拟位置提供用于测试
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
演示小例子:使用Android自带gps定位,每5s更新一次显示的位置。
MainActivity.java
public class MainActivity extends Activity {
private TextView tv1;
private Button b1;
Location location;
private static String TAG = MainActivity.class.getSimpleName();
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(TAG, "onCreate()");
b1 = (Button) findViewById(R.id.button1);
tv1 = (TextView) findViewById(R.id.textView1);
// 获取LocationManager(位置管理器)对象
LocationManager locationManager = (LocationManager) this
.getSystemService(Context.LOCATION_SERVICE);
// 定义Criteria对象
Criteria criteria = new Criteria();
// 设置定位精确度 Criteria.ACCURACY_COARSE 比较粗略 Criteria.ACCURACY_FINE则比较精细
criteria.setAccuracy(Criteria.ACCURACY_FINE);
// 设置是否需要海拔信息 Altitude
criteria.setAltitudeRequired(true);
// 设置是否需要全方位信息 Bearing
criteria.setBearingRequired(true);
// 设置是否运行运行商收费
criteria.setCostAllowed(true);
// 设置对电源的需求
criteria.setPowerRequirement(Criteria.POWER_LOW);
//获取GPS信息提供者
String bestProvider = locationManager.getBestProvider(criteria,
true);
Log.i(TAG, "bestProvider = " + bestProvider);
// 通过GPS主动获取定位信息
location = locationManager
.getLastKnownLocation(bestProvider);
// 给按钮绑定点击监听器
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.i(TAG, "按钮监听事件");
updateLocation(location);
}
});
// 位置监听器
LocationListener locationListener = new LocationListener() {
// Provider状态改变时触发
public void onStatusChanged(String provider, int status,
Bundle extras) {
Log.i(TAG, "onStatusChanged()");
}
// Provider可用时触发
public void onProviderEnabled(String provider) {
Log.i(TAG, "onProviderEnabled : " + provider);
}
// Provider失效时触发
public void onProviderDisabled(String provider) {
Log.i(TAG, "onProviderDisabled : " + provider);
}
// 当位置改变时触发
public void onLocationChanged(Location location) {
Log.i(TAG, location.toString());
updateLocation(location);
}
};
// 5s更新一次,忽略位置变化
locationManager.requestLocationUpdates(bestProvider,
5000, 0, locationListener);
}
// 更新位置信息
private void updateLocation(Location location) {
if (location != null) {
tv1.setText("定位对象信息如下:" + location.toString() + "\r\n其中经度:"
+ location.getLongitude() + "\r\n 其中纬度:"
+ location.getLatitude());
} else {
Log.i(TAG, "没有获取到定位对象Location ");
}
}
}
Xml布局文件只有一个Button和一个 TextView,没有贴出。
清单文件:AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
使用高德地图定位见:http://blog.csdn.net/h573406032/article/details/22804217
使用百度地图定位见:http://developer.baidu.com/map/geosdk.htm