警报响得太早
Alarm fireing too early
我正在尝试发出通知警报。
我面临的问题是它过早触发通知...
我真的需要从日期和时间选择器中获取日期和时间。
我不知道我的代码有什么问题。这是我的代码:
MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fire = findViewById(R.id.fire);
choose = findViewById(R.id.choose);
choose.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public void onClick(View view) {
final Calendar cal = getInstance();
int year = cal.get(YEAR);
int month = cal.get(MONTH);
int day = cal.get(DAY_OF_MONTH);
final DatePickerDialog dialog = new DatePickerDialog(
MainActivity.this,
R.style.Theme_AppCompat_Light,
mDataSetListener,
year,month,day
);
dialog.setOnDateSetListener(new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker datePicker, final int year, final int day, final int month) {
final Calendar calTime = getInstance();
int hour = calTime.get(Calendar.HOUR_OF_DAY);
int minute = calTime.get(Calendar.MINUTE);
final String datum = day + "." + month + "." + year;
TimePickerDialog timePickerDialog = new TimePickerDialog(MainActivity.this,R.style.Theme_AppCompat_Light, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker timePicker, int hour, int minute) {
final Calendar cal_new = getInstance();
cal_new.set(Calendar.YEAR,year);
cal_new.set(Calendar.MONTH,month-1);
cal_new.set(Calendar.DAY_OF_MONTH,day);
cal_new.set(Calendar.HOUR_OF_DAY,hour);
cal_new.set(Calendar.MINUTE,minute);
Toast.makeText(MainActivity.this,day + " " + month + " " + year + " " + hour + ":" + minute, Toast.LENGTH_SHORT).show();
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent in = new Intent(MainActivity.this,Alarm.class);
PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this,0,in,0);
alarmManager.setExact(AlarmManager.RTC_WAKEUP, cal_new.getTimeInMillis(),pi);
}
},hour,minute,true);
timePickerDialog.show();
}
});
dialog.show();
}
});
Alarm.java(广播接收器)
public class Alarm extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Yeah", Toast.LENGTH_SHORT).show();
try {
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Ringtone r = RingtoneManager.getRingtone(context, notification);
r.play();
} catch (Exception e) {
e.printStackTrace();
}
}
}
我尝试了一些解决方案,但没有用。
谢谢!
您的 cal_new
可能正在使用 onTimeSet()
外部的 hour
和 minute
变量进行初始化。尝试重命名参数。
问题是您正在设置 month-1
期望获得从 1 到 12 的值。为了与日历兼容,onDateChanged 的 month
已经是 0 到 11。
获取的月份不需要修改,设置到报警管理器中这样:
cal_new.set(Calendar.MONTH, month);
我正在尝试发出通知警报。
我面临的问题是它过早触发通知...
我真的需要从日期和时间选择器中获取日期和时间。
我不知道我的代码有什么问题。这是我的代码:
MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fire = findViewById(R.id.fire);
choose = findViewById(R.id.choose);
choose.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public void onClick(View view) {
final Calendar cal = getInstance();
int year = cal.get(YEAR);
int month = cal.get(MONTH);
int day = cal.get(DAY_OF_MONTH);
final DatePickerDialog dialog = new DatePickerDialog(
MainActivity.this,
R.style.Theme_AppCompat_Light,
mDataSetListener,
year,month,day
);
dialog.setOnDateSetListener(new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker datePicker, final int year, final int day, final int month) {
final Calendar calTime = getInstance();
int hour = calTime.get(Calendar.HOUR_OF_DAY);
int minute = calTime.get(Calendar.MINUTE);
final String datum = day + "." + month + "." + year;
TimePickerDialog timePickerDialog = new TimePickerDialog(MainActivity.this,R.style.Theme_AppCompat_Light, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker timePicker, int hour, int minute) {
final Calendar cal_new = getInstance();
cal_new.set(Calendar.YEAR,year);
cal_new.set(Calendar.MONTH,month-1);
cal_new.set(Calendar.DAY_OF_MONTH,day);
cal_new.set(Calendar.HOUR_OF_DAY,hour);
cal_new.set(Calendar.MINUTE,minute);
Toast.makeText(MainActivity.this,day + " " + month + " " + year + " " + hour + ":" + minute, Toast.LENGTH_SHORT).show();
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent in = new Intent(MainActivity.this,Alarm.class);
PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this,0,in,0);
alarmManager.setExact(AlarmManager.RTC_WAKEUP, cal_new.getTimeInMillis(),pi);
}
},hour,minute,true);
timePickerDialog.show();
}
});
dialog.show();
}
});
Alarm.java(广播接收器)
public class Alarm extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Yeah", Toast.LENGTH_SHORT).show();
try {
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Ringtone r = RingtoneManager.getRingtone(context, notification);
r.play();
} catch (Exception e) {
e.printStackTrace();
}
}
}
我尝试了一些解决方案,但没有用。
谢谢!
您的 cal_new
可能正在使用 onTimeSet()
外部的 hour
和 minute
变量进行初始化。尝试重命名参数。
问题是您正在设置 month-1
期望获得从 1 到 12 的值。为了与日历兼容,onDateChanged 的 month
已经是 0 到 11。
获取的月份不需要修改,设置到报警管理器中这样:
cal_new.set(Calendar.MONTH, month);