Android 位置获取


  • Multitude of location sources
  • 多种获取位置的程序

    GPS, Cell-ID, and Wi-Fi 每一个都给用户提供了位置。根据移动的精确度,速度和耗电量选择用哪一种。

  • 用户移动
  • 因为用户的位置一直在移动,你必须每隔一段时间估计用户的位置。
  • 确保精确

    位置的估计源于程序的位置不是持久准确的。每隔十秒接受一次位置信息,可呢过更加准确比最近位置获取的信息。

    // Acquire a reference to the system Location Manager
    LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
    
    // Define a listener that responds to location updates
    LocationListener locationListener = new LocationListener() {
        public void onLocationChanged(Location location) {
          // Called when a new location is found by the network location provider.
          makeUseOfNewLocation(location);
        }
    
        public void onStatusChanged(String provider, int status, Bundle extras) {}
    
        public void onProviderEnabled(String provider) {}
    
        public void onProviderDisabled(String provider) {}
      };
    
    // Register the listener with the Location Manager to receive location updates
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
    配置权限
    如果同时使用了NetWorkProvider和GPS_Provider 必须使用Access_FINE_LOCATION权限。第一次加载时,获取gps的经纬度坐标比较耗时,大约需要等待10秒钟左右,具体的和设备,已及所处的环境有关,在室外获取比较快一些。
    通过Cateria获取最近获取GPS的方法
    private void getLocation()
        {
            // 获取位置管理服务
            LocationManager locationManager;
            String serviceName = Context.LOCATION_SERVICE;
            locationManager = (LocationManager) this.getSystemService(serviceName);
            // 查找到服务信息
            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 = locationManager.getBestProvider(criteria, true); // 获取GPS信息
            Location location = locationManager.getLastKnownLocation(provider); // 通过GPS获取位置
           updateToNewLocation(location);
            // 设置监听器,自动更新的最小时间为间隔N秒(1秒为1*1000,这样写主要为了方便)或最小位移变化超过N米
            locationManager.requestLocationUpdates(provider, 0, 0,
                   locationListener);
        }
    	private void updateToNewLocation(Location location) {
    
    
            TextView tv1;
            tv1 = (TextView) this.findViewById(R.id.tv1);
            if (location != null) {
                double  latitude = location.getLatitude();
                double longitude= location.getLongitude();
                tv1.setText("维度:" +  latitude+ "\n经度" + longitude);
            } else {
                tv1.setText("无法获取地理信息");
            }
    
    
        }
    	private final LocationListener locationListener = new LocationListener() {
    
    
    		@Override
    		public void onLocationChanged(Location location) {
    			updateToNewLocation(location);
    		}
    
    
    		@Override
    		public void onProviderDisabled(String provider) {
    		
    		}
    
    
    		@Override
    		public void onProviderEnabled(String provider) {
    			
    		}
    
    
    		@Override
    		public void onStatusChanged(String provider, int status, Bundle extras) {
    			
    		}
         };
    
    如果GPS设置未打开通过一下方式打开
    private void openGPSSettings() {
            LocationManager alm = (LocationManager) this
                    .getSystemService(Context.LOCATION_SERVICE);
            if (alm
                    .isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) {
                Toast.makeText(this, "GPS模块正常", Toast.LENGTH_SHORT)
                        .show();
                getLocation();
                return;
            }
    
    
            Toast.makeText(this, "请开启GPS!", Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivityForResult(intent,GPS_CODE); //此为设置完成后返回到获取界面
        }
    

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Studio中获取应用程序的地理位置通常涉及使用Google Play Services库中的Location APIs,特别是FusedLocationProviderClient或LocationManager。以下是基本步骤: 1. **添加权限**: 在AndroidManifest.xml文件中,添加`<uses-permission>`标签以请求访问设备的位置信息: ```xml <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> ``` 2. **引入依赖**: 如果使用的是AndroidX,可以在build.gradle(Module)文件中引入: ```gradle implementation 'com.google.android.gms:play-services-location:18.0.0' ``` 或者如果你还在使用Support Library,用: ```gradle implementation 'com.google.android.gms:play-services-location:17.0.0' ``` 3. **创建Location请求管理器**: 使用FusedLocationProviderClient: ```java private FusedLocationProviderClient fusedLocationClient; protected void onCreate(Bundle savedInstanceState) { fusedLocationClient = LocationServices.getFusedLocationProviderClient(this); } ``` 或使用LocationManager: ```java private LocationManager locationManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); } ``` 4. **请求位置更新**: 选择一种方法(如周期性请求、一次性或根据需求)调用`requestLocationUpdates()`或类似方法。 5. **处理位置回调**: 实现`LocationCallback`或自定义监听器,并在onLocationChanged()方法中处理获取到的新位置数据。 6. **异常处理**: 处理可能发生的`LocationPermission Denied`或网络连接等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值