如何在无需位置权限的Android设备上获取日出/日落时间
Android 直接获取本地日出/日落时间方案
可行,但Android系统没有提供直接读取已计算完成的日出日落时间的API,不过可以借助系统位置服务和官方工具类,无需手动实现时区、经纬度的计算逻辑,即可获取准确的本地日出日落时间。
具体操作步骤
- 申请位置权限
日出日落时间依赖当前地理位置,需在AndroidManifest.xml中声明权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- Android 10+ 若需后台获取,需添加: --> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
同时需要在代码中动态申请权限(适配Android 6.0+的权限机制):
private const val REQUEST_LOCATION_PERMISSION = 1001 // 检查并申请权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { requestPermissions( arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), REQUEST_LOCATION_PERMISSION ) }
- 获取当前设备地理位置
使用Google推荐的FusedLocationProviderClient获取当前经纬度,系统会自动处理位置缓存、精度优化等逻辑:
val fusedLocationClient = LocationServices.getFusedLocationProviderClient(this) fusedLocationClient.lastLocation.addOnSuccessListener { location -> location?.let { // 拿到经纬度后计算日出日落时间 calculateSunriseSunset(it.latitude, it.longitude) } }
- 利用系统工具类计算日出日落时间
引入androidx.core:core-location依赖后,使用SunriseSunsetCalculator类完成计算,所有时区、天文计算逻辑均由系统实现:
private fun calculateSunriseSunset(lat: Double, lon: Double) { val timeZone = TimeZone.getDefault() val geoLocation = GeoLocation(lat, lon) val calculator = SunriseSunsetCalculator(geoLocation, timeZone.id) val currentDate = Calendar.getInstance() val officialSunrise = calculator.getOfficialSunriseForDate(currentDate) val officialSunset = calculator.getOfficialSunsetForDate(currentDate) // 输出结果,格式为HH:mm Log.d("SunTime", "日出时间:$officialSunrise") Log.d("SunTime", "日落时间:$officialSunset") }
注意事项
- 需确保设备开启位置服务,否则无法获取有效地理位置
SunriseSunsetCalculator支持多种日出日落类型(如民用、天文),可根据需求调用对应方法- 若设备无网络或位置信号较弱,
lastLocation可能返回null,需添加位置更新监听作为 fallback 方案
内容的提问来源于stack exchange,提问作者Binyamin Pekar
相关产品推荐
相关产品推荐

