android gps定位

这篇博客详细介绍了Android系统中GPS定位的原理与实现方法,包括如何获取GPS权限,使用LocationManager服务,监听位置更新,以及优化定位精度等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:
https://blog.csdn.net/diyangxia/article/details/90674393#2_26

//网络定位有两种方式,一种是WIFI小区定位、另一种方式是基站定位
//GPS定位依赖于太空中的卫星
public class MyLocation extends Activity{
	LocationManager locationManager;
	long minSecond = 2 * 1000;
	long minDistance =0; //2;
	Location location,lastLocation;
	TextView textview;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_location);
		textview=(TextView)findViewById(R.id.textview);
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

       if (!(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)
               || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER))) {
           Toast.makeText(this, "请打开网络或GPS定位功能!", Toast.LENGTH_SHORT).show();
           Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
           startActivityForResult(intent, 0);
           return;
       }
       
       
       location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
       if (location == null) 
       {
    	   location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
    	   
       }
       if(location==null)
    	   Toast.makeText(getApplicationContext(), "没有存储上一次经纬度", Toast.LENGTH_SHORT).show();
       updateLocation(location);
       
       //指定GPS定位的提供者  	//间隔时间      //位置间隔1米
       //打开gps后手机右上角有gps图标,gps与卫星连接成功后才会每隔minSecond毫秒回调locationListener
       locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, minSecond, minDistance, listener);//LocationManager.GPS_PROVIDER
         
	}
	
	 public final LocationListener listener = new LocationListener() {//监听GPS定位信息是否改变
	        @Override
	        public void onLocationChanged(Location location) {
	        	//GPS信息发生改变时,回调
	            updateLocation(location);
	        }

	        @Override
	        public void onStatusChanged(String provider, int status, Bundle extras) {
                //GPS状态发生改变时,回调
	            switch (status) {
	                // GPS状态为可见时
	                case LocationProvider.AVAILABLE:
	                	Toast.makeText(getApplicationContext(), "当前GPS状态为可见状态", Toast.LENGTH_SHORT).show();
	                    Log.i("xml", "当前GPS状态为可见状态");
	                    break;
	                // GPS状态为服务区外时
	                case LocationProvider.OUT_OF_SERVICE:
	                	Toast.makeText(getApplicationContext(), "当前GPS状态为服务区外状态", Toast.LENGTH_SHORT).show();
	                    Log.i("xml", "当前GPS状态为服务区外状态");
	                    break;
	                // GPS状态为暂停服务时
	                case LocationProvider.TEMPORARILY_UNAVAILABLE:
	                	Toast.makeText(getApplicationContext(), "当前GPS状态为可见状态", Toast.LENGTH_SHORT).show();
	                    Log.i("xml", "当前GPS状态为可见状态");
	                    break;
	            }
	        }

	        @Override
	        public void onProviderEnabled(String provider) {
                //定位提供者启动时回调
	  			//@SuppressLint("MissingPermission")
	            Location location = locationManager.getLastKnownLocation(provider);
	            updateLocation(location);
	        }

	        @Override
	        public void onProviderDisabled(String provider) {
	        	//定位提供者关闭时回调
	        }
	    };

	
	  private void updateLocation(Location location) {
        String result;
        double lat;
        double lon;

        if (location != null) {
            lat = location.getLatitude();
            lon = location.getLongitude();
       

            result = "纬度:" + lat + "\n经度:" + lon;
            Log.i("xml", "显示结果 = " +  result);
            lastLocation = location;
        } else {
            result = "无法获取经纬度信息";
        }

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        SimpleDateFormat dateFormatDate = new SimpleDateFormat("yyyyMMdd");
        String curTime = dateFormat.format(new Date());
        String curDate = dateFormatDate.format(new Date());

        // 把结果展示在界面上
        textview.setText(curTime + "\n" + result);   
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值