web-dev-qa-db-fra.com

Définir le réveil Android par programme

J'essaie de créer une application personnelle qui définira des alarmes dans l'application DeskClock. Je peux le faire régler des alarmes pour n'importe quel moment de la journée, mais comment pourrais-je régler une alarme pour le lendemain ou plus tard dans la semaine. En regardant à travers l'api AlarmClock sous Android, je ne vois pas de façon normale de le faire. Est-ce seulement possible?

Btw c'est mon code pour régler l'alarme, il n'est peut-être pas beau, mais j'apprends au fur et à mesure.

 package com.netwokz.setit;

    import Java.util.Calendar;
    import Java.util.GregorianCalendar;

    import Android.app.Activity;
    import Android.content.Intent;
    import Android.os.Bundle;
    import Android.provider.AlarmClock;
    import Android.view.Menu;
    import Android.view.View;
    import Android.view.View.OnClickListener;
    import Android.widget.Button;
    import Android.widget.EditText;

    public class MainActivity extends Activity implements OnClickListener {
    Button btnSetAlarm;
    EditText etHour, etMinute;
    int minute, hour, day;
    Calendar cal;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);
        btnSetAlarm = (Button) findViewById(R.id.btn_set_alarm);
        etHour = (EditText) findViewById(R.id.etHour);
        etMinute = (EditText) findViewById(R.id.etMinute);
        btnSetAlarm.setOnClickListener(this);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_activity, menu);
        return true;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_set_alarm:
                setAlarm();
                break;
        }
    }

    private void setAlarm() {
        cal = new GregorianCalendar();
        cal.setTimeInMillis(System.currentTimeMillis());
        day = cal.get(Calendar.DAY_OF_WEEK);
        hour = cal.get(Calendar.HOUR_OF_DAY);
        minute = cal.get(Calendar.MINUTE);

        Intent i = new Intent(AlarmClock.ACTION_SET_ALARM);
        i.putExtra(AlarmClock.EXTRA_HOUR, hour + Integer.parseInt(etHour.getText().toString()));
        i.putExtra(AlarmClock.EXTRA_MINUTES, minute + Integer.parseInt(etMinute.getText().toString()));
        i.putExtra(AlarmClock.EXTRA_SKIP_UI, true);
        startActivity(i);
    }
}
9
netwokz

MainActivity.Java

public class MainActivity extends Activity {

    TimePicker myTimePicker;
    Button buttonstartSetDialog;
    TextView textAlarmPrompt;
    TimePickerDialog timePickerDialog;

    final static int RQS_1 = 1;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textAlarmPrompt = (TextView) findViewById(R.id.alarmprompt);

        buttonstartSetDialog = (Button) findViewById(R.id.startAlaram);
        buttonstartSetDialog.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                textAlarmPrompt.setText("");
                openTimePickerDialog(false);

            }
        });

    }

    private void openTimePickerDialog(boolean is24r) {
        Calendar calendar = Calendar.getInstance();

        timePickerDialog = new TimePickerDialog(MainActivity.this,
                onTimeSetListener, calendar.get(Calendar.HOUR_OF_DAY),
                calendar.get(Calendar.MINUTE), is24r);
        timePickerDialog.setTitle("Set Alarm Time");

        timePickerDialog.show();

    }

    OnTimeSetListener onTimeSetListener = new OnTimeSetListener() {

        @Override
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

            Calendar calNow = Calendar.getInstance();
            Calendar calSet = (Calendar) calNow.clone();

            calSet.set(Calendar.HOUR_OF_DAY, hourOfDay);
            calSet.set(Calendar.MINUTE, minute);
            calSet.set(Calendar.SECOND, 0);
            calSet.set(Calendar.MILLISECOND, 0);

            if (calSet.compareTo(calNow) <= 0) {
                // Today Set time passed, count to tomorrow
                calSet.add(Calendar.DATE, 1);
            }

            setAlarm(calSet);
        }
    };

    private void setAlarm(Calendar targetCal) {

        textAlarmPrompt.setText("\n\n***\n" + "Alarm is set "
                + targetCal.getTime() + "\n" + "***\n");

        Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(
                getBaseContext(), RQS_1, intent, 0);
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(),
                pendingIntent);

    }  
}

Reciver.Java

public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context k1, Intent k2) {
        // TODO Auto-generated method stub
         Toast.makeText(k1, "Alarm received!", Toast.LENGTH_LONG).show();

    }

}

main_activity.xml

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical"
    Android:padding="10dp" >

    <Button
        Android:id="@+id/startAlaram"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:text="Set Alaram Time" />

    <TextView
        Android:id="@+id/alarmprompt"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:textColor="#000000" />

</LinearLayout>

Manifest.xml

<application
        Android:icon="@drawable/ic_launcher"
        Android:label="@string/app_name"
        Android:theme="@style/AppTheme" >
        <activity
            Android:name=".MainActivity"
            Android:label="@string/title_activity_main" >
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />

                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
         <receiver Android:name=".AlarmReceiver" Android:process=":remote" />
    </application>
26
KeTaN

Comme un vrai réveil, je ne vois pas le moyen de définir une alarme pour une date ultérieure. Je pense que cela nécessite l'une des deux options suivantes: 

  1. Une combinaison de AlarmManager (pour déclencher un service d'application à la date future souhaitée pour créer l'alarme dans AlarmClock), puis de AlarmClock (pour gérer réellement l'alarme). N'oubliez pas d'écouter l'émission BOOT_COMPLETED pour réinitialiser les alarmes de AlarmManager car elles ne persistent pas après un redémarrage.

  2. Utilisez AlarmManager pour déclencher un service d'application et une interface utilisateur simulant une alarme. Cela nécessitera que vous considériez l'état du téléphone et d'autres choses qui ne vous inquiètent pas avec AlarmClock.

Je pense que vous pouvez faire en sorte que votre application ouvre simplement la boîte de dialogue AlarmClock qui permet à l'utilisateur de définir des alarmes récurrentes et d'autres options que vous ne pouvez pas exécuter avec l'intention.

2
capitalf

Que diriez-vous d'essayer une intention en attente?

Il suffit de changer la valeur du calendrier quelques jours à l’avance?

AlarmManager am = (AlarmManager)getSystemService(alarm);

Intent i= new Intent("MY_INTENT");
PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.MINUTE, 2);
am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pi);
0
Hiny