Android支持通过LocationManager、LocationListener实时获取位置信息。
相关文档:请求位置权限 | Android 开发者 | Android Developers (google.cn)
目录
在AndroidManifest.xml文件中增加使用权限声明:
- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
注:uses-permission需在manifest标签下一级,不可嵌套在其他标签中。
ContextCompat | Android Developers (google.cn)
- // 是否获得权限
- if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
- != PackageManager.PERMISSION_GRANTED) {
- // 未获得权限,则申请
- if (shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_FINE_LOCATION)) {
- // 如果用户选择不开启
- Toast.makeText(this, "相关权限未开启,无法正常使用定位服务!", Toast.LENGTH_SHORT).show();
- }
-
- // 申请权限
- requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE);
- } else {
- // 权限已获得
- Toast.makeText(this, "已获得定位权限!", Toast.LENGTH_SHORT).show();
-
- // TODO 可以开始获取位置信息
- }
LocationManager | Android Developers (google.cn)
LocationManager提供访问系统位置服务的方法,可以为应用提供地理定位信息。
- LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
- List
providers = lm.getAllProviders(); - for (String pro : providers) {
- System.out.println(pro);
- }
-
- // 打印输出
- // I/System.out: passive
- // I/System.out: network
- // I/System.out: fused
- // I/System.out: gps
我们使用GPS provider可以获取精确的位置信息。
- LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
- boolean isOpen = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
如果手机上打开位置服务,返回true;如果是关闭的,则返回false。
LocationListener | Android Developers (google.cn)
LocationListener用于接收设备位置发生变化时的通知消息。
- // 创建监听对象
- LocationListener ll = new LocationListener() {
- // Provider的状态在可用、暂时不可用和无服务三个状态直接切换时触发此函数
- @Override
- public void onStatusChanged(String provider, int status, Bundle extras) {
- System.out.println("onStatusChanged");
- }
-
- // Provider被enable时触发此函数,比如GPS被打开
- @Override
- public void onProviderEnabled(String provider) {
- System.out.println("onProviderEnabled");
- }
-
- // Provider被disable时触发此函数,比如GPS被关闭
- @Override
- public void onProviderDisabled(String provider) {
- System.out.println("onProviderDisabled");
- }
-
- //当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发
- @Override
- public void onLocationChanged(Location location) {
- // 位置信息更新
- System.out.printf(String.format(Locale.getDefault(), "location: longitude: %f, latitude: %f, accuracy: %f, altitude: %f, alt_accuracy: %f", location.getLongitude(),
- location.getLatitude(), location.getAccuracy(), location.getAltitude(), location.getVerticalAccuracyMeters()));
- }
- };
-
- LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
- // 注册监听事件,每隔1000ms,最小距离0.5米
- lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 0.5f, ll);
调试过程中遇到了一个问题,无论怎么操作,onLocationChanged 都不会触发。后来起身站在窗口,位置信息就可以获取了。因为在房间里调试,无法获取到GPS卫星的信息,O(∩_∩)O哈哈~
- LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
- Location loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
GnssStatus.Callback | Android Developers (google.cn)
用于接收GNSS事件
- GnssStatus.Callback cb = new GnssStatus.Callback() {
- @Override
- public void onStarted() {
- super.onStarted();
- }
-
- @Override
- public void onStopped() {
- super.onStopped();
- }
-
- @Override
- public void onFirstFix(int ttffMillis) {
- super.onFirstFix(ttffMillis);
- }
-
- @Override
- public void onSatelliteStatusChanged(@NonNull GnssStatus status) {
- super.onSatelliteStatusChanged(status);
-
- int count = status.getSatelliteCount(); // 卫星数量
-
- for (int i = 0; i < count; ++i) {
- int type = status.getConstellationType(i);
-
- switch (type) {
- case GnssStatus.CONSTELLATION_BEIDOU:
- System.out.println("Beidou");
- break;
-
- case GnssStatus.CONSTELLATION_GPS:
- System.out.println("GPS");
- break;
-
- case GnssStatus.CONSTELLATION_GLONASS:
- System.out.println("GLONASS");
- break;
-
- case GnssStatus.CONSTELLATION_GALILEO:
- System.out.println("GALILEO");
- break;
- }
-
- if (status.usedInFix(i)) {
- // 判断是否用于定位
- System.out.println("the satellite is used in fix!");
- }
- }
- }
- };
-
- LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
- lm.registerGnssStatusCallback(cb);
Geocoder | Android Developers (google.cn)
- Geocoder geocoder = new Geocoder(this.getApplicationContext());
- List list = null;
-
- try {
- list = geocoder.getFromLocation(lat, lng, 1);
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- if (null != list) {
- for (Address addr : list) {
- System.out.println(addr.toString());
- }
- }
可以打印出当前位置的详细信息,例如XX省XX市XXX街道。