Android snooze不适用于报警管理器

Android snooze不适用于报警管理器,android,android-intent,android-broadcast,android-alarms,Android,Android Intent,Android Broadcast,Android Alarms,当我点击“打盹”按钮时,警报必须在10分钟后重新启动,但这不起作用 我在10秒后设置了报警,这是当我点击“打盹”按钮时在10秒后的logcat 全对数 在这里输入代码 snoozebtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent myIntent = new Intent(getApplicatio

当我点击“打盹”按钮时,警报必须在10分钟后重新启动,但这不起作用

我在10秒后设置了报警,这是当我点击“打盹”按钮时在10秒后的logcat

全对数

在这里输入代码

snoozebtn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            Intent myIntent = new Intent(getApplicationContext(), AlarmAlertBroadcastReciever.class);
            myIntent.putExtra("alarm", this);

            PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, myIntent,PendingIntent.FLAG_CANCEL_CURRENT);

            AlarmManager alarmManager = (AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);

            alarmManager.set(AlarmManager.RTC_WAKEUP, getAlarmTime().getTimeInMillis(), pendingIntent); 

            Toast.makeText(getApplicationContext(), "Snoozed for 10 mins", Toast.LENGTH_LONG);
            finish();
        }

    });

公共类AlarmAlertActivity扩展活动实现OnClickListener{
private Calendar alarmTime=Calendar.getInstance();
私人报警;
私人媒体播放器;
私有StringBuilder answerBuilder=新StringBuilder();
私人振动器;
私有布尔值激活;
私有文本视图问题视图;
私有文本视图应答视图;
私有文本视图消息_txt、报警名称_txt;
私有图像视图img1;
纺纱工纺纱工打盹;
私有字符串应答器字符串;
int-hr1;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
最终窗口=getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG)锁定时显示
|WindowManager.LayoutParams.FLAG_discover_KEYGUARD);
window.addFlags(WindowManager.LayoutParams.FLAG\u保持屏幕打开
|WindowManager.LayoutParams.FLAG(打开屏幕);
setContentView(R.layout.simple);
Bundle Bundle=this.getIntent().getExtras();
报警=(报警)bundle.getSerializable(“报警”);
按钮can1=(按钮)findViewById(R.id.can1);
按钮snoozebtn=(按钮)findViewById(R.id.snoozebtn);
Animation shake=AnimationUtils.loadAnimation(getApplicationContext(),R.anim.shake);
Animation shakeimage=AnimationUtils.loadAnimation(getApplicationContext(),R.anim.shakeimage);
msg_txt=(TextView)findViewById(R.id.msg_txt);
alarmname_txt=(TextView)findViewById(R.id.alarmname_txt);
img1=(ImageView)findViewById(R.id.img1);
img1.setImageResource(R.drawable.smileyback);
Calendar c=Calendar.getInstance();//获取当前时间
hr1=c.get(Calendar.HOUR OF_DAY);//获取一天中的当前小时数(从1到24)
星形臂();
如果(hr1<12){
findviewbyd(R.id.img1)、startAnimation(shakeimage);
msg_txt.setText(“早上好!”;
alarmname_txt.setText(alarm.getAlarmName());
}否则如果(hr1>12&&hr1<17){
findViewById(R.id.msg_txt).startAnimation(抖动);
findviewbyd(R.id.img1)、startAnimation(shakeimage);
msg_txt.setText(“下午好!”;
alarmname_txt.setText(alarm.getAlarmName());
}否则如果(hr1>17&&hr1<20){
findviewbyd(R.id.img1)、startAnimation(shakeimage);
msg_txt.setText(“晚上好!”);
alarmname_txt.setText(alarm.getAlarmName());
}否则{
findViewById(R.id.msg_txt).startAnimation(抖动);
msg_txt.setText(“晚安!”);
alarmname_txt.setText(alarm.getAlarmName());
}
can1.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
完成();
}
});
snoozebtn.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
Calendar c1=Calendar.getInstance();//获取当前时间
long getTimeaftertenminute=c1.getTimeInMillis()+5000;
Intent myIntent=newintent(getApplicationContext(),AlarmAlertBroadcastReceiver.class);
PendingEvent PendingEvent=PendingEvent.getBroadcast(getApplicationContext(),1,myIntent,PendingEvent.FLAG_CANCEL_CURRENT);
AlarmManager AlarmManager=(AlarmManager)getSystemService(报警服务);
alarmManager.set(alarmManager.RTC_唤醒、getTimeaftertenminute、PendingEvent);
Toast.makeText(getApplicationContext(),“小睡30秒”,Toast.LENGTH\u LONG);
完成();
}
});
}
@凌驾
受保护的void onResume(){
super.onResume();
alarmActive=true;
}
私有void startAlarm(){
如果(alarm.getAlarmTonePath()!=“”){
mediaPlayer=新的mediaPlayer();
if(alarm.getVibrate()){
可控震源=(可控震源)getSystemService(可控震源服务);
长[]模式={1000200200200};
振动器。振动(模式,0);
}
试一试{
mediaPlayer.setVolume(1.0f,1.0f);
mediaPlayer.setDataSource(此,
parse(alarm.getAlarmTonePath());
mediaPlayer.setAudioStreamType(AudioManager.STREAM_报警);
mediaPlayer.setLooping(true);
mediaPlayer.prepare();
mediaPlayer.start();
}捕获(例外e){
mediaPlayer.release();
alarmActive=false;
}
}
}
@凌驾
public void onBackPressed(){
如果(!alarmActive)
super.onBackPressed();
}
@凌驾
受保护的空onDestroy(){
试一试{
如果(可控震源!=null)
cancel();
}捕获(例外e){
}
试一试{
mediaPlayer.stop();
}捕获(例外e){
}
试一试{
mediaPlayer.release();
}捕获(例外e){
}
super.ondestory();
}
} }


这是报警活动

打盹报警非常容易,只需使用相同的id设置报警,您无需取消上一个报警,以下是示例

public class AlarmAlertActivity extends Activity implements OnClickListener {

private Calendar alarmTime = Calendar.getInstance();

private Alarm alarm;
private MediaPlayer mediaPlayer;
private StringBuilder answerBuilder = new StringBuilder();
private Vibrator vibrator;
private boolean alarmActive;
private TextView problemView;
private TextView answerView;
private TextView msg_txt, alarmname_txt;
private ImageView img1;
        Spinner spinner_snooze;
private String answerString;
        int hr1;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    final Window window = getWindow();
    window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
            | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
    window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
            | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

    setContentView(R.layout.simple);

    Bundle bundle = this.getIntent().getExtras();
    alarm = (Alarm) bundle.getSerializable("alarm");
    Button can1 = (Button) findViewById(R.id.can1);
    Button snoozebtn = (Button) findViewById(R.id.snoozebtn);

    Animation shake = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.shake);
    Animation shakeimage = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.shakeimage);
    msg_txt = (TextView) findViewById(R.id.msg_txt);
    alarmname_txt = (TextView) findViewById(R.id.alarmname_txt);
    img1 = (ImageView) findViewById(R.id.img1);
    img1.setImageResource(R.drawable.smileyblack);


    Calendar c = Calendar.getInstance(); // Get current time
    hr1 = c.get(Calendar.HOUR_OF_DAY); // Gets the current hour of the day ( from 1 to 24 )

    startAlarm();

    if (hr1 < 12) {
            findViewById(R.id.img1).startAnimation(shakeimage);

            msg_txt.setText("Good morning!");
            alarmname_txt.setText(alarm.getAlarmName());

        } else if(hr1 > 12 && hr1 < 17) {
            findViewById(R.id.msg_txt).startAnimation(shake);
            findViewById(R.id.img1).startAnimation(shakeimage);
            msg_txt.setText("Good afternoon!");
            alarmname_txt.setText(alarm.getAlarmName());

        } else if(hr1 > 17 && hr1 < 20) {

            findViewById(R.id.img1).startAnimation(shakeimage);
            msg_txt.setText("Good evening!");
            alarmname_txt.setText(alarm.getAlarmName());

        } else {
            findViewById(R.id.msg_txt).startAnimation(shake);
            msg_txt.setText("Good night!");
            alarmname_txt.setText(alarm.getAlarmName());

        }


    can1.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            finish();

        }
    });

    snoozebtn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Calendar c1 = Calendar.getInstance(); // Get current time
            long getTimeaftertenminute = c1.getTimeInMillis() + 5000;

            Intent myIntent = new Intent(getApplicationContext(), AlarmAlertBroadcastReciever.class);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(),  1, myIntent,PendingIntent.FLAG_CANCEL_CURRENT);
            AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
            alarmManager.set(AlarmManager.RTC_WAKEUP, getTimeaftertenminute,pendingIntent );

            Toast.makeText(getApplicationContext(), "Snoozed for 30 sec ", Toast.LENGTH_LONG);

            finish();
        }

    });

}

@Override
protected void onResume() {
    super.onResume();
    alarmActive = true;
}

private void startAlarm() {
    if (alarm.getAlarmTonePath() != "") {
        mediaPlayer = new MediaPlayer();
        if (alarm.getVibrate()) {
            vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
            long[] pattern = { 1000, 200, 200, 200 };
            vibrator.vibrate(pattern, 0);
        }
        try {
            mediaPlayer.setVolume(1.0f, 1.0f);
            mediaPlayer.setDataSource(this,
                    Uri.parse(alarm.getAlarmTonePath()));
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
            mediaPlayer.setLooping(true);
            mediaPlayer.prepare();
            mediaPlayer.start();

        } catch (Exception e) {
            mediaPlayer.release();
            alarmActive = false;
        }
    }

}

@Override
public void onBackPressed() {
    if (!alarmActive)
        super.onBackPressed();
}

@Override
protected void onDestroy() {
    try {
        if (vibrator != null)
            vibrator.cancel();
    } catch (Exception e) {

    }
    try {
        mediaPlayer.stop();
    } catch (Exception e) {

    }
    try {
        mediaPlayer.release();
    } catch (Exception e) {

    }
    super.onDestroy();
}
请使用设置报警时给出的相同编号编辑示例代码中的sameid变量。这将取消报警并设置新的报警

正如您的logcat所建议的,在AlarmAlertActivity的onCreate方法中,您试图访问的对象一定是空的

请将AlarmAlertActivity粘贴到创建方法上


希望有帮助:)。

获取运行时异常,即无法启动活动alarmactivity,java.lang.NullPointerException问题中粘贴您的日志猫添加日志猫详细信息请检查您的menifest活动不得声明。如果还有一些呃
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), sameid, myIntent,PendingIntent.FLAG_CANCEL_CURRENT);

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

    alarmManager.set(AlarmManager.RTC_WAKEUP, getTimeaftertenminute,pendingIntent );