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
相关产品推荐
相关产品推荐

