Android之GPS详解

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);
// 设置是否需要海拔信息 Altitude
criteria.setAltitudeRequired(true);
// 设置是否需要全方位信息 Bearing
criteria.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);

		// 设置是否需要海拔信息 Altitude
		criteria.setAltitudeRequired(true);

		// 设置是否需要全方位信息 Bearing
		criteria.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() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Log.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



使用GPS 定位,首先,需要在清单文件(AndroidManifest.xml)中注册获取定位的权限: **1.获取位置管理器对象LocationManager** ``` import android.location.LocationManager; LocationManager lm; // lm =(LocationManager) this.getSystemService(Context`.LOCATION_SERVICE); // ``` **2.一般使用LocationManager的getLastKnownLocation(LocationManager.GPS_PROVIDER);方法获取Location对象** ``` String provider = LocationManager.GPS_PROVIDER;// 指定LocationManager的定位方法 Location location = locationManager.getLastKnownLocation(provider);// 调用getLastKnownLocation()方法获取当前的位置信息 ``` 不过不建议用这种方法,有几点原因: 一,在很多提供定位服务的应用程序中,不仅需要获取当前的位置信息,还需要监视位置的变化,在位置改变时调用特定的处理方法 ,其中LocationManager提供了一种便捷、高效的位置监视方法requestLocationUpdates(),可以根据位置的距离变化和时间间隔设定,产生位置改变事件的条件,这样可以避免因微小的距离变化而产生大量的位置改变事件 。 二,当你开启GPS,provider的值为GPS。这时的定位方式为GPS,由于GPS定位慢,所以它不可能立即返回你一个Location对象,所以就返回null了。 **3.推荐locationManager.requestLocationUpdates();方法** LocationManager中设定监听位置变化的代码如下: ``` lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 10,new MyLocationListener()); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值