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

Android中Criteria已废弃,如何替代获取最佳位置提供者?

解决Criteria废弃后的位置提供者获取问题

核心说明

Android 12(API 31)开始Criteria()构造函数被废弃,官方推荐直接使用明确的位置提供者标识,或通过getBestProvider(null, enabledOnly)来获取最佳可用提供者。

替代方案

方案1:直接指定具体提供者(推荐)

不需要依赖Criteria,直接枚举常用的位置提供者,按需求优先级尝试获取最后已知位置:

private void getLastLocation() {
    try {
        // 优先尝试GPS提供者
        if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
            if (location != null) {
                updateUI(location);
                progressDialog.cancel();
                return;
            }
        }
        // GPS无可用位置,尝试网络提供者
        if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
            Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
            if (location != null) {
                updateUI(location);
                progressDialog.cancel();
                return;
            }
        }
        // 无任何可用的最后已知位置
        progressDialog.cancel();
        showSettingsAlert();
    } catch (SecurityException e) {
        e.printStackTrace();
        progressDialog.cancel();
    }
}

方案2:使用getBestProvider(null, false)

当传入null作为Criteria参数时,getBestProvider会返回系统认为当前最优的位置提供者(基于系统默认的优先级规则)。注意:

  • 第二个参数false表示允许返回已禁用的提供者,若只想获取启用的,改成true即可
  • 如果没有任何可用提供者,会返回null

修改后的代码(同时修复原代码中重复调用progressDialog.cancel()的冗余问题):

private void getLastLocation() {
    try {
        // 传入null让系统选择最佳提供者,false表示可返回已禁用的提供者
        String provider = locationManager.getBestProvider(null, false);

        if (provider == null) {
            progressDialog.cancel();
            showSettingsAlert();
        } else {
            Location location = locationManager.getLastKnownLocation(provider);
            if (location != null) {
                updateUI(location);
            } else {
                // 该提供者无有效最后已知位置
                showSettingsAlert();
            }
            progressDialog.cancel();
        }
    } catch (SecurityException e) {
        e.printStackTrace();
        progressDialog.cancel();
    }
}

额外注意事项

  • 必须确保已申请并获得运行时位置权限:ACCESS_FINE_LOCATION或ACCESS_COARSE_LOCATION
  • 最后已知位置可能是较长时间前的缓存数据,若需要实时位置,仍需引导用户开启定位服务

内容的提问来源于stack exchange,提问作者Darksymphony

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 13:07:29