Android-获取定位

在Android应用开发中往往要获取手机定位功能,我是一名Android开发初学者,本篇主要记录了我学习如何获取定位的学习笔记,希望可以给大家以帮助。

本篇参考

首先我也是先查找了相关的帖子,这是我主要参考的一篇,他是直接在Activity中进行了

如何获取定位权限和手机定位服务。因为我是为了要做天气预报项目获取当前位置信息,所以全放在Activity中比较臃肿,就采用了Service获取服务。

ok话不多说上步骤、上代码

步骤:

创建服务->在Activity中获取定位所需权限->启动服务->服务运行->得经纬度

获取定位AndroidManifest.xml常需要这两个权限:

<!-- 粗略的位置权限 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!-- 精确的位置权限 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

1、创建LocationService

<service android:name=".Services.LocationService"/>

 首先声明一个位置管理器(获取定位),和一个定位提供方(如:GPS/网路)。

private LocationManager locationManager;//位置管理器
private String locationProvider = null;//GPS定位值就是"gps"   <Log: 位置提供者包含:[passive, gps]  定位方式:gps>

 先写功能其它先不管(初学很复杂一步一步来):

 1.1、获取定位getLocation()

先解释一下权限的判断:

通常用ContextCompat 和ActivityCompat 的checkSelfPermission(Context context, int  permission)来获取permission的授予状态,返回值是int,如果结果和PackageManager.PERMISSION_GRANTED(一个常量权限被授予的意思)相等就代表该permission已经获取了。

locationManager.requestLocationUpdates(String provider , long minTime , float minDistance , LocationListener listener )参数:

provide:定位提供者(gps,数据或wifi,passive)

minTime(ms):多久更新一次位置

minDistance(m):移动多远(位移)更新一次位置

listener:很明显监听用的,minTime和minDistance都需要监听,并且两者是”|“关系。

获取天气信息没必要频繁地获取定位,如果在minTime之内再次获取定位,那么就取上次获取地位置就可以了。

private void getLocation() {
        //粗略定位权限是否获取
        boolean FINE_LOCATION = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED;
        //精确定位权限是否获取
        boolean COARSE_LOCATION = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED;
        if (FINE_LOCATION && COARSE_LOCATION) {
            //获取上次请求到的位置
            Location location = locationManager.getLastKnownLocation(locationProvider);
            if (location == null) {//第一次请求、没有上一次
                locationManager.requestLocationUpdates(locationProvider, 30000, 500, locationListener);
            } else {
                double Longitude = location.getLongitude();
                double Latitude = location.getLatitude();
                ToastUtil.show(this, Longitude + " " + Latitude);
                Log.v("wang", "获取上次的位置-经纬度:" + Longitude + "," + Latitude);
            }

        } else ToastUtil.show(this, "未获取定位权限");

    }

getLocation()需要两个值:locationProvider和locationListener。 

1.2、获取定位提供者。

 获取位置提供者:

private void getLocationProvider() {
        List<String> providers = locationManager.getProviders(true);
        Log.v("wang", "位置提供者包含:" + providers.toString());
        if (providers.contains(LocationManager.GPS_PROVIDER)) {
            //如果是GPS
            locationProvider = LocationManager.GPS_PROVIDER;
            Log.v("wang", "定位方式:" + locationProvider);
        } else if (providers.contains(LocationManager.NETWORK_PROVIDER)) {
            //如果是Network
            locationProvider = LocationManager.NETWORK_PROVIDER;
            Log.v("wang", "定位方式:" + locationProvider);
        } else {
            ToastUtil.show(this, "没有可用的定位提供者");
        }
    }

1.3、创建位置监听:

private LocationListener locationListener = new LocationListener() {
        @Override
        public void onLocationChanged(@NonNull Location location) {
            double Longitude = location.getLongitude();
            double Latitude = location.getLatitude();
            //如果位置发生变化,重新显示地理位置经纬度
            Log.v("wang", "监视地理位置变化-经纬度:" + Longitude + "," + Latitude);
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            LocationListener.super.onStatusChanged(provider, status, extras);
        }

        @Override
        public void onProviderEnabled(@NonNull String provider) {
            LocationListener.super.onProviderEnabled(provider);
        }

        @Override
        public void onProviderDisabled(@NonNull String provider) {
            LocationListener.super.onProviderDisabled(provider);
        }
    };

这样我们的功能部分就完成了。

2、在Activity中给定位权限授权和检查授权

2.1、检查授权

//检查定位权限是否已获取
    private boolean checkLocationPermission() {
        //粗略定位权限是否获取
        boolean FINE_LOCATION = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED;
        //精确定位权限是否获取
        boolean COARSE_LOCATION = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED;
        return FINE_LOCATION && COARSE_LOCATION;//是否都已获取
    }

2.2、请求授权

//请求定位权限
    private void requestLocationPermission() {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_CODE);
    }

  其中地LOCATION_CODE(这里自定义为20)是用来标记这次权限请求的,在处理请求结果中以此辨别是是哪个请求

2.3、处理授响应

//重写权限请求的回调方法
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        //定位权限请求
        switch (requestCode) {
            case LOCATION_CODE://定位权限请求
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    ToastUtil.show(this, "定位权限已获取");
                    startLocationService();
                } else {
                    ToastUtil.show(this, "定位权限获取失败");
                }
                break;
        }
    }
private void startLocationService(){
        Intent intent = new Intent(this, LocationService.class);
        startService(intent);
    }

3、在合适地地方启动service:

if (checkLocationPermission()){
                    Log.v("wang","已获取权限");
                    startLocationService();
                }
                else
                    requestLocationPermission();

欧克、权限请求和服务启动也做好了,但是还没结束

4、启动服务时执行任务

现在还不能得到结果:我们用startService(intent)启动了服务,还没要让服务做什么。

4.1我们需要重写服务地onStartCommand()方法,在启动服务时执行任务。

//重写服务的启动时回调方法
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //1.获取位置管理器
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        //2.获取定位提供者GPS/网络
        getLocationProvider();
        //3.获取位置(经纬度)
             //粗略定位权限是否获取
        boolean FINE_LOCATION =  ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED;
             //精确定位权限是否获取
        boolean COARSE_LOCATION = ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION) ==PackageManager.PERMISSION_GRANTED;
        Log.v("wang","粗略定位:"+FINE_LOCATION +"精确定位:"+ COARSE_LOCATION);
        if(FINE_LOCATION && COARSE_LOCATION){
            getLocation();
        }else {
            ToastUtil.show(this,"未获取定位权限");
            stopSelf();
        }
        return START_STICKY;
    }

4.2再重写服务的onDestroy()方法,在停止服务时进行销毁,并移除位置监听

@Override
    public void onDestroy() {
        super.onDestroy();
        locationManager.removeUpdates(locationListener);
    }
private void destroyLocationService(){
        Intent intent = new Intent(this, LocationService.class);
        stopService(intent);
    } 

 这样我们就可以在Activity中合适的地方启动和销毁该服务了

运行结果:

这里没有获取地理位置,想知道怎么获取的可以看地上方的参考篇。

呼~放松一下

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Android Studio中获取定位可以使用定位API,例如Google Play Services Location API。使用该API需要在AndroidManifest.xml中声明定位权限,并在代码中调用相关方法获取当前位置的经纬度坐标。具体实现过程请参考官方文档或搜索相关教程。 ### 回答2: Android Studio 可以使用 Google 提供的 Google Play Services 库来实现定位功能,在项目中需要添加该库的依赖才能使用该功能。 步骤如下: 1.在 build.gradle 文件中添加 Google Play Services 库的依赖: ``` dependencies { implementation 'com.google.android.gms:play-services-location:18.0.0' } ``` 2.在 AndroidManifest.xml 文件中添加访问定位服务的权限: ``` <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> ``` 如果需要使用网络定位功能,还需要添加以下权限: ``` <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.INTERNET" /> ``` 3.在代码中实现定位功能: (1)创建 FusedLocationProviderClient 对象: ``` private FusedLocationProviderClient fusedLocationClient; ``` (2)初始化 FusedLocationProviderClient 对象: ``` fusedLocationClient = LocationServices.getFusedLocationProviderClient(this); ``` (3)编写获取定位信息的代码: ``` if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { fusedLocationClient.getLastLocation() .addOnSuccessListener(this, new OnSuccessListener<Location>() { @Override public void onSuccess(Location location) { // 定位成功 if (location != null) { double latitude = location.getLatitude(); double longitude = location.getLongitude(); // 使用获取到的经纬度信息 } } }); } ``` 这是一个异步方法,在成功获取定位信息后会回调 onSuccess 方法,在这个方法中可以获取到经纬度信息。 需要注意的是,在调用 getLastLocation 方法前需要检查是否获得了相关权限,如果没有则需要先向用户申请权限,具体方法可以参考 Android 开发文档。 以上就是使用 Android Studio 获取定位的方法,如果需要更多的定位相关功能,可以参考 Google Play Services API 文档。 ### 回答3: Android Studio获取定位的方法有多种,其中最为常用的是利用Android系统自带的LocationManager类和Google提供的FusedLocationProviderClient类。下面分别介绍这两种方法的基本使用。 1. LocationManager类获取定位 首先在AndroidManifest.xml文件中添加如下权限: ```xml <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> ``` 然后在代码中获取LocationManager对象,并注册LocationListener监听器来监听定位信息的变化,代码如下: ```java LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, new LocationListener() { @Override public void onLocationChanged(Location location) { //获取定位信息后的处理操作 } @Override public void onStatusChanged(String provider, int status, Bundle extras) {} @Override public void onProviderEnabled(String provider) {} @Override public void onProviderDisabled(String provider) {} }); ``` 需要注意的是,为了保持设备电量的充足,一般选择使用NETWORK_PROVIDER提供的定位服务,而不是GPS_PROVIDER提供的定位服务。 2. FusedLocationProviderClient类获取定位 和第一种方法类似,首先需要在AndroidManifest.xml文件中添加如下权限: ```xml <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> ``` 然后在代码中获取FusedLocationProviderClient对象,并调用getLastLocation()方法获取上一次定位信息,代码如下: ```java FusedLocationProviderClient fusedLocationClient = LocationServices.getFusedLocationProviderClient(this); fusedLocationClient.getLastLocation().addOnSuccessListener(new OnSuccessListener<Location>() { @Override public void onSuccess(Location location) { if (location != null) { //获取定位信息后的处理操作 } } }); ``` 需要注意的是,获取定位信息可能需要一定的时间,因此官方建议在成功获取定位信息后,使用SharedPreferences等方式将数据存储到本地,下次使用时可以优先读取本地保存的定位信息。 总的来说,无论是哪种方式获取定位,都需要在AndroidManifest.xml文件中添加相应的权限,并遵循Android官方的最佳实践,从而保证代码的可读性和可维护性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值