定位一般分为是:GPS定位,WIFI定位,基站定位 和 AGPS定位
GPS定位
GPS定位需要手机GPS模块硬件支持.GPS走的是卫星通信的通道,在没有网络连接的情况下也能使用,并且通过GPS方式准确度是最高的
但是比较耗电,绝大部分用户默认不开启GPS模块,从GPS模块启动到获取第一次定位数据,可能需要比较长的时间,室内几乎无法使用
网络定位
网络定位是指利用基站或Wi-Fi访问提供近似的位置信息,这种定位方式取决于服务器,即取决于将基站或WIF节点信息翻译成位置信息的服务器 的能力.由于WIFI定位和基站定位都需要使用网络,所以在Android设备上统称为Network网络定位
WIFI定位
根据一个固定的Wifi MAC地址,通过收集到的该Wifi热点的位置,然后访问网络上的定位服务以获得经纬度坐标.因为它
基站定位
各大运营商的基站已经覆盖了全国大部分地区,每个基站的ID号是全球唯一的,只要手机能接收到周围基站的信号(手机有信号),用收到该基站的信号强度当做相对基站的距离,开启流量开关,通过GPRS可以获取到手机连接基站的位置信息
Android获取网络定位的方式?
1.系统原生API,LocationManager,原生API需要使用到Google GMS(Google Mobile Service)中的网络定位服务,而国内目前没有一家通过GMS认证,所以不会有这个服务.以致于通过原生API获取不到网络定位(测试发现 小米能通过原生API获取定位信息,猜测集成了第三方定位服务,也就是如下方式).
2.百度地图SDK、高德地图SDK等SDK(免费),目前部分国内手机通过集成这类定位服务,达到 调用原生API也能获取到网络定位的需求
Android LocationManager 获取当前位置实现:
public class GPSManager {private static final String TAG = "GPSManager";private LocationManager mLocationManager;private Context mContext;public GPSManager(Context context) {mContext = context;mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);}/*** 判断定位服务是否开启*/public boolean isOpen() {boolean gps = mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);// WLAN或移动网络boolean network = mLocationManager.isProviderEnabled(WORK_PROVIDER);if (gps || network) {return true;}return false;}/*** 打开定位服务*/public void openGPS(Context context) {Intent GPSIntent = new Intent();GPSIntent.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvide");GPSIntent.addCategory("android.intent.category.ALTERNATIVE");GPSIntent.setData(Uri.parse("toast:3"));try {//使用PendingIntent发送广播告诉手机去开启GPS功能PendingIntent.getBroadcast(context, 0, GPSIntent, 0).send();} catch (PendingIntent.CanceledException e) {e.printStackTrace();}}/*** 获取经纬度信息*/public void getGPSConfi(Activity activity) {if (ActivityCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&ActivityCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 0);return;}Location location;if (mLocationManager.isProviderEnabled(WORK_PROVIDER)) {mLocationManager.requestLocationUpdates(WORK_PROVIDER, 1000, 0, mLocationListener);location = mLocationManager.getLastKnownLocation(WORK_PROVIDER);} else {mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, mLocationListener);location = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);}if (location != null) {double latitude = location.getLatitude();double longitude = location.getLongitude();Log.d(TAG, "经纬度:" + latitude + "--" + longitude);} else {Log.d(TAG, "未获取到经纬度数据");}}private LocationListener mLocationListener = new LocationListener() {@Overridepublic void onLocationChanged(Location location) {if (location != null) {double latitude = location.getLatitude();double longitude = location.getLongitude();Log.d(TAG, "onLocationChanged: 经纬度:" + latitude + "--" + longitude);}}@Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {Log.d(TAG, "onStatusChanged: " + provider + " " + status);}@Overridepublic void onProviderEnabled(String provider) {Log.d(TAG, "onProviderEnabled: " + provider);}@Overridepublic void onProviderDisabled(String provider) {Log.d(TAG, "onProviderDisabled: " + provider);}};}
GPSManager gpsManager = new GPSManager(this);gpsManager.isOpen();gpsManager.getGPSConfi(this);
AGPS定位
AGPS(AssistedGPS:辅助全球卫星定位系统)AGPS技术是一种结合了网络基站信息和GPS信息对移动台进行定位的技术,利用基地台代送辅助卫星信息,以缩减GPS芯片获取卫星信号的延迟时间,受遮盖的室内也能借基地台讯号弥补,减轻GPS芯片对卫星的依赖度.和纯GPS、基地台三角定位比较,AGPS能提供范围更广、更省电、速度更快的定位服务,理想误差范围在10公尺以内.堪称目前定位精度最高的一种定位技术.