Gluon Mobile Android端:访问位置时请求权限并解决崩溃问题
解决Android端定位权限关闭/拒绝时的崩溃问题,以及获取系统版本的方法
嘿,我来帮你搞定这个问题!首先说下Android 5.1.1(API 21)还崩溃的原因:Android 6.0(API 23)才引入动态权限申请机制,而5.x版本是安装时就授权,要是用户后来在系统设置里把定位权限关了,你的应用直接去访问位置服务就会触发SecurityException,Gluon的Position插件在低版本里没自动处理这个异常,所以就崩了。
一、先搞定崩溃问题
1. 手动检查权限+捕获异常
在调用位置服务的代码里,先确认有没有权限,同时把可能的异常接住,别让它炸掉:
import com.gluonhq.charm.down.Services; import com.gluonhq.charm.down.plugins.PositionService; import android.Manifest; import android.content.pm.PackageManager; import javafxports.android.FXActivity; // 检查是否有定位权限 private boolean hasLocationAccess() { int finePerm = FXActivity.getInstance().checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION); int coarsePerm = FXActivity.getInstance().checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION); return finePerm == PackageManager.PERMISSION_GRANTED || coarsePerm == PackageManager.PERMISSION_GRANTED; } // 安全请求位置 public void fetchUserLocation() { if (!hasLocationAccess()) { // 没权限的话,给用户弹个提示,或者显示默认位置 showPermissionMissingAlert(); return; } try { Services.get(PositionService.class).ifPresent(positionService -> { positionService.positionProperty().addListener((obs, oldPos, newPos) -> { if (newPos != null) { // 更新地图上的位置 updateMapWithPosition(newPos); } }); }); } catch (SecurityException e) { // 万一还是触发了权限异常,直接接住,别崩溃 e.printStackTrace(); showPermissionMissingAlert(); } }
2. 适配低版本权限逻辑
对于API 21-22的设备,虽然没有动态权限弹窗,但用户能在设置里禁用权限,所以每次访问位置前必须检查权限,而且一定要用try-catch包裹位置服务的调用,把异常拦截下来。
二、获取Android版本信息的两种方法
你要的针对性处理,得先拿到当前系统的版本,这里有两种方式:
1. 直接用Android原生API
最直接的方式,调用Android的Build类:
import android.os.Build; // 获取API级别(比如21就是Android 5.1.1) int androidApiLevel = Build.VERSION.SDK_INT; // 获取版本名称(比如"5.1.1") String androidVersionName = Build.VERSION.RELEASE;
2. 用Gluon的PlatformService(跨平台风格)
如果想保持代码的跨平台性,用Charm Down的PlatformService更合适:
import com.gluonhq.charm.down.Services; import com.gluonhq.charm.down.plugins.PlatformService; import com.gluonhq.charm.down.plugins.Platform; Services.get(PlatformService.class).ifPresent(service -> { if (service.getPlatform() == Platform.ANDROID) { // 获取版本字符串 String osVersion = service.getVersion(); // 获取API级别(转成int方便判断) int apiLevel = Integer.parseInt(service.getProperty("android.api.level")); // 比如针对API<23的设备做特殊处理 if (apiLevel < 23) { // 这里写低版本的适配逻辑 } } });
最后提几个小建议
- 不管是高版本还是低版本,调用位置服务前一定要检查权限,别偷懒;
- 没权限的时候,给用户清晰的提示,比如引导他们去设置里开权限,别让用户一脸懵;
- 你的jfxmobile是1.3.10,charm是5.0.0,版本搭配没问题,继续保持就行。
内容的提问来源于stack exchange,提问作者BodenDokDevs
相关产品推荐
相关产品推荐

