Я внедряю пользовательскую сигнализацию с некоторыми логинами 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()
}
}