手机定位基于以下三种方式:1. 网络定位 ;2. 基站定位; 3. GPS定位
1 网络定位
前提是必须连上网络:Wifi、3G、2G
获取到IP地址
例如:彩虹版QQ,珊瑚虫版QQ,就有一个功能显示对方的IP;
根据IP显示具体的位置;
原理是建立一个库那个IP地址对应那个地方;早期警方破案就采用此特点;
有局限性:针对固定的IP地址。
如果手机网或者ip地址是动态分布IP,这个偏差就很大。这种情况是无法满足需求的。
2 基站定位
工作原理:手机能打电话,是需要基站的。手机定位也是用基站的。
手机附近能收到3个基站的信号,就可以定位了。
基站定位有可能很准确,比如基站多的地方;
如果基站少的话就会相差很大。
精确度:几十米到几公里不等;
3 GPS定位
A-GPS 使用了卫星定位 需要联网辅助修正位置(手机经常使用,优先请求网络,获取之前保存的卫星轨道的信息cache,)
特点是:需要搜索卫星, 头顶必须是空旷的;
影响条件:云层、大厦、大树。
以下是实现的代码:
package com.andy.gpsdemo;
import com.example.gpsdemo.R;
import android.support.v7.app.ActionBarActivity;
import android.widget.TextView;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
public class MainActivity extends ActionBarActivity {
// 位置服务
private LocationManager locationManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
/*List<String> provider = locationManager.getAllProviders();
for (String string : provider) {
System.out.println(string);
}*/
// 注册监听位置服务
// 给位置提供者设置条件
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);// 获取精确的位置
// criteria.setAccuracy(Criteria.ACCURACY_FINE);//设置为最大精度
// criteria.setAltitudeRequired(false);//不要求海拔信息
// criteria.setBearingRequired(false);//不要求方位信息
// criteria.setCostAllowed(true);//是否允许付费
// criteria.setPowerRequirement(Criteria.POWER_LOW);//对电量的要求
String proveder = locationManager.getBestProvider(criteria, true);
locationManager.requestLocationUpdates(proveder, 0, 0,
new LocationListener() {
@Override
public void onLocationChanged(Location location) {
// 当改变位置时回调
String longitude = "经度:" + location.getLongitude();
String latitudeString = "维度:" + location.getLatitude();
String accuracy = "精确度:" + location.getAccuracy();
TextView textView = new TextView(MainActivity.this);
textView.setText(longitude + "\n" + latitudeString
+ "\n" + accuracy);
setContentView(textView);
}
@Override
public void onProviderDisabled(String provider) {
// 当一个位置提供者不可以使用
}
@Override
public void onProviderEnabled(String provider) {
// 当一个位置提供者可以使用
}
@Override
public void onStatusChanged(String provider, int status,
Bundle extras) {
// 当状态发生改变的时候回调 开启--关闭 ;关闭--开启
}
});
}
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.andy.gpsdemo.MainActivity" >
<TextView
android:textSize="22sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>
需要加入的权限为:
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>//模拟器测试使用
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
原文:http://blog.csdn.net/fengshizty/article/details/41042267