后台当前位置更新

问题描述 投票:0回答:1

我有一个问题是,每次broadcastreceiver创建一个新的OneTimeWorker时是否可以获取当前位置? 工人内部?在我的片段中,我有一个按钮,可以在其中触发广播接收器中的待处理意图。 在我的广播接收器中,我正在制作一个 OneTimeWorker:

class AlarmManagerReceiver : BroadcastReceiver() {


    override fun onReceive(context: Context?, intent: Intent?) {




        val constraints = Constraints.Builder()
            .setRequiredNetworkType(NetworkType.CONNECTED)
            .build()


        val workRequest = OneTimeWorkRequestBuilder<WeatherWorker>()
            .addTag("OneTimeJobNew") // Add a tag if needed
            .setConstraints(constraints)
            .build()

        WorkManager.getInstance(context!!).enqueue(workRequest)
    }

在我的 WeatherWorker 类中

@HiltWorker
class WeatherWorker @AssistedInject constructor(
    @Assisted appContext: Context,
    @Assisted workerParams: WorkerParameters,
    private val repository: WeatherRepository,
    private val fusedLocationClient: FusedLocationProviderClient
) : CoroutineWorker(appContext, workerParams) {

    override suspend fun doWork(): Result {

            return try {
                // Check for permission explicitly before accessing location
                if (ActivityCompat.checkSelfPermission(
                        applicationContext,
                        Manifest.permission.ACCESS_BACKGROUND_LOCATION
                    ) == PackageManager.PERMISSION_GRANTED
                ) {
                    var nextDayWeather :Any = Any()
                     //Permission is granted, proceed to fetch location
                    val locationResult = fusedLocationClient.lastLocation
                    val taskResult = Tasks.await(locationResult)
                    val lat = taskResult.latitude
                    val long = taskResult.longitude
                    val result = repository.fetchWeather("$lat,$long")
                   
                    if (result.status is Success) {
                        val currentDate = Calendar.getInstance()

                        // Add 1 day to the current date
                        currentDate.add(Calendar.DAY_OF_YEAR, 1)
                        val nextDate = currentDate.time

                        // Format and print the next date
                        val dateFormat = SimpleDateFormat("yyyy-MM-dd")
                        var nextDateStr = dateFormat.format(nextDate)
                        val forecastDayResult = result.status.data!!.forecast.forecastday
                        for (dayWeek in forecastDayResult){
                            if(dayWeek.date.contains(nextDateStr)){
                                nextDayWeather = dayWeek
                                break
                            }
                        }

                        if(nextDayWeather is forecastday){
                            AppUtils.notify(applicationContext,"Tomorrow's Weather","Weather Status: " + "${nextDayWeather.day.condition.text} " +
                                    " Average Temperature: " + "${nextDayWeather.day.avgtemp_c.toInt()}",
                                R.mipmap.ic_launcher_weather_round)
                        }


                        val intent = Intent(applicationContext, AlarmManagerReceiver::class.java)
                        val pendingIntent = PendingIntent.getBroadcast(
                            applicationContext,
                            1,
                            intent,
                            PendingIntent.FLAG_IMMUTABLE
                        )
                        val alarmManager =
                            applicationContext.getSystemService(Context.ALARM_SERVICE) as AlarmManager

                        val calendar = Calendar.getInstance()
                        calendar.timeInMillis = System.currentTimeMillis()
                        calendar.add(Calendar.HOUR, 2)


                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
                            val canScheduleExactAlarms = alarmManager.canScheduleExactAlarms()
                            if (!canScheduleExactAlarms) {
                                // Handle the case where exact alarms cannot be scheduled
                                // You can fallback to approximate alarms or handle it gracefully
                            }
                        }

                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                            alarmManager.setExactAndAllowWhileIdle(
                                AlarmManager.RTC_WAKEUP,
                                calendar.timeInMillis,
                                pendingIntent
                            )
                        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                            alarmManager.setExact(
                                AlarmManager.RTC_WAKEUP,
                                calendar.timeInMillis,
                                pendingIntent
                            )
                        } else {
                            alarmManager.set(
                                AlarmManager.RTC_WAKEUP,
                                calendar.timeInMillis,
                                pendingIntent
                            )
                        }
                        Result.success()
                    } else {
                        Result.failure()
                    }
                } else {
                    // Permission is not granted
                    AppUtils.notify(applicationContext,"Error","Please select allow all the time from settings.")
                    Result.failure()
                }
            }
            catch (e: Exception) {
                Result.failure()
            }

        }

}

出于某种原因,两个小时后什么也没发生...... 下一个待定意图似乎根本不会触发 可能是什么错误?

在我的清单中:

<uses-permission android:name="android.permission.INTERNET"/>

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

    <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
    <!-- or -->
    <uses-permission android:name="android.permission.USE_EXACT_ALARM" />

    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

找不到针对 android 14 的任何解决方案... 我知道当前位置的后台请求数量有限制,但我每 2 小时发送一次待处理意图。

android background android-workmanager
1个回答
0
投票

为什么使用 OneTimeWorker 来设置闹钟?使用PeriodicWorkRequest,工作人员会替换您的警报。您永远不会一起使用这两个概念,您使用 AlarmManager 或 WorkManager,而不是两者都使用

© www.soinside.com 2019 - 2024. All rights reserved.