Android之GPS详解
来源:互联网 发布:手机淘宝怎么清理 编辑:程序博客网 时间:2024/06/11 19:36
1、LocationMangager:位置管理器。要想操作定位相关设备,必须先定义个LocationManager。
我们可以通过如下代码创建LocationManger对象。
LocationManger locationManager=(LocationManager)this.getSystemService(Context.LOCATION_SERVICE);
LocationManager.GPS_PROVIDER:使用GPS定位
LocationManager.NETWORK_PROVIDER:使用网络定位
在用GPS之前,首先判断GPS模块是否存在或者开启
private void openGPSSettings() { LocationManager lm= (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);if (lm.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) { Toast.makeText(this, "GPS模块正常", Toast.LENGTH_SHORT).show(); return; } Toast.makeText(this, "请开启GPS!", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(Settings.ACTION_SECURITY_SETTINGS); startActivityForResult(intent,0); //此为设置完成后返回到获取界面 }
2、LocationListener
LocationListener:位置监听,监听位置变化,监听设备开关与状态。
// 位置监听器LocationListener locationListener = new LocationListener() {// Provider状态改变时触发public void onStatusChanged(String provider, int status,Bundle extras) {Log.i(TAG, "onStatusChanged()");}// Provider可用时触发public void onProviderEnabled(String provider) {Log.i(TAG, "onProviderEnabled : " + provider);}// Provider失效时触发public void onProviderDisabled(String provider) {Log.i(TAG, "onProviderDisabled : " + provider);}// 当位置改变时触发public void onLocationChanged(Location location) {Log.i(TAG, location.toString());}}; //1s更新一次 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000, 0, locationListener);
3、Location
Location:位置信息,通过Location可以获取时间、经纬度、海拔等位置信息。上面采用locationListener里面的onLocationChanged()来获取location,下面讲述如何主动获取location。
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
或者:
// 定义Criteria对象Criteria criteria = new Criteria();// 设置定位精确度 Criteria.ACCURACY_COARSE 比较粗略 Criteria.ACCURACY_FINE则比较精细criteria.setAccuracy(Criteria.ACCURACY_FINE);// 设置是否需要海拔信息 Altitudecriteria.setAltitudeRequired(true);// 设置是否需要全方位信息 Bearingcriteria.setBearingRequired(true);// 设置是否运行运行商收费criteria.setCostAllowed(true);// 设置对电源的需求criteria.setPowerRequirement(Criteria.POWER_LOW);获取GPS信息提供者String bestProvider = locationManager.getBestProvider(criteria,true);Location location = locationManager.getLastKnownLocation(bestProvider);location.getTime(); //获取时间location.getLongitude();//获取经度location.getLatitude(); //获取纬度
4、GpsStatus.Listener
GpsStatus.Listener:GPS状态监听,包括GPS启动、停止、第一次定位、卫星变化等事件。
//状态监听 GpsStatus.Listener listener = new GpsStatus.Listener() { public void onGpsStatusChanged(int event) { switch (event) { //第一次定位 case GpsStatus.GPS_EVENT_FIRST_FIX: Log.i(TAG, "第一次定位"); break; //卫星状态改变 case GpsStatus.GPS_EVENT_SATELLITE_STATUS: Log.i(TAG, "卫星状态改变"); //获取当前状态 GpsStatus gpsStatus=lm.getGpsStatus(null); //获取卫星颗数的默认最大值 int maxSatellites = gpsStatus.getMaxSatellites(); //创建一个迭代器保存所有卫星 Iterator<GpsSatellite> iters = gpsStatus.getSatellites().iterator(); int count = 0; while (iters.hasNext() && count <= maxSatellites) { GpsSatellite s = iters.next(); count++; } System.out.println("搜索到:"+count+"颗卫星"); break; //定位启动 case GpsStatus.GPS_EVENT_STARTED: Log.i(TAG, "定位启动"); break; //定位结束 case GpsStatus.GPS_EVENT_STOPPED: Log.i(TAG, "定位结束"); break; } }; };//绑定监听状态lm.addGpsStatusListener(listener);
5、GpsStatus
GpsStatus:GPS状态信息,上面在卫星状态变化时,我们就用到了GpsStatus。
//实例化
GpsStatus gpsStatus = locationManager.getGpsStatus(null); // 获取当前状态
//获取默认最大卫星数
int maxSatellites = gpsStatus.getMaxSatellites();
//获取第一次定位时间(启动到第一次定位)
int costTime=gpsStatus.getTimeToFirstFix();
//获取卫星
Iterable<GpsSatellite> iterable=gpsStatus.getSatellites();
//一般再次转换成Iterator
Iterator<GpsSatellite> itrator=iterable.iterator();
6、GpsSatellite
GpsSatellite,定位卫星,包含卫星的方位、高度、伪随机噪声码、信噪比等信息。
//获取卫星 Iterable<GpsSatellite> iterable=gpsStatus.getSatellites(); //再次转换成Iterator Iterator<GpsSatellite> itrator=iterable.iterator(); //通过遍历重新整理为ArrayList ArrayList<GpsSatellite> satelliteList=new ArrayList<GpsSatellite>(); int count=0; int maxSatellites=gpsStatus.getMaxSatellites(); while (itrator.hasNext() && count <= maxSatellites) { GpsSatellite satellite = itrator.next(); satelliteList.add(satellite); count++; } System.out.println("总共搜索到"+count+"颗卫星"); //输出卫星信息 for(int i=0;i<satelliteList.size();i++){ //卫星的方位角,浮点型数据 System.out.println(satelliteList.get(i).getAzimuth()); //卫星的高度,浮点型数据 System.out.println(satelliteList.get(i).getElevation()); //卫星的伪随机噪声码,整形数据 System.out.println(satelliteList.get(i).getPrn()); //卫星的信噪比,浮点型数据 System.out.println(satelliteList.get(i).getSnr()); //卫星是否有年历表,布尔型数据 System.out.println(satelliteList.get(i).hasAlmanac()); //卫星是否有星历表,布尔型数据 System.out.println(satelliteList.get(i).hasEphemeris()); //卫星是否被用于近期的GPS修正计算 System.out.println(satelliteList.get(i).hasAlmanac()); }
可能用到的权限:
//设置定位精确度 Criteria.ACCURACY_COARSE 比较粗略 Criteria.ACCURACY_FINE则比较精细。下面两个权限根据自己前面用的定位精确度选择 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> //使用网络权限 <uses-permission android:name="android.permission.INTERNET"/> //允许程序创建模拟位置提供用于测试 <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
演示小例子:使用Android自带gps定位,每5s更新一次显示的位置。
MainActivity.java
public class MainActivity extends Activity {private TextView tv1;private Button b1;Location location;private static String TAG = MainActivity.class.getSimpleName();public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.i(TAG, "onCreate()");b1 = (Button) findViewById(R.id.button1);tv1 = (TextView) findViewById(R.id.textView1);// 获取LocationManager(位置管理器)对象LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);// 定义Criteria对象Criteria criteria = new Criteria();// 设置定位精确度 Criteria.ACCURACY_COARSE 比较粗略 Criteria.ACCURACY_FINE则比较精细criteria.setAccuracy(Criteria.ACCURACY_FINE);// 设置是否需要海拔信息 Altitudecriteria.setAltitudeRequired(true);// 设置是否需要全方位信息 Bearingcriteria.setBearingRequired(true);// 设置是否运行运行商收费criteria.setCostAllowed(true);// 设置对电源的需求criteria.setPowerRequirement(Criteria.POWER_LOW); //获取GPS信息提供者 String bestProvider = locationManager.getBestProvider(criteria, true); Log.i(TAG, "bestProvider = " + bestProvider);// 通过GPS主动获取定位信息location = locationManager.getLastKnownLocation(bestProvider);// 给按钮绑定点击监听器b1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubLog.i(TAG, "按钮监听事件");updateLocation(location);}});// 位置监听器LocationListener locationListener = new LocationListener() {// Provider状态改变时触发public void onStatusChanged(String provider, int status,Bundle extras) {Log.i(TAG, "onStatusChanged()");}// Provider可用时触发public void onProviderEnabled(String provider) {Log.i(TAG, "onProviderEnabled : " + provider);}// Provider失效时触发public void onProviderDisabled(String provider) {Log.i(TAG, "onProviderDisabled : " + provider);}// 当位置改变时触发public void onLocationChanged(Location location) {Log.i(TAG, location.toString());updateLocation(location);}};// 5s更新一次,忽略位置变化locationManager.requestLocationUpdates(bestProvider,5000, 0, locationListener);}// 更新位置信息private void updateLocation(Location location) {if (location != null) {tv1.setText("定位对象信息如下:" + location.toString() + "\r\n其中经度:"+ location.getLongitude() + "\r\n 其中纬度:"+ location.getLatitude());} else {Log.i(TAG, "没有获取到定位对象Location ");}}}
Xml布局文件只有一个Button和一个 TextView,没有贴出。
清单文件:AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/><uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
使用高德地图定位见:http://blog.csdn.net/h573406032/article/details/22804217
使用百度地图定位见:http://developer.baidu.com/map/geosdk.htm
- 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之GPS定位详解
- Android之GPS定位详解
- Android之GPS定位详解
- Android之GPS定位详解
- Android之GPS定位详解
- JSTL标签 参考手册
- 怎样绕开QQ通讯录和360的广播中断
- Ubuntu操作系统学习笔记之文件系统挂载管理
- 放下即是快乐,随缘就会心安
- Qt-中文乱码问题
- Android之GPS详解
- 误删除的文件还能找回吗
- nib but the view outlet was not set.
- VNCViewer 剪贴板失效解决办法
- LayerDrawable层叠样式layer-list
- Object.getHashCode()之我见
- Android -- 怎么发出和接收广播, Broadcast, 电话拨号拦截,短信拦截
- O2O 如何颠覆传统世界
- Ubuntu Cocos2dx 环境配置