Android设备获取经纬度定位最简方案咨询(无需回调)
最简Android最后已知定位实现(适配表盘无回调场景)
嘿,完全懂你的需求——在表盘绘制这种没法等回调的场景里,要个城市级精度的坐标算日出日落,那些冗长的回调代码确实没必要。直接用系统缓存的最后已知定位就够了,同步获取,一步到位。
1. 先搞定权限
在AndroidManifest.xml里加个权限就行,城市级精度用ACCESS_COARSE_LOCATION足够(比精细权限更容易申请,耗电还少):
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 适配Android 10-13的后台场景,表盘一般是前台,可加可不加,保险起见写上 --> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" android:maxSdkVersion="32" />
注意:Android 6及以上需要动态申请权限,得确保你的表盘已经拿到了定位权限,不然会直接返回null。
2. 同步获取核心代码(无回调,直接拿)
直接把这段塞进你的表盘绘制函数里,同步返回结果,不用等任何回调:
// 拿到LocationManager实例 LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); // 先检查权限,避免崩溃 if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // 表盘里没法弹窗申请权限,给个默认坐标(比如北京,或者用户常用城市) double defaultLat = 39.9042; double defaultLon = 116.4074; // 拿去算日出日落 calculateSunriseSunset(defaultLat, defaultLon); return; } // 优先用NETWORK_PROVIDER,基站/Wi-Fi定位刚好是城市级精度,省电 Location lastKnownLoc = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); if (lastKnownLoc != null) { // 拿到坐标直接用 double lat = lastKnownLoc.getLatitude(); double lon = lastKnownLoc.getLongitude(); calculateSunriseSunset(lat, lon); } else { // 没有缓存的定位?给个默认值兜底 double defaultLat = 39.9042; double defaultLon = 116.4074; calculateSunriseSunset(defaultLat, defaultLon); }
3. 几个关键细节
- 为什么选
NETWORK_PROVIDER?它的精度刚好是城市级,完全满足日出日落计算(同一城市的日出日落时间差不超过1分钟),而且比GPS省电太多,适合表盘这种低功耗场景。 getLastKnownLocation是同步方法,直接返回系统缓存的最近一次定位,不会阻塞线程,完美适配你不能等回调的绘制逻辑。- 关于null的情况:如果返回null,要么是用户从未开过分定位,要么是定位服务关了,这时候给个合理的默认坐标就行(比如可以根据用户的时区大致估算,或者用热门城市坐标)。
- 不用纠结实时性:哪怕是几小时前的定位,只要是同一城市,计算日出日落的结果完全没问题。
内容的提问来源于stack exchange,提问作者ygoe




