Всем добра! Ребят, это снова я и мне нужна Ваша помощь. Я полностью переосмыслил работу со временем, с пикерами даты и прочего полезного. Имеется следующий код.
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.
Комментариев нет:
Отправить комментарий