获取Android地理位置的方法

获取地理位置有三个方法:

GPS、网络、基站

1.使用GPS定位的方法如下

<pre name="code" class="java">LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
LocationListener gpsListener
gpsListener = new locationListener();
				locationManager.requestLocationUpdates(
						LocationManager.GPS_PROVIDER, 0, 0, gpsListener);

使用网络定位的方法同上,只需将 requestLocationUpdates() 函数的第一个参数改为NETWORK_PROVIDER 即可

 
<span style="font-family: Arial, Helvetica, sans-serif;">
</span>
<span style="font-family: Arial, Helvetica, sans-serif;">详细代码如下:</span>
<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="java">locationManager = (LocationManager) ((Context)ser_lis).getSystemService(Context.LOCATION_SERVICE);
		if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))
		{
			try
			{
				System.out.println("in gps");				
				
				Location location = locationManager
						.getLastKnownLocation(LocationManager.GPS_PROVIDER);
				if (location != null)
				{
					latitude = location.getLatitude();
					longitude = location.getLongitude();
				}
				gpsListener = new locationListener();
				locationManager.requestLocationUpdates(
						LocationManager.NETWORK_PROVIDER, 0, 0, gpsListener);
				
			} catch (Exception e)
			{
				System.out.println(e.toString());
			}
		} else if(locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER))
		{			
			try
			{
				System.out.println("in network");							
				
				Location location = locationManager
						.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
				if (location != null)
				{					
					latitude = location.getLatitude(); // 经度
					longitude = location.getLongitude(); // 纬度
				}
				networkListener = new locationListener();
				locationManager.requestLocationUpdates(
						LocationManager.NETWORK_PROVIDER, 0, 0, networkListener);
				
			} catch (Exception e)
			{
				System.out.println("network wrong");
				System.out.println(e.toString());
			}

		}
		if(latitude != 0.0 || longitude != 0.0)
		{
			sendLocation(latitude, longitude);
		}
		System.out.println("\n经度2: " + latitude);
		System.out.println("\n纬度: " + longitude);
	}
	
	private class locationListener implements LocationListener
	{
		@Override
		public void onLocationChanged(Location location)
		{
			// TODO Auto-generated method stub
			System.out.println("in location change");
			latitude = location.getLatitude(); // 经度
			longitude = location.getLongitude(); // 纬度
			
			if(latitude != 0.0 || longitude != 0.0)
			{
				sendLocation(latitude, longitude);
			}
			System.out.println("\n经度1: " + latitude);
			System.out.println("\n纬度: " + longitude);
		}

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

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

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

2.上面这种方法获取地理位置需要指定用哪种方式,下面介绍一种自动选择其中一种方式获取地理位置
 
<span style="font-family: Arial, Helvetica, sans-serif;">代码如下:</span>
<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="java">private LocationManager locationManager;  
    
    private static MyLocationListener listener;  
    private String provider;
    
	private double latitude = 0.0;
	private double longitude = 0.0;

public GpsLocation()
    {  
    
		locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
		
		provider = getProvider(locationManager);
		Looper.prepare();
		System.out.println("gps");
		try
		{
			Location location = locationManager.getLastKnownLocation(provider);
			if (location != null)
			{
				latitude = location.getLatitude(); // 经度
				longitude = location.getLongitude(); // 纬度
				System.out.println("provider: " + provider);
				System.out.println("\n纬度1: " + latitude);
				System.out.println("\n经度: " + longitude);							
				
				sendLocation(latitude, longitude);				
			}
			
			listener = new MyLocationListener();
			locationManager.requestLocationUpdates(provider, 2000, 0, listener);
			
		} catch (Exception e)
		{
			System.out.println("get location wrong");
			System.out.println(e.toString());
		}
		
    }  
    
      
    // 停止GPS监听  
    public void stopGPSListener() {  
        locationManager.removeUpdates(listener);  
    }  
      
    private class MyLocationListener implements LocationListener {  
  
        @Override  
        /** 
         * 当位置发生变化时调用的方法 
         */  
        public void onLocationChanged(Location location) {  
            // TODO Auto-generated method stub  
        	System.out.println("in location change");
			latitude = location.getLatitude(); // 纬度
			longitude = location.getLongitude(); // 经度
			System.out.println("provider: " + provider);
			System.out.println("\n纬度1: " + latitude);
			System.out.println("\n经度: " + longitude);
			if(location != null)
			{
				sendLocation(latitude, longitude);
			}
        }  
  
        @Override  
        /** 
         * 设备被禁用时的回调方法 
         */  
        public void onProviderDisabled(String provider) {  
            // TODO Auto-generated method stub  
  
        }  
  
        @Override  
        /** 
         * 设备被打开时的回调方法 
         */  
        public void onProviderEnabled(String provider) {  
            // TODO Auto-generated method stub  
  
        }  
  
        @Override  
        /** 
         * 设备状态(可用、不可用)发生改变时回调的方法 
         */  
        public void onStatusChanged(String provider, int status, Bundle extras) {  
            // TODO Auto-generated method stub  
  
        }  
    }  
 
    private String getProvider(LocationManager manager) {  
        Criteria criteria = new Criteria();  
        // 设置精准度  
        criteria.setAccuracy(Criteria.ACCURACY_FINE);  
        // 设置是否对海拔敏感  
        criteria.setAltitudeRequired(false);  
        // 设置对手机的耗电量,定位要求越高,越耗电    
        criteria.setPowerRequirement(Criteria.POWER_MEDIUM);  
        //设置对速度变化是否敏感   
        criteria.setSpeedRequired(true);  
        //设置在定位时,是否允许产生与运营商交换数据的开销  
        criteria.setCostAllowed(true);  
        //这个方法是用来得到最好的定位方式,它有两个参数  
        //1、Criteria(类似于Map集合),一组关于定位的条件,速度、海拔、耗电量等  
        //2、enableOnly,布尔类型,false,有可能是已经关掉了的设备;true,就只会得到已经打开了的设备。  
        //如果手机中的GPS设备已经关闭,那么如果设置为false,则手机有可能仍然使用GPS设备提供定位,  
        //如果为true,则手机将不适应关闭的GPS设备定位,而是使用手机中开启的网络或其他设备提供定位  
        return manager.getBestProvider(criteria, true);  
    }  
	
}
<span style="font-family: Arial, Helvetica, sans-serif;">
</span>
3.如果是在非Activity类中使用上述方法,将Activity对象作为参数传递过来
 
<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="java">locationManager = (LocationManager) ((Context)ser_lis)
				.getSystemService(Context.LOCATION_SERVICE);

其中ser_lis为Activity对象
 
<span style="font-family: Arial, Helvetica, sans-serif;">
</span>
<span style="font-family: Arial, Helvetica, sans-serif;">4.在Manifest.xml文件中添加权限</span>
<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="java"><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />  
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />  
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> 



 
<span style="font-family: Arial, Helvetica, sans-serif;">
</span>



### 解决PyCharm无法加载Conda虚拟环境的方法 #### 配置设置 为了使 PyCharm 能够成功识别并使用 Conda 创建的虚拟环境,需确保 Anaconda 的路径已正确添加至系统的环境变量中[^1]。这一步骤至关重要,因为只有当 Python 解释器及其关联工具被加入 PATH 后,IDE 才能顺利找到它们。 对于 Windows 用户而言,在安装 Anaconda 时,默认情况下会询问是否将它添加到系统路径里;如果当时选择了否,则现在应该手动完成此操作。具体做法是在“高级系统设置”的“环境变量”选项内编辑 `Path` 变量,追加 Anaconda 安装目录下的 Scripts 文件夹位置。 另外,建议每次新建项目前都通过命令行先激活目标 conda env: ```bash conda activate myenvname ``` 接着再启动 IDE 进入工作区,这样有助于减少兼容性方面的问题发生概率。 #### 常见错误及修复方法 ##### 错误一:未发现任何解释器 症状表现为打开 PyCharm 新建工程向导页面找不到由 Conda 构建出来的 interpreter 列表项。此时应前往 Preferences/Settings -> Project:...->Python Interpreter 下方点击齿轮图标选择 Add...按钮来指定自定义的位置。按照提示浏览定位到对应版本 python.exe 的绝对地址即可解决问题。 ##### 错误二:权限不足导致 DLL 加载失败 有时即使指定了正确的解释器路径,仍可能遇到由于缺乏适当的操作系统级许可而引发的功能缺失现象。特别是涉及到调用某些特定类型的动态链接库 (Dynamic Link Library, .dll) 时尤为明显。因此拥有管理员身份执行相关动作显得尤为重要——无论是从终端还是图形界面触发创建新 venv 流程均如此处理能够有效规避此类隐患。 ##### 错误三:网络连接异常引起依赖下载超时 部分开发者反馈过因网速慢或者其他因素造成 pip install 操作中途断开进而影响整个项目的初始化进度条卡住的情况。对此可尝试调整镜像源加速获取速度或是离线模式预先准备好所需资源包后再继续后续步骤。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值