当前位置:   article > 正文

Android-获取定位_android 获取定位

android 获取定位

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

本篇参考

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

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

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

步骤:

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

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

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

1、创建LocationService

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

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

  1. private LocationManager locationManager;//位置管理器
  2. 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之内再次获取定位,那么就取上次获取地位置就可以了。

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

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

1.2、获取定位提供者。

 获取位置提供者:

  1. private void getLocationProvider() {
  2. List<String> providers = locationManager.getProviders(true);
  3. Log.v("wang", "位置提供者包含:" + providers.toString());
  4. if (providers.contains(LocationManager.GPS_PROVIDER)) {
  5. //如果是GPS
  6. locationProvider = LocationManager.GPS_PROVIDER;
  7. Log.v("wang", "定位方式:" + locationProvider);
  8. } else if (providers.contains(LocationManager.NETWORK_PROVIDER)) {
  9. //如果是Network
  10. locationProvider = LocationManager.NETWORK_PROVIDER;
  11. Log.v("wang", "定位方式:" + locationProvider);
  12. } else {
  13. ToastUtil.show(this, "没有可用的定位提供者");
  14. }
  15. }

1.3、创建位置监听:

  1. private LocationListener locationListener = new LocationListener() {
  2. @Override
  3. public void onLocationChanged(@NonNull Location location) {
  4. double Longitude = location.getLongitude();
  5. double Latitude = location.getLatitude();
  6. //如果位置发生变化,重新显示地理位置经纬度
  7. Log.v("wang", "监视地理位置变化-经纬度:" + Longitude + "," + Latitude);
  8. }
  9. @Override
  10. public void onStatusChanged(String provider, int status, Bundle extras) {
  11. LocationListener.super.onStatusChanged(provider, status, extras);
  12. }
  13. @Override
  14. public void onProviderEnabled(@NonNull String provider) {
  15. LocationListener.super.onProviderEnabled(provider);
  16. }
  17. @Override
  18. public void onProviderDisabled(@NonNull String provider) {
  19. LocationListener.super.onProviderDisabled(provider);
  20. }
  21. };

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

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

2.1、检查授权

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

2.2、请求授权

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

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

2.3、处理授响应

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

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

  1. if (checkLocationPermission()){
  2. Log.v("wang","已获取权限");
  3. startLocationService();
  4. }
  5. else
  6. requestLocationPermission();

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

4、启动服务时执行任务

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

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

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

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

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

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

运行结果:

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

呼~放松一下

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号