Включите экран телефона, когда срабатывает AlarmManager и запускается BroadCastReceiver onReceive - PullRequest
0 голосов
/ 14 марта 2020

Я внедряю пользовательскую сигнализацию с некоторыми логинами c. Когда срабатывает сигнализация и приемник Broadcast запускает onReceive, приложение запускает новое действие для отключения вибрации и мелодии звонка. Поскольку это будильник, я хочу, чтобы он срабатывал также, когда телефон заблокирован, а также в спящем режиме. Будильник срабатывает правильно, даже если телефон находится в спящем режиме. Однако, когда я тестирую приложение на своем смартфоне (не только моем, но и моего брата), если экран выключен, он не включается. Наоборот, система работает должным образом на симуляторе с pixel2 и android 9. Под приемником и манифестом для приемника и приложения для отключения вибрации и тонального звонка.

class AlarmReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context?, intent: Intent?) {
        val extras = intent?.getExtras()
        val alarmId = intent?.getIntExtra("alarmId",-1)

        if(alarmId != null){
            val ta = MemoryManager.getAlarmWithId(alarmId.toInt())
            if(ta != null && ta!!.isSet){
                startAlarmActivity(context,alarmId)
            }
        }
    }
}

<activity
    android:name=".AlarmDeactivation"
    android:configChanges="orientation|keyboardHidden|screenSize"
    android:label="@string/title_activity_alarm_deactivation"
    android:theme="@style/AppTheme.NoActionBar"
    android:showOnLockScreen="true"
    android:turnScreenOn="true">
</activity>
<receiver android:name=".AlarmReceiver">
</receiver>

И вот как я установил будильник.

 if (Build.VERSION.SDK_INT >= 23) {
     alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, time, pendingIntent)
 }
 else if (Build.VERSION.SDK_INT >= 19) {
     alarmManager.setExact(AlarmManager.RTC_WAKEUP, time, pendingIntent)
 } 
 else{
     alarmManager.set(AlarmManager.RTC_WAKEUP, time, pendingIntent)
 }

Как разрешить приложению включать экран при срабатывании будильника?

Спасибо всем.

РЕДАКТИРОВАТЬ

Как и предполагалось здесь , я попытался определить класс, в котором реализован сбор и отпускание PowerManager WakeLock, но без каких-либо изменений.

class AlarmReceiver : BroadcastReceiver() {

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

        val extras = intent?.getExtras()
        val alarmId = intent?.getIntExtra("alarmId",-1)

        AlertWakeLock.acquireWakeLock(context!!)

        if(alarmId != null){
            val ta = MemoryManager.getAlarmWithId(alarmId.toInt())
            if(ta != null && ta!!.isSet){
                startAlarmActivity(context,alarmId)
            }
        }
    }
}

class AlertWakeLock {

    companion object {

        private var wakeLock: PowerManager.WakeLock? = null

        fun acquireWakeLock(context: Context) {
            if (wakeLock != null) {
                return
            }

            val pm = context.getSystemService(Context.POWER_SERVICE) as PowerManager

            wakeLock = pm.newWakeLock(
                PowerManager.PARTIAL_WAKE_LOCK or
                        PowerManager.ACQUIRE_CAUSES_WAKEUP or
                        PowerManager.ON_AFTER_RELEASE, "ToddlerTimer:WakeLock"
            )
            wakeLock!!.acquire()
        }

        fun releaseWakeLock() {
            if (wakeLock != null) {
                wakeLock!!.release()
                wakeLock = null
            }
        }
    }
}

class AlarmDeactivation : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        try {
            super.onCreate(savedInstanceState)

            setContentView(R.layout.alarm_deactivation)
            val alarmId = intent.getIntExtra("ALARM_ID", -1)

            val ta = MemoryManager.getAlarmWithId(alarmId.toInt())

            val button: View = findViewById(R.id.saveButton)
            val afm = AlarmFeedbackManager(this)
            afm.play()

            button.setOnClickListener{
                MemoryManager.deSetAlarm(alarmId)
                MemoryManager.saveAlarmIntoMemory()

                afm.stop()

                val mCtx = GlobalApplication.appContext
                val intent = Intent(mCtx, MainActivity::class.java)
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

                mCtx?.startActivity(intent)
                finish()
            }
        }
        catch (e: Exception){
            var i = e
        }
    }


    override fun onDestroy() {
        super.onDestroy()
        AlertWakeLock.releaseWakeLock()
    }
}
...