Android Studio установил точный будильник со значком
Я пытаюсь сделать приложение Alarmclock. В настоящее время я использую AlarmManager. Моя minSdkVersion-это уровень API 19.
проблема в том, что я не могу получить точный сигнал тревоги, как и другие приложения. Например, AlamDroid в Playstore: он запускает будильник прямо во второй раз, когда часы переключаются на заданное время. Он также работает на API 19.
мой код прямо сейчас:
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
if (calendar.getTimeInMillis() < System.currentTimeMillis())
calendar.add(Calendar.HOUR, 24);
Intent myIntent = new Intent(context, AlarmReceiver.class);
myIntent.putExtra(DB_ID, myID);
pendingIntent = PendingIntent.getBroadcast(context, myID, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
проблема в том, что в AlarmDroid я получаю на API Levl 19 AlarmIcon в верхнем Android Строка состояния. Но как он это сделал? Потому что alarmManager.setAlarmClock
доступно только в API>= 21. И значок приходит только с этим!
но все же, точность в AlarmDroid идеально подходит на второй! А у меня хуже. Есть ли другой метод, кроме AlarmManager? Или: что я делаю не так? Почему я не могу установить очень точный сигнал тревоги, как и другие приложения AlarmClock в PlayStore. Даже с уведомлением в строке состояния...
EDIT: на AlarmDroid и других приложениях сигнализации есть Уведомление в строке состояния за одну минуту до срабатывания будильника. Это, кажется, как-то в каждом AlarmApp есть!
EDIT2: как возможно, что другие сигналы тревоги в Appstore могут быть точными?
EDIT - > ВОЗМОЖНОЕ РЕШЕНИЕ:
для всех с той же проблемой, пожалуйста, посмотрите здесь:
ссылка на Stackoverflow Вопрос-Ответ от Paweł Nadolski / Mathieu H.
этот может быть объяснение / решение для Samsungphones. Кажется, что они проверяют Pakagename для ключевых слов, таких как" alarm"," alert", Чтобы сделать будильник более точным!
2 ответов
вы столкнулись с этой проблемой, потому что выше API 18 android оптимизировать будильник, чтобы разбудить телефон как можно меньше, так что решение использовать setExact
метод для точности в API 19 и выше и другие Для выше .
API-интерфейс 19
alarmManager.set(AlarmManager.RTC_WAKEUP, time, pendingIntent);
так это будет выглядеть так:
if(android.os.Build.VERSION.SDK_INT >=19){
alarmManager.setExact(AlarmManager.RTC_WAKEUP, time,pendingIntent );
}else{
alarmManager.set(AlarmManager.RTC_WAKEUP, time, pendingIntent)
}
вам может потребоваться добавить предупреждение lint
из docs
начиная с API 19 (KITKAT) доставка тревоги неточна: ОС переключит сигналы тревоги для того чтобы уменьшить wakeups и пользу батареи. Существуют новые API для поддержки приложений, которым нужны строгие гарантии доставки; см. setWindow(int, long, long, PendingIntent) и setExact (int, long, PendingIntent).
вам не повезло здесь, потому что нет другого варианта API, который может сделать alaram точным
Update: похоже, вы пропустили seconds
поле для установки, поэтому попробуйте добавить seconds
в календарь тоже.
Я нашел решение и оно работает даже на устройствах Samsung. Не уверен, что все еще существует необходимость в имени пакета, содержащего "alarm". Но это не проблема, так как вы можете просто создать дополнительный пакет.
Если вы хотите, чтобы сигнал тревоги был точным на втором, просто установите также секунды в 0:
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, 0); // This part will solve the Problem!
вот оно, что решило мою проблему!