Страницы

Поиск по вопросам

четверг, 21 марта 2019 г.

Пуш-уведомление по установленному времени

Всем добра! Ребят, это снова я и мне нужна Ваша помощь. Я полностью переосмыслил работу со временем, с пикерами даты и прочего полезного. Имеется следующий код.

1. Метод работы со временем:
... info = (TextView)mBottomSheetDialogTime.findViewById(R.id.info); pickerDate = (DatePicker)mBottomSheetDialogTime.findViewById(R.id.pickerdate); pickerTime = (TimePicker)mBottomSheetDialogTime.findViewById(R.id.pickertime); Calendar now = Calendar.getInstance(); pickerDate.init(now.get(Calendar.YEAR), now.get(Calendar.MONTH), now.get(Calendar.DAY_OF_MONTH), null); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { pickerTime.setHour(now.get(Calendar.HOUR_OF_DAY)); pickerTime.setMinute(now.get(Calendar.MINUTE)); } else { pickerTime.setCurrentHour(now.get(Calendar.HOUR_OF_DAY)); pickerTime.setCurrentMinute(now.get(Calendar.MINUTE)); } buttonSetAlarm = (Button)mBottomSheetDialogTime.findViewById(R.id.setalarm); buttonSetAlarm.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View arg0) { Calendar current = Calendar.getInstance(); Calendar cal = Calendar.getInstance(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) cal.set(pickerDate.getYear(), pickerDate.getMonth(), pickerDate.getDayOfMonth(), pickerTime.getHour(), pickerTime.getMinute(), 0); else cal.set(pickerDate.getYear(), pickerDate.getMonth(), pickerDate.getDayOfMonth(), pickerTime.getCurrentHour(), pickerTime.getCurrentMinute(), 0); Context context = getApplicationContext(); if(cal.compareTo(current) <= 0) Toast.makeText(getApplicationContext(), "Invalid Date/Time", Toast.LENGTH_LONG).show(); else scheduleNotification(getNotification(), cal); }}); ...
2. Метод работы уведомления:
private void scheduleNotification(Notification notification, Calendar targetCal{ info.setText("


"+"Alarm is set@ "+targetCal.getTime()+"
"); Intent notificationIntent = new Intent(getBaseContext(), NotificationPublisherBroadcastReceiver.class); notificationIntent.putExtra(NotificationPublisherBroadcastReceiver.NOTIFICATION_ID, 1); notificationIntent.putExtra(NotificationPublisherBroadcastReceiver.NOTIFICATION, notification); PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), 0, notificationIntent, 0); AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); if (android.os.Build.VERSION.SDK_INT >= 19) alarmManager.setExact(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(), pendingIntent); else alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(), pendingIntent); }
3. Receiver
public class NotificationPublisher extends BroadcastReceiver{
public static String NOTIFICATION_ID = "notification-id"; public static String NOTIFICATION = "notification";
public void onReceive(Context context, Intent intent){ NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); Notification notification = intent.getParcelableExtra(NOTIFICATION); int id = intent.getIntExtra(NOTIFICATION_ID, 0); notificationManager.notify(id, notification); Toast.makeText(context, "Alarm received!", Toast.LENGTH_LONG).show(); } }
4. Manifest

5. getNotification()
private Notification getNotification() { Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); Intent intent = new Intent(getBaseContext(), NotificationPublisherBroadcastReceiver.class); intent.putExtra("title", getString(R.string.notificationtitle)); intent.putExtra("text", getString(R.string.notificationtext)); PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, 0); NotificationCompat.Builder builder = new NotificationCompat.Builder(getBaseContext()) .setSmallIcon(R.drawable.time) .setLargeIcon(bitmap) .setContentTitle(getString(R.string.notificationtitle)) .setContentText(getString(R.string.notificationtext)) .setContentIntent(pIntent) .setAutoCancel(true) .setVibrate(new long[]{1000, 1000, 1000, 1000}) .setDefaults(Notification.DEFAULT_SOUND); return builder.build(); }

Вся проблема в том, что когда я нажимаю buttonSetAlarm, в котором вызов уведомления scheduleNotification(getNotification(), cal); уведомления приходит сразу же, а не когда я назначил время, и еще не показывается Toast.makeText(context, "Alarm received!", Toast.LENGTH_LONG).show(); из receiver (Есть подозрение на не поддержку API. У меня стоит поддержка от 15 до 23 версии, на данный момент тестирую на 23). Где я ошибаюсь? И что мне сделать, чтобы исправить? Любая помощь будет бесценной!


Ответ

Вот так регистрируется алярм для разных версий android-a.
if (android.os.Build.VERSION.SDK_INT >= 19) alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); else alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
Плюс посмотрите какое значение достает pickerDate.getMonth(). Если возвращает 5 (май), то надо вычесть 1, так как в календарь месяца сетятся от 0 до 11.

Комментариев нет:

Отправить комментарий