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!

вот оно, что решило мою проблему!