先说说生活中主要用的定位方式
1.网络定位:根据ip地址定位
ip地址和实际地址形成一个数据库(纯真ip数据库),可以根据ip在数据库中查出具体地址,警方使用此方法破案
缺点:ip地址动态分配会导致不准确
2.基站定位
三个基站,能确定一点,所以在城市较好定位
范围:几百米到几公里不等,范围比较广
3.GPS定位,美国的卫星定位
至少需要三颗卫星
GPS使用24颗卫星,基本可以覆盖全球90%地区
范围:几米-几十米
缺点:容易受云层,建筑,等干扰
4.A-GPS 辅助GPS定位系统,通过网络和GPS共同定位,一般Android手机都采用此种定位方式
程序:建包service
创建LocationService.class文件
public class LocationService extends Service {
private LocationManager lm;
private MyLocationListener listener;
private SharedPreferences mPref;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
mPref = getSharedPreferences("config", MODE_PRIVATE);
lm = (LocationManager) getSystemService(LOCATION_SERVICE);
List<String> allProviders = lm.getAllProviders();// 获取所有位置提供者
// System.out.println(allProviders);//有两个位置提供者passive和GPS
Criteria criteria = new Criteria();
criteria.setCostAllowed(true);// 是否允许付费,比如使用3g网络定位
criteria.setAccuracy(Criteria.ACCURACY_FINE);
// 获取最佳位置提供者
String bestProvider = lm.getBestProvider(criteria, true);
listener = new MyLocationListener();
// 参数1表示位置提供者,2表示最短更新时间,3表示最短更新距离
lm.requestLocationUpdates(bestProvider, 0, 0, listener);
}
class MyLocationListener implements LocationListener {
// 位置发生变化
public void onLocationChanged(Location location) {
System.out.println("get location!!!");
double longitude = location.getLongitude();// 经度
double latitude = location.getLatitude();// 纬度
//将获取的location保存在mpref中
mPref.edit()
.putString("location", "j:" + longitude + "; w:" + latitude)
.commit();
stopSelf();
}
// 位置提供者状态发生变化
public void onStatusChanged(String provider, int status, Bundle extras) {
}
// 位置打开GPS
public void onProviderEnabled(String provider) {
}
// 用户关闭GPS
@Override
public void onProviderDisabled(String provider) {
}
}
@Override
public void onDestroy() {
super.onDestroy();
// 当activity销毁的时,停止更新位置,节省电量
lm.removeUpdates(listener);
}
}
最后记得添加相应的权限
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />