You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:40:40