Android GPS定位实现

通过GPS取得的是一个Location类型的经纬度, 可以转换为两个Double 纬度和经度.

纬度: 23.223871812820435

纬度: 113.58986039161628

首先创建一个TextView和两个Button

mian.xml

<TextView  
	android:id="@+id/text"
   	android:layout_width="fill_parent" 
    	android:layout_height="wrap_content"     />
    
    <Button
    	android:id="@+id/btnStart"
    	android:layout_width="wrap_content"
    	android:layout_height="wrap_content"
    	android:text="定位"			/>
    <Button
    	android:id="@+id/btnStop"
    	android:layout_width="wrap_content"
    	android:layout_height="wrap_content"
    	android:text="停止"			/>

然后添加主Activity的代码

Location 是存放经纬度的一个类型

LocationManager是位置管理服务类型

private Button btnStart;
private Button btnStop;
private TextView textView;
private Location mLocation;
private LocationManager mLocationManager;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
	
	super.onCreate(savedInstanceState);
	setContentView(R.layout.main);
	
	btnStart = (Button)findViewById(R.id.btnStart);
	btnStop  = (Button)findViewById(R.id.btnStop);
	textView = (TextView)findViewById(R.id.text);
	btnStart.setOnClickListener(btnClickListener);	//开始定位
	btnStop.setOnClickListener(btnClickListener);	//结束定位按钮
}

gpsIsOpen是自己写的查看当前GPS是否开启

getLocation 是自己写的一个获取定位信息的方法

mLocationManager.removeUpdates()是停止当前的GPS位置监听

public Button.OnClickListener btnClickListener = new Button.OnClickListener()
{
	public void onClick(View v)
	{
		Button btn = (Button)v;
		if(btn.getId() == R.id.btnStart)
		{
			if(!gpsIsOpen())
				return;
			
  			mLocation = getLocation();
			
			if(mLocation != null)
				textView.setText("维度:" + mLocation.getLatitude() + "\n经度:" + mLocation.getLongitude());
			else
			    textView.setText("获取不到数据");
		}
		else if(btn.getId() == R.id.btnStop)
		{
			mLocationManager.removeUpdates(locationListener);
		}

	}
};
private boolean gpsIsOpen()
{
	boolean bRet = true;

	LocationManager alm = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE);
	if(!alm.isProviderEnabled(LocationManager.GPS_PROVIDER))
	{
		Toast.makeText(this, "未开启GPS", Toast.LENGTH_SHORT).show();
		bRet = false;
	}
	else 
	{
		Toast.makeText(this, "GPS已开启", Toast.LENGTH_SHORT).show();
	}

	return bRet;
}

判断当前是否开启GPS

private boolean gpsIsOpen()
{
	boolean bRet = true;
	
	LocationManager alm = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE);
	if(!alm.isProviderEnabled(LocationManager.GPS_PROVIDER))
	{
		Toast.makeText(this, "未开启GPS", Toast.LENGTH_SHORT).show();
		bRet = false;
	}
	else 
	{
		Toast.makeText(this, "GPS已开启", Toast.LENGTH_SHORT).show();
	}

	return bRet;
}

该方法获取当前的经纬度, 第一次获取总是null

后面从LocationListener获取已改变的位置

mLocationManager.requestLocationUpdates()是开启一个LocationListener等待位置变化

private Location getLocation()
{
	//获取位置管理服务
	mLocationManager = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE);

	//查找服务信息
	Criteria criteria = new Criteria();
	criteria.setAccuracy(Criteria.ACCURACY_FINE); 	//定位精度: 最高
	criteria.setAltitudeRequired(false);			//海拔信息:不需要
	criteria.setBearingRequired(false);				//方位信息: 不需要
	criteria.setCostAllowed(true);					//是否允许付费
	criteria.setPowerRequirement(Criteria.POWER_LOW);  //耗电量: 低功耗
	
	String provider = mLocationManager.getBestProvider(criteria, true); //获取GPS信息

	Location location = mLocationManager.getLastKnownLocation(provider);
	
	mLocationManager.requestLocationUpdates(provider, 2000, 5, locationListener);
	
	return location;
}

改方法是等待GPS位置改变后得到新的经纬度

private final LocationListener locationListener = new LocationListener()
{
	public void onLocationChanged(Location location)
	{
		// TODO Auto-generated method stub
		if(location != null)
			textView.setText("维度:" + location.getLatitude() + "\n经度:" 
						+ location.getLongitude());
		else
		    textView.setText("获取不到数据" + Integer.toString(nCount));
	}

	public void onProviderDisabled(String provider)
	{
		// TODO Auto-generated method stub
	}

	public void onProviderEnabled(String provider)
	{
		// TODO Auto-generated method stub
	}

	public void onStatusChanged(String provider, int status, Bundle extras)
	{
		// TODO Auto-generated method stub
		
	}
};

发表评论