Android GPS定位实现

闾丘玮
2023-12-01
 


  通过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
			
		}
	};


 类似资料: