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

GpsStatusGPS状态信息,上面在卫星状态变化时,我们就用到了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



0 0
原创粉丝点击