android 基于GPS或网络定位学习(LocationManager)
2017-04-11 11:31
701 查看
1.定位概念
在Android系统上实现定位主要是通过GPS或者是基于网络的定位方法。
GPS是精度最高的,但是它只在户外有用,并且很耗电,并且首次定位花费时间较长。
基于网络的定位利用通信网络蜂窝基站和Wi-Fi信号,这种定位方式在室内室外都能用,响应时间较短,耗电较少,但是精度较差。
为了在应用中获得用户的信息,你的LocationProvider可以是GPS或者基于网络,也可以两者都用。
2.请求位置更新
在Android中获取位置主要是通过回调函数LocationListener。
首先通过LocationManager的 requestLocationUpdates()方法注册监听器,向其中传入一个实现了LocationListener接口的对象。
你的 LocationListener对象中必须实现一些回调函数,当用户位置改变或者当服务状态改变时,LocationManager就会调用这些回调函数。
requestLocationUpdates()中的第一个参数指明了LocationProvider的类型,第二个参数是位置刷新时间间隔,第三个参数是通知的最小的改变距离。
如果第二个和第三个参数都设置成0就表示要尽可能频繁地请求位置通知。
最后一个参数是用户自己定义的实现了LocationListener接口的对象,它接收位置更新的回调。
如果想要同时利用GPS和网络定位,可以调用requestLocationUpdates()两次,第一个参数分别是GPS_PROVIDER和 NETWORK_PROVIDER。
3.权限设置
如果没有权限设置,程序在请求位置更新时将会失败。
// 对应网络定位
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
// 对于GPS定位
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
如果用NETWROK_PROVIDER, 那么需要声明 ACCESS_COARSE_LOCATION和INTERNET
如果用GPS_PROVIDER, 那么需要声明 ACCESS_FINE_LOCATION
ACCESS_FINE_LOCATION是包含了ACCESS_COARSE_LOCATION的,所以两者都用时可以只声明ACCESS_FINE_LOCATION。
4.Criteria用于查找最优Provider
应用程序可能需要获得最优的Provider,所以需要使用过滤条件Criteria 通过LocationManageer.getBestProvider(Criteria Criteria,boolean)来获取。
Criteria中的每个方法都是一个过滤条件
5.例子
AndroidTest.zip (4.4 MB)
下载次数: 7
在Android系统上实现定位主要是通过GPS或者是基于网络的定位方法。
GPS是精度最高的,但是它只在户外有用,并且很耗电,并且首次定位花费时间较长。
基于网络的定位利用通信网络蜂窝基站和Wi-Fi信号,这种定位方式在室内室外都能用,响应时间较短,耗电较少,但是精度较差。
为了在应用中获得用户的信息,你的LocationProvider可以是GPS或者基于网络,也可以两者都用。
2.请求位置更新
在Android中获取位置主要是通过回调函数LocationListener。
首先通过LocationManager的 requestLocationUpdates()方法注册监听器,向其中传入一个实现了LocationListener接口的对象。
你的 LocationListener对象中必须实现一些回调函数,当用户位置改变或者当服务状态改变时,LocationManager就会调用这些回调函数。
requestLocationUpdates()中的第一个参数指明了LocationProvider的类型,第二个参数是位置刷新时间间隔,第三个参数是通知的最小的改变距离。
如果第二个和第三个参数都设置成0就表示要尽可能频繁地请求位置通知。
最后一个参数是用户自己定义的实现了LocationListener接口的对象,它接收位置更新的回调。
如果想要同时利用GPS和网络定位,可以调用requestLocationUpdates()两次,第一个参数分别是GPS_PROVIDER和 NETWORK_PROVIDER。
3.权限设置
如果没有权限设置,程序在请求位置更新时将会失败。
// 对应网络定位
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
// 对于GPS定位
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
如果用NETWROK_PROVIDER, 那么需要声明 ACCESS_COARSE_LOCATION和INTERNET
如果用GPS_PROVIDER, 那么需要声明 ACCESS_FINE_LOCATION
ACCESS_FINE_LOCATION是包含了ACCESS_COARSE_LOCATION的,所以两者都用时可以只声明ACCESS_FINE_LOCATION。
4.Criteria用于查找最优Provider
应用程序可能需要获得最优的Provider,所以需要使用过滤条件Criteria 通过LocationManageer.getBestProvider(Criteria Criteria,boolean)来获取。
Criteria中的每个方法都是一个过滤条件
5.例子
package com.test.activity; import android.app.Activity; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.widget.TextView; import com.test.R; /** * 定位例子 */ public class LocationActivity extends Activity implements LocationListener { private LocationManager locationManager; private TextView tvOutput; private String best; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mainactivity); // 从系统服务中获得位置管理器 locationManager = (LocationManager) this .getSystemService(LOCATION_SERVICE); tvOutput = (TextView) findViewById(R.id.location); // 获取最好的provider getBestProvider(); // 获取最近信息 Location location = locationManager .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); showLocationInfo(location); // 每三秒刷新一次位置 locationManager.requestLocationUpdates(best, 3000, 8, this); } private void getBestProvider(){ // 定义规则 用于查找最适合的Criteria Criteria criteria = new Criteria(); // 免费的 criteria.setCostAllowed(false); // 精确要求 criteria.setAccuracy(Criteria.ACCURACY_FINE); // 获得最合适的提供者 best = locationManager.getBestProvider(criteria, true); } // 显示位置信息 public void showLocationInfo(Location location) { StringBuffer sb = new StringBuffer(""); if (location != null) { sb.append("\n 经度:" + location.getLongitude()); sb.append("\n 纬度:" + location.getLatitude()); } tvOutput.setText(sb.toString()); } // 位置改变时获得坐标 @Override public void onLocationChanged(Location location) { showLocationInfo(location); } // 暂停时删除更新位置 @Override protected void onPause() { super.onPause(); locationManager.removeUpdates(this); } // 恢复时请求更新位置 @Override protected void onResume() { super.onResume(); } @Override public void onProviderDisabled(String arg0) { showLocationInfo(null); } @Override public void onProviderEnabled(String provider) { showLocationInfo(locationManager.getLastKnownLocation(provider)); } @Override public void onStatusChanged(String arg0, int arg1, Bundle arg2) { } }
AndroidTest.zip (4.4 MB)
下载次数: 7
相关文章推荐
- 教程:实现Android的不同精度的定位(基于网络和GPS)
- 实现Android的不同精度的定位(基于网络和GPS)
- 实现Android的不同精度的定位(基于网络和GPS)
- 实现Android的不同精度的定位(基于网络和GPS)
- 实现Android的不同精度的定位(基于网络和GPS)
- 实现Android的不同精度的定位(基于网络和GPS)
- Android学习之使用手机网络和GPS定位
- android中基于网络和GPS的不同精度定位
- 教程:实现Android的不同精度的定位(基于网络和GPS)
- 教程:实现Android的不同精度的定位(基于网络和GPS)
- 实现Android的不同精度的定位(基于网络和GPS)转
- 实现Android的不同精度的定位(基于网络和GPS)
- 教程:实现Android的不同精度的定位(基于网络和GPS)
- 【android】网络定位服务NetworkLocationProvider
- LocationManager Android自动定位使用以及注意事项(个人)
- android网络-GPS获取定位信息
- Android手机GPS卫星定位与通过WLAN与移动网络定位的区别?
- android 网络定位失败 location为null的真正原因
- Android 学习意外第五季<2>——google GPS定位由经纬度转换地址信息
- Android学习之 GPS定位