三种获取手机的位置的方式
1、网络定位(network)。前提是必须连上网络:wifi、3G、2G;
获取到IP地址
例如:传美版QQ,彩虹版QQ,珊瑚虫版QQ,就有一个功能显示对方的IP;
根据IP显示具体的位置;
原理是建立一个库那个IP地址对应那个地方;早期警方破案就采用此特点;
有局限性:针对固定的IP地址。
如果手机网或者ip地址是动态分布IP,这个偏差就很大。这种情况是无法满足需求的。
2、基站定位(passive)。
工作原理:手机能打电话,是需要基站的。手机定位也是用基站的。
手机附近能收到3个基站的信号,就可以定位了。
基站定位有可能很准确,比如基站多的地方;
如果基站少的话就会相差很大。
精确度:几十米到几公里不等;
3、GPS定位(gps)。
A-GPS使用了卫星定位 需要联网辅助修正位置
需要3颗卫星;
特点是:需要搜索卫星,头顶必须是空旷的;
影响条件:云层、大厦、大树。
卫星:美国人、欧洲人的卫星。
北斗:中国的,但没有民用,只是在大巴,战机等使用。
精确度:15米左右
代码实现获取手机位置
1.写代码单独创建一个工程(TestGPS)演示;
packagecom.example.testgps;
publicclass MainActivity extends Activity {
private LocationManager lm;
private MyLocationListener listener;
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lm= (LocationManager) getSystemService(LOCATION_SERVICE);
listener= new MyLocationListener();
// 第二个参数:两次位置更新的时间间隔
lm.requestLocationUpdates("gps", 0, 0, listener);
}
class MyLocationListener implementsLocationListener {
// 当位置发生变化 执行者方法
@Override
publicvoid onLocationChanged(Location location) {
String longitude = "经度:" + location.getLongitude() +"\n";
String latitude = "纬度:" + location.getLatitude() +"\n";
String accuracy = "精度:" + location.getAccuracy() +"\n";
TextView textView = newTextView(getApplicationContext());
textView.setText(longitude + latitude +accuracy);
setContentView(textView);
}
// 当某一个位置提供者状态发生变化的时候 关闭--》开启或者开启--》关闭
@Override
publicvoid onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
publicvoid onProviderEnabled(String provider) {
}
@Override
publicvoid onProviderDisabled(String provider) {
}
}
@Override
protected void onDestroy() {
super.onDestroy();
lm.removeUpdates(listener);
listener= null;
}
}
2.权限:
<uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permissionandroid:name="android.permission.ACCESS_MOCK_LOCATION"/>
获取手机位置的细节-火星坐标
准备条件是:得到GPS坐标
1、在ditu.google.cn上输入显示,找出偏移的原因;
2、介绍火星坐标
3、如何解决火星坐标的偏移的问题、创建Java工程使用代码
public static void main(String[] args)throws Exception {
ModifyOffset modifyOffset =ModifyOffset.getInstance(GetHuoxingLocation.class.getResourceAsStream("axisoffset.dat"));
PointDouble double1 =modifyOffset.s2c(newPointDouble(116.35372477, 40.06813447));
System.out.println(double1);
}
代码实现获取手机位置
1、创建服务GPSService 并移植代码到里面面,并优化细节。
2、 优化代码细节
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
Stringprovider = lm.getBestProvider(criteria,true);
lm.requestLocationUpdates(provider, 0, 0,listener);
设置参数细化:
criteria.setAccuracy(Criteria.ACCURACY_FINE);//设置为最大精度
criteria.setAltitudeRequired(false);//不要求海拔信息
criteria.setBearingRequired(false);//不要求方位信息
criteria.setCostAllowed(true);//是否允许付费
criteria.setPowerRequirement(Criteria.POWER_LOW);//对电量的要求