大家好,欢迎来到IT知识分享网。
在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中合适的地方启动和销毁该服务了
运行结果:
这里没有获取地理位置,想知道怎么获取的可以看地上方的参考篇。
呼~放松一下
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/112967.html

