AndroidGPS和基站定位
2017-10-03 17:36
363 查看
最近项目中需要实现一个简单的定位功能,网上搜索了一大堆文章,最后只总结了两种定位方式。一种是GPS定位,另一种是基站定位。下面分别说说这两种定位的优缺点以及具体实现。
一:GPS定位
优点:定位准确、并且在没有网络的情况下也可以定位。
缺点:有遮盖物的时候定不到位,亲测有时候在室内定位不到。
代码部分:
`locationListener = new LocationListener() {
二:基站定位
优点:有网络就能定位,受覆盖物影响较小。
缺点:定位没有GPS准确。
代码部分:
最后附上在网上搜到的个人感觉封装的很好的一个定位的工具类:
这里面还有个WIFI定位,亲测用不了,就是谷歌的这个http://www.google.com/loc/json接口停止使用的问题,如果大家有好的关于WIFI定位的demo请私信我~互相学习!
一:GPS定位
优点:定位准确、并且在没有网络的情况下也可以定位。
缺点:有遮盖物的时候定不到位,亲测有时候在室内定位不到。
代码部分:
`locationListener = new LocationListener() {
@Override public void onLocationChanged(Location location) { //位置信息变化时触发 Log.e(TAG, "纬度:"+location.getLatitude()); Log.e(TAG, "经度:"+location.getLongitude()); Log.e(TAG, "海拔:"+location.getAltitude()); Log.e(TAG, "时间:"+location.getTime()); } @Override public void onStatusChanged(String provider, int status,Bundle extras) { //GPS状态变化时触发 } @Override public void onProviderEnabled(String provider) { //GPS禁用时触发 } @Override public void onProviderDisabled(String provider) { //GPS开启时触发 } }; /** * 绑定监听 * 参数1,设备:有GPS_PROVIDER和NETWORK_PROVIDER两种,前者是GPS,后者是GPRS以及WIFI定位 * 参数2,位置信息更新周期.单位是毫秒 * 参数3,位置变化最小距离:当位置距离变化超过此值时,将更新位置信息 * 参数4,监听 * 备注:参数2和3,如果参数3不为0,则以参数3为准;参数3为0,则通过时间来定时更新;两者为0,则随时刷新 */ locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);`
二:基站定位
优点:有网络就能定位,受覆盖物影响较小。
缺点:定位没有GPS准确。
代码部分:
locationListener = new LocationListener() { @Override public void onLocationChanged(Location location) { //位置信息变化时触发 Log.e(TAG, "纬度:"+location.getLatitude()); Log.e(TAG, "经度:"+location.getLongitude()); Log.e(TAG, "海拔:"+location.getAltitude()); Log.e(TAG, "时间:"+location.getTime()); tv_gps_longitude.setText(location.getLongitude() + ""); tv_gps_latitude.setText(location.getLatitude() + ""); } @Override public void onStatusChanged(String provider, int status,Bundle extras) { //GPS状态变化时触发 } @Override public void onProviderEnabled(String provider) { //GPS禁用时触发 } @Override public void onProviderDisabled(String provider) { //GPS开启时触发 } }; /** * 绑定监听 * 参数1,设备:有GPS_PROVIDER和NETWORK_PROVIDER两种,前者是GPS,后者是GPRS以及WIFI定位 * 参数2,位置信息更新周期.单位是毫秒 * 参数3,位置变化最小距离:当位置距离变化超过此值时,将更新位置信息 * 参数4,监听 * 备注:参数2和3,如果参数3不为0,则以参数3为准;参数3为0,则通过时间来定时更新;两者为0,则随时刷新 */ locationManager.requestLocationUpdates(LocationManager.LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
最后附上在网上搜到的个人感觉封装的很好的一个定位的工具类:
public class LocationUtil{ private static final String TAG = "LocationUtil"; private static LocationUtil instance; private static Activity mActivity; private static LocationManager locationManager; private static LocationListener locationListener; public static LocationUtil getInstance(Activity activity){ mActivity = activity; if(instance==null){ instance = new LocationUtil(); } locationManager = (LocationManager)mActivity.getSystemService(Context.LOCATION_SERVICE); return instance; } /** * 判断GPS导航是否打开. * false:弹窗提示打开,不建议采用在后台强行开启的方式。 * true:不做任何处理 * @return */ public static void isOpenGPS(){ if (!locationManager.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)){ AlertDialog.Builder dialog = new AlertDialog.Builder(mActivity); dialog.setMessage("GPS未打开,是否打开?"); dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); // 设置完成后返回到原来的界面 mActivity.startActivityForResult(intent, 0); } }); dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); dialog.show(); } } /** * 通过LocationListener来获取Location信息 GPS定位 */ public static void formListenerGetLocation(final TextView tv_gps_longitude, final TextView tv_gps_latitude){ locationListener = new LocationListener() { @Override public void onLocationChanged(Location location) { //位置信息变化时触发 Log.e(TAG, "纬度:"+location.getLatitude()); Log.e(TAG, "经度:"+location.getLongitude()); Log.e(TAG, "海拔:"+location.getAltitude()); Log.e(TAG, "时间:"+location.getTime()); tv_gps_longitude.setText(location.getLongitude() + ""); tv_gps_latitude.setText(location.getLatitude() + ""); } @Override public void onStatusChanged(String provider, int status,Bundle extras) { //GPS状态变化时触发 } @Override public void onProviderEnabled(String provider) { //GPS禁用时触发 } @Override public void onProviderDisabled(String provider) { //GPS开启时触发 } }; /** * 绑定监听 * 参数1,设备:有GPS_PROVIDER和NETWORK_PROVIDER两种,前者是GPS,后者是GP bd98 RS以及WIFI定位 * 参数2,位置信息更新周期.单位是毫秒 * 参数3,位置变化最小距离:当位置距离变化超过此值时,将更新位置信息 * 参数4,监听 * 备注:参数2和3,如果参数3不为0,则以参数3为准;参数3为0,则通过时间来定时更新;两者为0,则随时刷新 */ locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); } /** * 主动获取Location,通过以下方法获取到的是最后一次定位信息。 * 注意:Location location=new Location(LocationManager.GPS_PROVIDER)方式获取的location的各个参数值都是为0。 基站 */ public static void getLocation(final TextView tv_jizhan_longitude, final TextView tv_jizhan_latitude){ Location location=locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); Log.e(TAG, "纬度:"+location.getLatitude()); Log.e(TAG, "经度:"+location.getLongitude()); Log.e(TAG, "海拔:"+location.getAltitude()); Log.e(TAG, "时间:"+location.getTime()); tv_jizhan_longitude.setText(location.getLongitude() + ""); tv_jizhan_latitude.setText(location.getLatitude() + ""); } /** * 获取GPS状态监听,包括GPS启动、停止、第一次定位、卫星变化等事件。 */ public static void getStatusListener(){ GpsStatus.Listener listener = new GpsStatus.Listener(){ @Override public void onGpsStatusChanged(int event) { if(event==GpsStatus.GPS_EVENT_FIRST_FIX){ //第一次定位 }else if(event==GpsStatus.GPS_EVENT_SATELLITE_STATUS){ //卫星状态改变 GpsStatus gpsStauts= locationManager.getGpsStatus(null); // 取当前状态 int maxSatellites = gpsStauts.getMaxSatellites(); //获取卫星颗数的默认最大值 Iterator<GpsSatellite> it = gpsStauts.getSatellites().iterator();//创建一个迭代器保存所有卫星 int count = 0; while (it.hasNext() && count <= maxSatellites) { count++; GpsSatellite s = it.next(); } Log.e(TAG, "搜索到:"+count+"颗卫星"); }else if(event==GpsStatus.GPS_EVENT_STARTED){ //定位启动 }else if(event==GpsStatus.GPS_EVENT_STOPPED){ //定位结束 } } }; //绑定 locationManager.addGpsStatusListener(listener); } /** * 获取所有卫星状态 * @return */ public static List<GpsSatellite> getGpsStatus(){ List<GpsSatellite> result = new ArrayList<GpsSatellite>(); GpsStatus gpsStatus = locationManager.getGpsStatus(null); // 取当前状态 //获取默认最大卫星数 int maxSatellites = gpsStatus.getMaxSatellites(); //获取第一次定位时间(启动到第一次定位) int costTime=gpsStatus.getTimeToFirstFix(); Log.e(TAG, "第一次定位时间:"+costTime); //获取卫星 Iterable<GpsSatellite> iterable=gpsStatus.getSatellites(); //一般再次转换成Iterator Iterator<GpsSatellite> itrator=iterable.iterator(); int count = 0; while (itrator.hasNext() && count <= maxSatellites){ count++; GpsSatellite s = itrator.next(); result.add(s); } return result; } /** * 某一个卫星的信息. * @param gpssatellite */ public static void getGpsStatelliteInfo(GpsSatellite gpssatellite){ //卫星的方位角,浮点型数据 Log.e(TAG, "卫星的方位角:"+gpssatellite.getAzimuth()); //卫星的高度,浮点型数据 Log.e(TAG, "卫星的高度:"+gpssatellite.getElevation()); //卫星的伪随机噪声码,整形数据 Log.e(TAG, "卫星的伪随机噪声码:"+gpssatellite.getPrn()); //卫星的信噪比,浮点型数据 Log.e(TAG, "卫星的信噪比:"+gpssatellite.getSnr()); //卫星是否有年历表,布尔型数据 Log.e(TAG, "卫星是否有年历表:"+gpssatellite.hasAlmanac()); //卫星是否有星历表,布尔型数据 Log.e(TAG, "卫星是否有星历表:"+gpssatellite.hasEphemeris()); //卫星是否被用于近期的GPS修正计算 Log.e(TAG, "卫星是否被用于近期的GPS修正计算:"+gpssatellite.hasAlmanac()); } }
这里面还有个WIFI定位,亲测用不了,就是谷歌的这个http://www.google.com/loc/json接口停止使用的问题,如果大家有好的关于WIFI定位的demo请私信我~互相学习!
相关文章推荐
- android gps wifi 基站 定位集合
- android gps wifi 基站定位
- android gps ,wifi ,基站定位集合
- Android附近基站+Wifi+IP+GPS多渠道定位方案
- android GPS定位,基站定位,WIFI定位开关的控制
- android下GPS基站定位
- android GPS定位,基站定位,WIFI定位开关的控制 (转)
- android 基站定位和gps定位个人体验
- 通过SIM卡获取GPS,android基站定位原理
- Android gps wifi 基站 定位集合
- Android基站定位
- 电脑上安装的android虚拟机,能进行基站定位和GPS定位吗?要怎么做才能定位?(转)
- android 基站定位
- 基站定位和GPS定位区别和优势
- 手机自带的显示基站命令(android手机定位,iphone基站定位)
- Android 关于定位中的那点事(GPS,GPGGA,NMEA-0183,RTCM)
- Android编程之实现GPS定位
- Android客户端GPS定位
- Android Service获取当前位置(GPS+基站)